请教个socket的问题,send成功是不是数据一定发送到对方了?

zhousitiaoda 2014-05-29 02:41:09
服务端send成功后,数据是不是已经到达客户端的网卡了,或者说数据已经到达客户端的缓冲区,只要调用下recv就可以取出来了?
目前的情况是:TCP,客户端连接成功后循环recv接收文件,服务端accept后循环send,直到发完整个文件,然后close socket。有概率出现客户端快接收完的时候recv返回0,(MSDN上说是对方已经优雅的关闭了)
...全文
991 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
explor8 2016-08-30
  • 打赏
  • 举报
回复
引用 8 楼 arpnet99 的回复:
send的过程,只是把数据复制进TCP协议栈中。类似于把货物装上火车。
很好的比喻,非常容易理解。 send成功并返回多少字节,就像货站装完车已经在自己的网站上写到你的货已经派送,派送了什么货。 至于车什么时候出发,什么时候到达目的地,货站控制不了。
  • 打赏
  • 举报
回复
仅就WinSock来说,send返回不代表数据已到达对方,而代表的是Ws2_32.dll已经将数据拷贝到下层服务提供者了。
赵4老师 2014-05-30
  • 打赏
  • 举报
回复
不是
这不是鸭头 2014-05-29
  • 打赏
  • 举报
回复
send的过程,只是把数据复制进TCP协议栈中。类似于把货物装上火车。
zhousitiaoda 2014-05-29
  • 打赏
  • 举报
回复
引用 6 楼 xihu1364 的回复:
send成功了 说明已经将数据拷贝到发送缓存了,而发送缓存区的数据什么时候发,系统决定。 所以当你得到成功后,就断掉,可能会导致发送缓存的数据还没发出去 有个socket选项,关闭连接时,会将缓存全部发出去后,才关闭连接
如果选择关闭连接时,会将缓存全部发出去后,才关闭连接。 当缓存全部发出去后,关闭socket,对方应该不能再recv吧,recv的时候貌似要回复ACK给发送方。那这样做貌似也没有太大意义,不知道我理解对不
版主大哥 2014-05-29
  • 打赏
  • 举报
回复
send成功了 说明已经将数据拷贝到发送缓存了,而发送缓存区的数据什么时候发,系统决定。 所以当你得到成功后,就断掉,可能会导致发送缓存的数据还没发出去 有个socket选项,关闭连接时,会将缓存全部发出去后,才关闭连接
zhousitiaoda 2014-05-29
  • 打赏
  • 举报
回复
我想要知道的是 “send成功是不是数据一定发送到对方了”,而不是怎么做让传输更稳定。 起初我以为只要send成功了,数据就到达对方了,对方就可以直接recv获取到了,即便是发送方关闭socket,对方也能收到数据。但从查到的资料看,显示是不对的。
杀意已决 2014-05-29
  • 打赏
  • 举报
回复
返回值对了就说明send是成功了,以后的事它就不管了。 你是说发送完了,然后收到丢包了?
lx624909677 2014-05-29
  • 打赏
  • 举报
回复
可以每次在send的时候发一下数据包的大小,并且在recv的地方拿收到的数据的大小和这个发送来的数据大小进行比较,成功和失败都在recv端再次发送给send结果就可以
zhousitiaoda 2014-05-29
  • 打赏
  • 举报
回复
1L说的当然可以,但不是我想要的答案。 查了下资料,UDP本身就不是可靠的,所以send成功了也不能说明什么,TCP Send成功数据并不一定会马上离开本机,有可能会延时发送。另外即便服务端发送的数据到达客户端了,如果服务端的socket关闭了,客户端仍然不能recv到数据,貌似是因为接收时需要回复个ack给对方,但对方已经关闭了,所以不能recv。 自问自答,不知道是不是正确,再查下资料看下。
杀意已决 2014-05-29
  • 打赏
  • 举报
回复
加个确认包不行吗,收到确认包再进行下一次send

18,356

社区成员

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

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