|
|
导航: |
论坛 -> 网络通讯
斑竹:liumazi,sephil |
|
作者: |
|
2022/11/17 17:06:28 |
标题: |
用tidtcpserver和tidtcpclient发送结构体失败! |
浏览:1012 |
|
加入我的收藏 |
楼主: |
我用tidtcpclient向tidtcpserver用TIdBytes方式发送结构体时服务端没有收到正确消息并且客户端自动断开连接了,很简单的代码,却找不到问题所在,请大神指点,客户端和服务端打包放在附件了,谢谢! 结构体 TCommandInfo=record CommandName, ClientIP, Params:string; end; 客户端 procedure TForm1.btn1Click(Sender: TObject); var CI:TCommandInfo; begin CI.CommandName:='命令1'; CI.ClientIP:='192.168.1.5'; CI.Params:='112233'; idtcpclnt1.IOHandler.Write(RawToBytes(CI,SizeOf(CI))); end; 服务端 procedure TForm1.idtcpsrvr1Connect(AContext: TIdContext); begin mmo1.Lines.Add('客户端连接:' + AContext.Binding.PeerIP); end;
procedure TForm1.idtcpsrvr1Disconnect(AContext: TIdContext); begin mmo1.Lines.Add('客户端断开:' + AContext.Binding.PeerIP); end;
procedure TForm1.idtcpsrvr1Execute(AContext: TIdContext); var buf:TIdBytes; CI:TCommandInfo; begin AContext.Connection.IOHandler.ReadBytes(buf,SizeOf(CI)); BytesToRaw(buf, CI, SizeOf(CI)); mmo1.Lines.Add(CI.CommandName); mmo1.Lines.Add(CI.ClientIP); mmo1.Lines.Add(CI.Params); AContext.Connection.IOHandler.InputBuffer.Clear; end;
----------------------------------------------
|
作者: |
|
2022/11/17 18:04:33 |
1楼: |
你可以把string理解为指针
----------------------------------------------
-
|
作者: |
|
2022/11/17 18:28:23 |
2楼: |
结构体变量需为定长的
----------------------------------------------
-
|
作者: |
|
2022/11/18 2:04:05 |
3楼: |
TCommandInfo=record CommandName, ClientIP, Params:string; end;
你试试 SizeOf(TCommandInfo) 就知道问题所在了。
原因:你的那个参数是 string 类型,在结构体里面,仅仅保存了这个 string 的引用(1楼说你可以理解为指针,它还真就是一个指针);
解决办法:这里定义为一个定长的 TBytes 或者 TIdBytes;
如果你非要用 string,可以考虑 string[50] 这样的声明试试。
另外,你看看你用的 RawToBytes 这个函数的实现,它基本上就是把结构体的内容(SizeOf 这个大小的内存数据块)给复制到它返回的 TidBytes 里面。
----------------------------------------------
-
|
|