BCB Socket接收数据分包问题

pig4210 2008-08-30 05:31:59
  在csRead(TObject *Sender, TCustomWinSocket *Socket)中使用Socket->ReceiveBuf(recv_data,max_datalen);接收数据,发现本来应该一次性接收的数据被BCB自做主张分成两个包,第一个包大小1388,第二个包18.本来数据大小应为1404的。
  我查了winSocket2.h里的SO_RCV... 接收缓冲区大小为0x1002,那么,为什么第一次只收到1388就被截断了?用setsocketopt函数也没有效果。
  我不想自行拼接包,怎么办?如何让Socket把一个完整的包recv过来?
...全文
186 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pig4210 2008-09-04
  • 打赏
  • 举报
回复
谢谢大家的建议,我自行解决了包拼接。以前收发的都是小数据,所以一直以为收到的包就是完整的,没有遇到过这种问题。
fangsp 2008-09-02
  • 打赏
  • 举报
回复
TCP是流,只保证数据顺序和不丢失,不保证消息边界.
你发10次数据对方可能一次就都接收完了.
也有可能你发一次,对方接受了N次才接收完
所以你得自己做标记分包

关于数据包接收问题,Socket自主分包是无法控制的
唯有在接收到包后自己进行拼凑,所以需通过自定义一个包协议来管理,我觉得比较好点

建议:你可以自定一个收发数据的协议帧 ,有固定的帧头,帧尾,和帧的长度,这样就可以很轻松的进行通信了
tangx100 2008-09-01
  • 打赏
  • 举报
回复
关于数据包接收问题,Socket自主分包是无法控制的
唯有在接收到包后自己进行拼凑,所以需通过自定义一个包协议来管理,我觉得比较好点
queshiybb 2008-08-31
  • 打赏
  • 举报
回复
顶顶
  • 打赏
  • 举报
回复
TCP是流,只保证数据顺序和不丢失,不保证消息边界.
你发10次数据对方可能一次就都接收完了.
也有可能你发一次,对方接受了N次才接收完
所以你得自己做标记分包
pig4210 2008-08-30
  • 打赏
  • 举报
回复
或者,怎么得知这个包不完整?

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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