0

我正在开发一个简单的多人在线文本游戏,我阅读select()并且poll()是多路复用 I/O 的流行方法。

在 GNU C 文档中找到了这个例子,它使用select. 我运行它并制作了 3 个如下所示的 Python 测试客户端:

import socket
import time

port = 5555
test = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
test.connect(('localhost', port))

while 1:
    test.send('aaaa')
    time.sleep(0.5)

aaaa然后我用不同的字符串(55和)运行客户端(从运行服务器的同一台计算机..)。

服务器的输出是

Server: got message: `aaaa'
Server: got message: `55aa'
Server: got message: `aaaa'
Server: got message: `55aa'
Server: got message: `..aa'

琴弦越来越乱。

这是某种愚蠢的编译错误,我的测试客户端中的错误还是我在同一台计算机上运行客户端和服务器的事实?还是这个程序告诉我我不应该select为此目的使用?考虑到我会将它用于多人游戏服务器(每秒可能会收到很多消息),我认为我不能让消息混淆。

4

1 回答 1

1

客户端和服务器是完全异步的。您不知道哪个会占用 CPU 时间以及按什么顺序。网络也不保证交付顺序(尽管 TCP 将确保应用程序按照发送顺序查看来自单个客户端的数据)。

选择/轮询返回有数据要读取的套接字列表。请确保在再次调用 select/poll 之前阅读所有内容,否则您将优先考虑较低编号端口上的连接。

请注意,读取是原始数据,不会以任何方式终止,因此不能直接作为字符串转储,除非发送方在对其套接字的写入中包含 NUL 终止符。

于 2012-10-12T22:32:57.057 回答