2

我读过 Winsock 上的 send() 函数会阻塞,直到收到最后一个数据包的 ACK。现在我正在使用服务器进行回合制角色扮演游戏。一切都由一个线程处理(对于 64 个套接字)。接收、处理请求并将响应写入套接字。这个过程不能中断。

是否可以使用这种方法处理 1000 个客户端(每 64 个套接字一个线程)?

如果 send() 完成时间过长或者客户端恶意不发送 ACK 或连接中断,它不会阻塞整个服务器吗?

我应该将网络和请求处理的逻辑拆分为 2 个线程吗?如果是这样,处理网络传输的线程仍然可能被 send() 或 recv() 阻塞。

还是最好使用重叠 I/O?

4

2 回答 2

3

send()仅当套接字以阻塞模式运行并且套接字的出站缓冲区填满排队数据时才阻塞。如果您在同一线程中管理多个套接字,请不要使用阻塞模式。如果一个接收器没有及时读取数据,可能会导致该线程上的所有连接都受到影响。改用非阻塞模式,然后send()当套接字进入阻塞状态时会报告,然后你可以使用select()检测套接字何时可以再次接受新数据。更好的选择是改用重叠 I/O 或 I/O 完成端口。向操作系统提交出站数据,让操作系统处理所有等待您的事情,并在数据最终被接受/发送时通知您。在收到通知之前,不要为给定的套接字提交新数据。对于大量连接的可扩展性,I/O 完成端口通常是更好的选择。

于 2012-10-17T21:34:10.190 回答
0

不,它不是那样工作的。从 MSDN 文档中send

发送功能的成功完成并不表示数据已成功交付和接收到接收者。该函数仅表示数据发送成功。

于 2012-10-17T21:05:17.097 回答