首页 文章

Winsock send()阻止服务器?

提问于
浏览
2

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

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

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

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

或者最好使用重叠I / O?

2 回答

  • 0

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

  • 3

    不,它不会那样工作 . 从send上的MSDN文档:

    成功完成发送功能并不表示数据已成功发送并接收给收件人 . 此功能仅表示数据已成功发送 .

相关问题