DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: zlyscuicui
今日帖子: 16
在线用户: 5
导航: 论坛 -> 网络通讯 斑竹:liumazi,sephil  
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
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;
此帖子包含附件:cenunus_2022111717543.rar 大小:5.37M
----------------------------------------------
作者:
男 bamboocaep (bamboocaep) ★☆☆☆☆ -
普通会员
2022/11/17 18:04:33
1楼: 你可以把string理解为指针
----------------------------------------------
-
作者:
男 glings (glings) ★☆☆☆☆ -
普通会员
2022/11/17 18:28:23
2楼: 结构体变量需为定长的
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
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 里面。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行82.03125毫秒 RSS