我这篇文章说一个Socket的小技巧,另外咨询一个问题
这些天重点攻打Socket
以前总觉得Socket编程应该比较容易,也做过简单的Socket程序。
但真正要应用时,发现有很大问题!
我用C#语言
我这个程序用到的Socket也不算多。大概50个Socket客户端连接到internet上不同服务器上,用的是TCP协议。数据传输内容是一些琐碎的包,总共用到网络带宽大概512bps。
问题产生在数据延迟上了,程序对数据包的延迟要求很高,要求延迟平稳不跳动。程序每发送一个请求后,到从服务器接受到的反馈数据时间差要求基本一致。此外,程序还不停接受从服务器发送来的一些信息。
当开启几个Socket的时候,效果非常好,实时性很高,延迟稳定
但开到40个Socket的时候(每个socket连接不同服务器),就完全不一样了。发送请求后,接收到服务器响应的数据包的时间差距很大。从100ms~10000ms不等。这对于我的程序完全是个灾难!!!
在查询很多资料后,终于知道微软有个nagle算法。为了有效利用带宽,nagle算法会使得Socket发送短数据包尽量合并发送,就产生一个延迟。
使用socket.SetSocketOption(SocketOptionLevel.TCP,SocketOptionName.NoDelay,1)可以关闭nagle算法。这样发出的数据包就立刻出发了!~~ :)
程序性能终于有所改善,但还是有问题
数据包延迟从原来的100ms~10000ms变为100ms~2000ms了。这个延迟对我仍然是灾难。而ping的时间是比较稳定的40~60ms
这个就是我要向大家咨询的问题了
我也做了个测试,几台电脑通过一个电脑共享Internet连接,然后在这几台电脑上分别运行我的程序。发现延迟与所有电脑总连接数没有关系,只与当前电脑上连接数量有关。当前电脑连接越多,延迟越不稳定!!~~~如果当前电脑只有一个连接,其他电脑不管开多少连接都不会影响到这台电脑上程序的稳定!!~~~
这是什么原因呢?应该如何解决呢?
谢谢大家
闪电猪 2006-05-07 11:54
文章来源:
http://foreverpk.cnblogs.com/archive/2006/05/07/393129.html