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



指UDP。有些人会建议每个客户端使用单个端口(从而绑定套接字),如示例。《雷神之锤3》更适合缓冲传入流。我不太相信这个。

难道不是要靠自己的代码来确保这些缓冲区的内容不断被消耗吗?在我的服务器上,我计划每秒执行20-30次,如果我的客户机以相同的速率推出数据包,我看不出缓冲有什么问题。一般情况下,我的数据包的长度将达到1024字节。我最多有4个或8个客户。我从许多来源了解到(例如……)这个答案),Windows上的默认缓冲区大小是8k。所以在我看来,对于4个客户来说,这应该是可以的。虽然我想我可能需要提高缓冲区大小有些,我不确定是否有任何陷阱,虽然我知道这是通过setsockopt()完成的。

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

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

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

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

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

最新更新