Multithreading 网络编程与多套接字

Multithreading 网络编程与多套接字,multithreading,performance,sockets,networking,Multithreading,Performance,Sockets,Networking,我想开发一个游戏服务器(不是mmo服务器,而是一个可以同时处理许多游戏实例的服务器,就像许多国际象棋派对一样) 我猜想一次在多个套接字上管理(对于服务器)客户端重新分区可能会很有趣。这样做有兴趣吗 例如: 端口1234上有5个游戏实例 端口1235上有5个游戏实例 等等 我在考虑防火墙。防火墙可以更快地处理同一端口上的巨大流量,还是可以更快地处理多个端口上的小流量?诸如此类,这种行为在不同的防火墙上可以改变吗?(iptables,其他?) 我们可以通过在多个套接字中分离通信量来优化带宽吗?或者,

我想开发一个游戏服务器(不是mmo服务器,而是一个可以同时处理许多游戏实例的服务器,就像许多国际象棋派对一样)

我猜想一次在多个套接字上管理(对于服务器)客户端重新分区可能会很有趣。这样做有兴趣吗

例如:

端口1234上有5个游戏实例
端口1235上有5个游戏实例
等等

我在考虑防火墙。防火墙可以更快地处理同一端口上的巨大流量,还是可以更快地处理多个端口上的小流量?诸如此类,这种行为在不同的防火墙上可以改变吗?(iptables,其他?)

我们可以通过在多个套接字中分离通信量来优化带宽吗?或者,将所有通信量放在同一个套接字中也没关系,这样做会产生相同的结果吗

您认为多端口网络可以为客户端提供更好的延迟吗

安全收益?如果在服务器上发现了一个问题,而不是一个可以提供根访问权限的问题,那么黑客只需几个人就可以作弊,因为流量在许多不同的套接字上都受到了影响

你认为它能带来我不认为的东西吗(当然不是编程的困难)


感谢您的回复。

我的直觉是,在每场游戏中使用专用端口会降低服务器的速度。最好只有一个端口,并在应用程序级协议中表示游戏

它还将您的游戏限制在64K左右,并且可能会带来地址重用问题。另一方面,我也看不出它有什么好处;老实说,这看起来像是不必要的复杂性

我是这本书的作者,所以我的直觉被认为是权威性的,但不是权威性的


在应用程序级别指定游戏还可以更容易地在应用程序级别的同一连接上进出游戏和大厅。

我的直觉是,在每个游戏中使用专用端口会降低服务器的速度。最好只有一个端口,并在应用程序级协议中表示游戏

它还将您的游戏限制在64K左右,并且可能会带来地址重用问题。另一方面,我也看不出它有什么好处;老实说,这看起来像是不必要的复杂性

我是这本书的作者,所以我的直觉被认为是权威性的,但不是权威性的


在应用程序级别指定游戏还可以更方便地在应用程序级别的同一连接上进出游戏和大厅。

问题到底是什么

在Linux上,您需要一个多路复用套接字系统调用,如(或
ppoll
pselect


您的担心可能与

问题到底是什么

在Linux上,您需要一个多路复用套接字系统调用,如(或
ppoll
pselect


您的问题可能与分离流量不一定会提高网络处理性能有关。仅仅因为您分配了更多的网络资源,并不意味着它将提高总体性能,因为您很可能会遇到瓶颈问题。如果您只使用单线程,您可能有多个端口,但仍然存在性能问题;相反,如果您为该套接字使用多个线程(例如线程池)(使用epoll、kqueue、IOCP等),则可能有单端口,并且具有非常好的经验证的性能。这完全取决于您分配的资源总量。我强烈建议您在服务器上使用异步套接字,可以是用于unix的epoll和kqueue(用于linux的epoll,用于freeBSD的kqueue),也可以是用于Windows的IOCP。它们具有最佳的性能周期。

分离流量并不一定会提高网络处理的性能。仅仅因为您分配了更多的网络资源,并不意味着它将提高总体性能,因为您很可能会遇到瓶颈问题。如果您只使用单线程,您可能有多个端口,但仍然存在性能问题;相反,如果您为该套接字使用多个线程(例如线程池)(使用epoll、kqueue、IOCP等),则可能有单端口,并且具有非常好的经验证的性能。这完全取决于您分配的资源总量。我强烈建议您在服务器上使用异步套接字,可以是用于unix的epoll和kqueue(用于linux的epoll,用于freeBSD的kqueue),也可以是用于Windows的IOCP。他们有最好的表现期。

我不想在每个端口上玩一场游戏,而是在每个端口上玩很多游戏。但是我不知道把200000个游戏(仅仅是一个仲裁示例)放在同一个端口上是否会改变性能。如果我把200个游戏重新发送到1000个端口上(同样只是另一个任意示例)@EJP例如,在一个TCP套接字上接受,比如说,n个传入连接调用accept()n次,然后再次调用accept()再次获取。在n个TCP套接字上接受这n个传入连接是调用accept()n次以接受它们,再调用n次以再次获取。我链接到我的证书,这是我进行微观基准测试的事情。我假设IO是异步的;如果你在一个线程中阻塞IO,那么当没有更多的东西可以接受时,线程切换的成本会高得多still@Will这并不能回答我的问题。无论连接来自哪个端口,都必须接受连接,而且我不明白当
select()
函数可用时,为什么您要为N x EAGAIN申请费用。我不想每个端口使用一个游戏,但每个端口使用多个游戏。但是我不知道把200000个游戏(仅仅是一个仲裁示例)放在同一个端口上是否会改变性能。如果我把200个游戏重新发送到1000个端口上(同样只是另一个任意示例)@EJP例如,在一个TCP套接字上接受,比如说,n个传入连接调用accept()n次,然后再次调用accept()再次获取。接受n TCP上的n个传入连接