2

参考UDP。有些人会建议每个客户端有一个端口(因此绑定套接字),如例如所示。Quake III 更适合缓冲传入的流。我不完全确定我会买这个。

确保这些缓冲区的内容不断被消耗,难道不是完全取决于自己的代码吗?在我的服务器上,我计划每秒执行大约 20-30 次,如果我的客户端以相同的速率推出数据包,我看不出缓冲会有多大问题。FWIW,我的数据包长度将达到 1024 字节。我会有 4 个或最多 8 个客户。我从许多来源(例如这个答案)了解到,Windows 上的默认缓冲区大小是 8k。因此,在我看来,对于 4 个客户端,这通常应该没问题......虽然我想我可能需要稍微增加缓冲区大小,并且不确定是否有任何陷阱,尽管我知道这已经完成通过setsockopt().

4

1 回答 1

0

无论端口如何,在操作系统和语言中进行缓冲的代码都是相同的,因此无论是进入多个套接字中的多个缓冲区还是一个套接字中的一个缓冲区都没有区别。在一个端口上的一个套接字上设置一个更大(N 倍)的缓冲区相当于在 N 个端口上设置 N 个缓冲区。

我还要说,如果您谈论的是每秒 8 * 30 个数据包(240 个数据包/秒),那么除非您在 1980 年代的计算器上运行它,否则您无需担心缓冲性能。

如果发送速率高于读取速率,那么无论缓冲区有多大,缓冲区都会填满并丢弃数据包。缓冲区的大小只会指定延迟。

如果您有 N 个客户端,并且它们都以 20/秒的速率发送数据包,那么您的服务器需要至少以 N*20/秒的速率读取数据包,但实际上它应该比这更快地读取数据包,因为机器上的时间(时钟)会发生变化,特别是在负载下,因此服务器应该尝试读取比您计算的最小值更多的频率以确保它补偿它,或者它应该每秒耗尽缓冲区 N 次(无论您喜欢多频繁,只要您指定一个正确大小的缓冲区来应对)。

此外,因为您可能偶尔会收到一个延迟的数据包,该数据包可能会与沿路径的某个路由器的一两个其他数据包一起分批,我会说将缓冲区大小设置为略大于 8k(2x 或 3x),这样您就不会收到 3 个数据包已经从一个客户端(其中 2 个是旧的,您将在读取时丢弃或覆盖)批量处理,覆盖来自其他一些客户端的新数据包。

于 2011-12-29T04:40:35.113 回答