Socket发完消息后,立即关闭连接,客户端丢失数据的问题

  使用.net编写服务器程序的时候,发现一个现象:如果服务器发完消息,立即关闭连接,客户端将无法收到服务器最后发的那条消息。个人猜想,会不会socket也有象文件流类似的缓存机制。果断利用visual studio的智能提示功能,列出socket类型的全部属性,果然发现一个叫NoDelay的属性。

  MSDN对该属性的说明如下:

  获取或设置 Boolean值,该值指定流 Socket是否正在使用 Nagle 算法。如果 Socket使用 Nagle 算法,则为 false;否则为 true。 默认值为 false。Nagle 算法设计用于减少网络流量,方法是使套接字缓冲小型数据包,然后在特定环境下以一个数据包组合并发送它们。 TCP 数据包包含 40 个字节的标头以及要发送的数据。当使用 TCP 发送小数据包时,TCP 标头所引起的开销可以占据很大一部分网络流量。 在负载较重的网络上,由这种开销导致的的拥塞情况可能会导致数据报的丢失和重新传输,以及由于拥塞导致的过长的传播时间。 当新传出数据从用户处到达时,Nagle 算法抑制发送新的 TCP 段,如果在该连接上的任何先前传输的数据仍未确认。大多数网络应用程序应使用 Nagle 算法。对用户数据报协议 (UDP) 套接字设置此属性不起任何作用。

  将这个属性设置成true后,问题解决。

转载于:https://www.cnblogs.com/ngxianyu/p/3260813.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值