参考UDP。有些人会建议每个客户端有一个端口(从而绑定套接字),如例如。 Quake III,可以更好地缓冲传入的流。我不完全确定我会买这个。
毕竟不是自己的代码来确保这些缓冲区的内容不断消耗?在我的服务器上,我计划每秒执行大约20-30次,如果我的客户以相同的速率推出数据包,我看不出缓冲是一个问题。 FWIW,我的数据包长度最多为1024字节。我有4个或最多8个客户。我从许多来源(例如this answer)了解到,Windows上的默认缓冲区大小为8k。所以对于4个客户端,这通常应该是好的,在我看来...虽然我想我可能需要稍微增加缓冲区大小,并且不确定是否有任何陷阱,尽管我知道这已经完成通过setsockopt()
。
答案 0 :(得分:0)
无论端口如何,在OS和语言中执行缓冲的代码都是相同的,因此无论是多个套接字中的多个缓冲区还是一个套接字中的一个缓冲区都没有区别。在一个端口上的一个套接字上设置较大的(N次)缓冲区将相当于N个端口上的N个缓冲区。
我还会说,如果你说的是每秒8 * 30个数据包(240个数据包/秒),那么除非你在20世纪80年代在计算器上运行它,否则你不必担心缓冲性能。
如果发送速率高于读取速率,则无论缓冲区有多大,缓冲区都将填满和丢弃数据包。缓冲区的大小只是指定延迟。
如果您有N个客户端并且它们都以20 /秒的速率发送数据包,那么您的服务器需要以最低N * 20 /秒的速率读取数据包,但实际上它实际上应该比因为机器上的时序(时钟)会有变化,特别是在负载下,所以服务器应该尝试更频繁地读取,而不是计算最小值以确保补偿,或者它应该消耗缓冲区N每秒的时间(但是经常你喜欢,只要你指定一个正确大小的缓冲区来应对)。
此外,因为您可能偶尔会得到一个延迟数据包,可能会与路径上的某个路由器中的一个或两个其他人一起进行批处理,我会说缓冲区大小设置为略大于8k(2x或3x),这样就不会从一个客户端获取3个数据包(其中2个是旧的,您将在读取时丢弃或覆盖)覆盖来自其他客户端的新数据包。