csoket编程时发送和接收不对应的问题

leekyo 2002-05-08 05:21:05
我在csoket编程时,用一个send()发包过去,有时却触发了两次onreceive()响应,结果是数据包被分成两个包接收了,我想能不能让它一次就接收完,不然我的接收程序不好编,按理说他的接收缓冲应该够大小的,怎么会分包了呢?怎么解决呢?
...全文
59 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
vtable9999 2002-05-09
  • 打赏
  • 举报
回复
对于CSocket来说,如果在OnReceive中,把缓存的数据都读完,即使数据包大于8192,也只有一个OnReceive。但其实在CSocket的OnSockNotify中是有多个FD_READ的,不过都被DoCallBack过滤了。

你可以用CSocketFile、CArchive解决你的问题,也不就像xuying() 说的实现自己的报文格式
xuying 2002-05-08
  • 打赏
  • 举报
回复
TCP协议是流式的,当然会可能触发多次onreceive()。
如果想简单的话,改成UDP协议。它是数据报的,一次接收一个报文。
否则就要自己定义报文格式,用结构等接受。

建议看看<windows网络编程>
leekyo 2002-05-08
  • 打赏
  • 举报
回复
我的程序用的是csocket,在win98下有时17520字节也不分包,有时坟包
Delver 2002-05-08
  • 打赏
  • 举报
回复
解决的方法:改成同步调用recv,如果你的数据包的长度是固定的,是要使用MSG_WAITALL标志即可;但如果数据包是变长的,则需要定义一个包头,在包头中指明包的长度,先用recv接受包头,然后再根据包的长度收取数据部分,当然也需要使用MSG_WAITALL。
vtable9999 2002-05-08
  • 打赏
  • 举报
回复
to game_boy(gamesboy):
数据包大于MTU是会分包,便对于winsock来说,不一定产生多次OnRecevie事件。只有数据包大于8192(winsock默认的缓存大小)时才会有多次OnReceive事件。
vtable9999 2002-05-08
  • 打赏
  • 举报
回复
不清楚你问题的原因,但你可以用CSocketFile加CArchive解决你的问题
PingPingPangPang 2002-05-08
  • 打赏
  • 举报
回复
你发的太大,以太网包长度1600字节,打成IP包,还要去掉IP头和TCP头,剩下1540字节,你如果超过这么多就会分包。
game_boy 2002-05-08
  • 打赏
  • 举报
回复
你发的数据有多大,你的网络MTU有多大呢?如果数据大于网络的MTU,肯定会被分片的
Aydge 2002-05-08
  • 打赏
  • 举报
回复
我不懂编程的,但数据被分包想来是因为传出中的分开了啊
我想假设“一个send()发送的内容会一次被onreceive()接收完”是一个错误。socket每次通讯量有字节数限制的吧

4,387

社区成员

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

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