我发现默认的ReceiveBufferSize(8192)对我不起作用-我丢失了数据包
Sockets: sometimes (rarely) packets are lost during receiving

但是,msdn发出有关增加BufferSize的警告:

http://msdn.microsoft.com/ru-ru/library/system.net.sockets.socket.receivebuffersize.aspx
较大的缓冲区大小可能会减少空确认(没有数据部分的TCP数据包)的数量,但也可能会延迟连接困难的识别。如果要传输大文件,或者正在使用高带宽,高延迟的连接(例如卫星宽带提供商),请考虑增加缓冲区大小。

我知道我需要每秒接收2000个数据包,每个数据报包含大约50-100字节的数据。我正在使用低延迟连接(局域网中的所有内容)。我正在从udp组播接收证券交易所数据,因此有时流量会大幅增加(雷曼兄弟破产等),但假设我每秒接收的数据包不会超过20000。

如何计算适合我需求的ReceiveBufferSize?

我绝对不同意丢失数据包,但是我也不会丢失性能,可靠性或其他任何东西。

最佳答案

没有ideal figure可以根据您提供的信息为您提供ReceiveBufferSize。
除了worse-case incoming data rate之外,还取决于rate at which you process messages以及在受到邮件轰炸时是否可以继续这样做。

如对您的问题的评论中所述,您应该在压力条件下对应用程序进行概要分析,以发现最适合您的最佳价值。

另外,您可以从ReceiveBufferSize的默认值开始,并在超过阈值时增加默认值,在这种情况下,当情况正常化时,您可能会丢失数据包并再次降低它。这种方法需要大量工作。

编辑:

平均而言,您将更快地接收到数据。但是,在某些情况下,您可能无法all the time(例如,您可能必须每收到100条消息就同步或串行地写入数据库)。在这种情况下,您必须确保缓冲区可以处理process data at all中的数据

因为在最坏的情况下,您每秒最多可以接收20k个数据包,每个数据包的大小为100个字节,因此,如果将缓冲区大小设置为2 MB(20k * 100字节),则应该可以使用大约一秒钟的at that moment.来自远端。

同样,如果您希望线程在不读取缓冲区的情况下运行的最长时间为x秒,则缓冲区大小应为without processing any data

希望这可以帮助。

08-27 14:19