Sockets 每个客户端一个端口的利弊?

Sockets 每个客户端一个端口的利弊?,sockets,networking,udp,ports,Sockets,Networking,Udp,Ports,指的是UDP。有人建议,如《地震III》中所示,每个客户机都有一个端口(并因此绑定了套接字),这对于缓冲传入流来说会更好。我不能完全肯定我会买这个 要确保这些缓冲区的内容不断被消耗,难道不是要依靠自己的代码吗?在我的服务器上,我计划每秒执行20-30次,如果我的客户机以同样的速率推出数据包,我看不出缓冲是一个什么问题。FWIW,我的数据包长度将达到1024字节。我会有4个或最多8个客户。我从许多来源(例如)了解到Windows上的默认缓冲区大小是8k。所以在我看来,有4个客户,这通常是可以的。。

指的是UDP。有人建议,如《地震III》中所示,每个客户机都有一个端口(并因此绑定了套接字),这对于缓冲传入流来说会更好。我不能完全肯定我会买这个


要确保这些缓冲区的内容不断被消耗,难道不是要依靠自己的代码吗?在我的服务器上,我计划每秒执行20-30次,如果我的客户机以同样的速率推出数据包,我看不出缓冲是一个什么问题。FWIW,我的数据包长度将达到1024字节。我会有4个或最多8个客户。我从许多来源(例如)了解到Windows上的默认缓冲区大小是8k。所以在我看来,有4个客户,这通常是可以的。。。虽然我想我可能需要稍微增大缓冲区大小,但我不确定是否存在任何缺陷,尽管我知道这是通过
setsockopt()完成的

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

我还想说,如果你说的是每秒8*30个数据包(240个数据包/秒),那么除非你是在20世纪80年代的计算器上运行,否则你不需要担心缓冲性能

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

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


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

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

我还想说,如果你说的是每秒8*30个数据包(240个数据包/秒),那么除非你是在20世纪80年代的计算器上运行,否则你不需要担心缓冲性能

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

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

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