使用socket的tcp方式通信接收数据的问题

sdwalnut1 2007-04-27 05:17:16
在使用socket的tcp方式接收数据时,发现有些接收到的数据是发送端两次消息内容合并后的结果。哪位知道产生这种情况的原因是什么?tcp方式是否会经常导致该问题?
...全文
298 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
vince_cici 2007-05-05
  • 打赏
  • 举报
回复
感觉都说的对

我认为也可以

自定义一个 语句终止符!~代表一块信息的结束
wmhnq 2007-05-02
  • 打赏
  • 举报
回复
包头(4byte)+包长度+保留位(4)+数据(不定)

////按照这个办法到是不错,不过传输的性能要下降很多倍。
dreamskyashion 2007-04-30
  • 打赏
  • 举报
回复
TCP是流式传输,接收的时候当然不知道要可能会接收到多少数据,再说包头和数据是同时发送的又不是分开发送
redex 2007-04-30
  • 打赏
  • 举报
回复
to 楼上:

"在接收数据的时候首先判断是否接收到了 大于 包头的数据", 你接收的时候不是先接收包头长的数据, 再接收包体?? 那么如何会"收到了大于包头的数据"???
dreamskyashion 2007-04-28
  • 打赏
  • 举报
回复
同意楼上的观点。 在接收数据的时候首先判断是否接收到了 大于 包头的数据,如果是则将该数据转换为包头,分析包头中数据长度字段,然后判断是否该包已经完全到达如果没有则继续接收直到收齐为之

另外请用 setsockopt 将 socket的TCP_NODELAY 设为TRUE
netsys2 2007-04-28
  • 打赏
  • 举报
回复
这是很正常的,TCP是个流协议,中间的分割你必须自己做!

你在设计协议时,应该确定帧格式,下面是常用的:


包头(4byte)+包长度+保留位(4)+数据(不定)

接收数据先看包头,然后根据包长度读数据,这样不管几个包发过来,你都能正确解开!
xiaozhumaomao 2007-04-27
  • 打赏
  • 举报
回复
你每次发送的时候
用一次 flush() 方法将缓冲区清空

4,358

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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