游戏服务器TCP网络套接字 - 公平

时间:2014-03-08 22:58:46

标签: sockets networking tcp

我正在为回合制游戏编写游戏服务器。一个标准是游戏需要对所有玩家尽可能公平。

到目前为止它的工作原理如下:

  • 每个客户端都有一个TCP连接。 (如果相关,则通过WebSockets打开连接)
  • 运行时,通过epoll不断检查传入的套接字消息。
  • 通过准备阅读的套接字遍历客户端:
    • 阅读来自客户端的所有消息。
    • 更新每封邮件的内部游戏状态。
    • 将外发邮件排队到受影响的客户端。
  • 在每个“窗口”结束时(转弯):
    • 通过客户端迭代并将所有排队的外发邮件写入其套接字

我对公平的关注提出了以下问题:

我向客户发送消息的顺序是否重要?

  • 在我的程序上调用所有套接字上的write()只需要几分之一秒,但是如果我对客户端列表进行排序,它会在底层操作系统或网络中的某个地方产生影响吗?
    • 也许我应该先向最高延迟的客户发送?

如何将外发消息写入套接字是否重要?

  • 目前我把它们写成一个大块。大小可以超过单个数据包。
    • 如果我以比1个数据包更小的块发送消息,客户端是否会更快开始处理?
    • 一次为每个客户端编写1个数据包是否更好,并多次遍历客户端?

是否有任何可以对此产生影响的Linux /网络配置?

提前感谢您的反馈和提示。

1 个答案:

答案 0 :(得分:1)

  

我向客户发送消息的顺序是否重要?

是的,几分之一毫秒。如果网络接口可用于发送操作系统将立即开始发送。为什么要等?

  

也许我应该先向最高延迟的客户发送?

我认为你应该随机发送。在发送之前随机播放列表。这样做很公平。我认为你的问题是有效的,应该加以解决。

  

目前我把它们写成一个大块。 [...]

首先,要意识到TCP是基于流的,并且协议级别没有数据包/消息。在物理层面上,数据确实是打包的。

没有必要手动拆分数据包,因为客户端无论如何都会读取数据。如果客户端发出读取,则在第一个数据包到达后,该读取将立即完成。操作系统中没有人工等待。

  

是否有任何可以对此产生影响的Linux /网络配置?

我不知道。一定要禁用唠叨。