使用TCustomWinsocket时,发送数据和接收数据不一致的问题

szy2000 2002-11-03 02:53:35
在使用Bc6中TCustomWindsocket的ReceiveBuf函数接收数据时,有时经常会出现接收到的数据长度小于发送的数据长度。好像是由于Tcp数据分段引起的,而我传送的数据是自定义的格式化数据,一分段就麻烦大了,有没有什么办法能解决这个问题?有没有什么比较简单的方法,使得发一次数据,接收方只需要接收一次次就可以把数据完整的接收下来?
...全文
180 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
szy2000 2002-11-05
  • 打赏
  • 举报
回复
Thanks invalid,我按你的方法试一试
我不懂电脑 2002-11-05
  • 打赏
  • 举报
回复
如果包不是很长可以用udp
warton 2002-11-05
  • 打赏
  • 举报
回复
对,高手说的对!!
invalid 2002-11-05
  • 打赏
  • 举报
回复
不能依靠tcp来保证你的包不会被分开,如果你的报足够小tcp有可能合并你的包,所以你的结构应该是包长加包体,这样就绝对不会出错.
szy2000 2002-11-05
  • 打赏
  • 举报
回复
to bacer,我就是这么做的,问题就出在这,TCP会把报文分段,4000字节会有可能是分两次收到的,这样收到的数据就可能不是我原先定义的结构了,除非自己重新组报,但实现起来比较麻烦,有没有什么办法是报文不会分段或者合并,是不是只要使数据长度小于TCP下层协议的最大报文长度就可以了?
bacer 2002-11-03
  • 打赏
  • 举报
回复
预先将要发送的数据分配好,比如发送10次,每次4000字节
那么每次发送的时候加上当前块的编号以及总的块数就行了

说白了就是自己写一个协议,双方按照这个协议执行就可以咯
invalid 2002-11-03
  • 打赏
  • 举报
回复
比较简单的办法就是:
用socket发送接收应该定义发送的长度,每次发送数据都先发送长度,这样接收方先接收长度,然后接收数据,这样保证不会混乱.
你想什么都不做,就达到要求是不可能的.
Socket发送只是把数据交给缓冲区,至于数据到底是怎么发送,分几个包是有底层协议决定的.
szy2000 2002-11-03
  • 打赏
  • 举报
回复
不行阿,我发送的数据是二进制
webmin 2002-11-03
  • 打赏
  • 举报
回复
你用ReceiveText试试。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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