Tidtcpserver 和 tidtcpClient 控件通信时,数据包的问题

wangl 2014-01-23 05:01:21
两者通信时,用结构体(就是Record类型)作为数据包传递比较方便,但调用ReadBuffer()时,就需要给出这个结构体的Size, 我的问题是:
如果记录类型有一项是String类型,且无法固定长度,我就无法使用SizeOf()去获得结构体的长度。
当然笨办法就是将它定义的比较长,比如string[500]或更长,但终究不妥。 定义大了浪费,小了又怕不够。

请问各位有什么好办法?或者这样的应用需求有什么其他的解决办法?谢谢!
...全文
181 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangl 2014-01-25
  • 打赏
  • 举报
回复
或许是我没有理解你的意思,那我再想想。接分吧。
sololie 2014-01-23
  • 打赏
  • 举报
回复
感情上面都白说了
wangl 2014-01-23
  • 打赏
  • 举报
回复
谢谢您的回复。我SizeOf是计算结构体的Size,因此需要在定义此结构体时必须指定它下面那个string类型的项目时,必须定义其长度。你说的加一个成员记录这个长度,我也有考虑过,但如果我有几个string的成员时,那我就得定义多个记录长度的成员。当然,我可以将这些项合并成一项,然后接收方再拆分。我只是觉得有些麻烦,所以提到这里,问问大家有什么好想法。
getit911 2014-01-23
  • 打赏
  • 举报
回复
Record里不能用string,string其实是个指针,里面用byte数组,配合一个size变量来指出数据长度。
sololie 2014-01-23
  • 打赏
  • 举报
回复
不过有一点LZ要搞清楚,string类型是一个指针,s:string s 是一个32位指针变量,占4字节。你sizeof(s)就是4,而不是这个字符串的内存占用数。 再一个,要想知道一个字符串的串长度可以 lenght(s), string的内存占用比较复杂,如果是一个非空的string,它还会在负偏移处占用8个字节,前4字节保存引用计数,后4字节保存字串长度。所以在一个非空的string下,pint(integer(s)-4)^这样也等同于 lenght(s)。不管怎么说还不要在结构体中使用string,如果字串长度不大可以用shortstring,长度是256。兼容性最好的是数组,可以用动态数组,在给结构体赋值时再动态决定该数组的长度,也就不会有浪费。pchar也是可以的,在结构体中记得加个成员保存字串长度。
sololie 2014-01-23
  • 打赏
  • 举报
回复
在结构体中再加一个成员保存字符串的长度 另外最好不要用string类型,用pchar,同样结构体中加个成员记录pchar长度

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧