请教一个小问题, WSASend 发送数据包问题

tlbbsff 2019-01-18 01:34:06
在单个线程,注意:只有一个线程调用WSASend, 然后不停的发数据包
客户端因为网络原因可能会接收比较慢

问题1:
WSASend 第一次发送的文字是:1, 第二次发送的文字是:2,第三次是:3



问题2:
WSASend 会确保客户端怎么能确保按照顺序接收,第一次接收是1,第二次接收是2,
客户端会不会先接收2,后接收3?

客户端有可能会一次性接收123吗?

注:客户端就是普通的单线程接收 调用一个::recv(),不会去用什么重叠
...全文
474 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2019-02-02
  • 打赏
  • 举报
回复
引用 楼主 tlbbsff 的回复:
在单个线程,注意:只有一个线程调用WSASend, 然后不停的发数据包
客户端因为网络原因可能会接收比较慢

问题1:
WSASend 第一次发送的文字是:1, 第二次发送的文字是:2,第三次是:3
问题2:
WSASend 会确保客户端怎么能确保按照顺序接收,第一次接收是1,第二次接收是2,
客户端会不会先接收2,后接收3?
客户端有可能会一次性接收123吗?
注:客户端就是普通的单线程接收 调用一个::recv(),不会去用什么重叠


客户端是有可能一次接收到123的
原因是tcp是基于流的
赵4老师 2019-01-24
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
tiger波波 2019-01-22
  • 打赏
  • 举报
回复
我的理解是WSASend不会确保客户端按照顺序接收,但TCP或UDP协议可以,协议就是专门干这些事的,保证数据的顺序性,完整性,正确性。WSASend最开始的动作应该是把你的数据拷贝到发送缓冲区,只要你按顺序发,内存拷贝就是顺序的
tlbbsff 2019-01-19
  • 打赏
  • 举报
回复
引用 5 楼 smwhotjay 的回复:
send 1成功后 再send 2 就保证顺序了

send 1成功后 再send 2 就保证顺序了


老哥,你怎么老是答非所问?
tlbbsff 2019-01-18
  • 打赏
  • 举报
回复

send 1成功后 再send 2 就保证顺序了 [/quote]


老哥,你怎么老是答非所问?




在不失败的情况下可以保证是顺序收到, 但是可能会是同时受到123, 粘包是必须要考虑的

谢谢你,那么如果,客户端先接收1字节,在接收剩余的部分,会乱序吗?
此时没有接收数据是在什么位置,在内存?还是在windows内核?



[/quote]
smwhotjay 2019-01-18
  • 打赏
  • 举报
回复
send 1成功后 再send 2 就保证顺序了
zgl7903 2019-01-18
  • 打赏
  • 举报
回复
在不失败的情况下可以保证是顺序收到, 但是可能会是同时受到123, 粘包是必须要考虑的



tlbbsff 2019-01-18
  • 打赏
  • 举报
回复
引用 1 楼 smwhotjay 的回复:
多线程同时send一个socket,你无法保证数据顺序了。WSASend 一样。


我说的是单线程,可以保证顺序一致吗?
tlbbsff 2019-01-18
  • 打赏
  • 举报
回复
我说的是单线程,可以保证顺序一致吗?
smwhotjay 2019-01-18
  • 打赏
  • 举报
回复
多线程同时send一个socket,你无法保证数据顺序了。WSASend 一样。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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