在C++winsock中处理多个客户端的方法

Methodologies to handling multiple clients in C++ winsock

本文关键字:客户端 方法 C++winsock 处理      更新时间:2023-10-16

我正在开发一个对等消息解析应用程序。因此,一个对等体可能需要处理多个客户端。此外,还可以发送和接收大数据(一条消息约20 MB的数据)。可能存在许多对等体向同一对等体发送大数据的情况。我听说有很多解决办法来处理这种情况。

  • 使用每个对等线程
  • 使用循环遍历对等体,如果有数据,我们可以接收器
  • 使用select函数
  • 等等

处理这种情况最合适的方法或最常见和最被接受的方法是什么?欢迎任何建议或暗示。

更新:是否有一个良好的对等分布式计算库或框架用于windows平台上的C++

不要使用每个对等线程;超过处理器数量,额外的线程可能只会损害性能。你还应该调整dwStackSize,这样1000个空闲的对等设备就不会花费你1000MB的RAM。

您可以使用线程池(处理Y套接字的X线程)来提高性能(或者,理想情况下,使用IO完成端口),但这往往适用于某些类型的应用程序,而不适用于其他类型的应用。除非你确定你的适合这个,否则我不会证明冒险是合理的。

完全允许使用单个线程并从大量套接字轮询/发送。我不知道large什么时候会有可担心的开销,但我(保守地)估计它在2k-5k个插座之间(在低于平均水平的硬件上)。


WSAEWOULDBLOCK的解决方法是为应用程序中的每个套接字设置一个std::queue<BYTE>字节(而不是"数据包对象"队列)(用要发送的数据填充此queue),并具有一个后台线程,其唯一目的是将队列排入相应的套接字send(一次X字节);现在可以使用阻塞套接字(因为它是后台工作程序),但如果使用非阻塞套接字并获得WSAEWOULDBLOCK,则可以继续尝试排出队列(在这里它不会阻碍应用程序的流动)。

您可以使用libtorrent.org,它是在boost(boost asio)之上构建的。它专注于效率和可扩展性。

我在用C++开发套接字方面没有太多经验,但在C#中,我有很好的异步接受连接并将它们从线程池传递到自己的线程的经验。