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

时间:2014-02-20 06:19:15

标签: c++ winsock p2p

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

  • 使用每个对等的线程
  • 使用循环遍历对等体,如果有数据,我们可以 recive
  • 使用select功能

处理这类情况的最合适的方法或最常用和最常用的方法是什么?欢迎任何建议或提示。

已更新:在Windows平台上是否有一个好的点对点分布式计算库或C ++框架

2 个答案:

答案 0 :(得分:2)

不要每个对等方使用一个帖子;超过处理器的数量,额外的线程可能只会伤害性能。您还应该调整dwStackSize以便1000个空闲对等点不会花费您1000MB的RAM。

您可以使用线程池(处理X套接字的Y线程)来提高性能(或者理想情况下,IO完成端口),但对于某些类型,这可能会非常好用应用程序,而不是其他类型的应用程序。除非您确定自己适合这种情况,否则我无法承担风险。

完全允许使用单个线程并从大量套接字轮询/发送。我不确切地知道large何时会产生令人担忧的开销,但我(保守地)将它放在2k-5k套接字之间(在低于平均水平的硬件上)。

<小时/> WSAEWOULDBLOCK的解决方法是为应用程序中的每个套接字提供std::queue<BYTE>个字节(不是&#34;数据包对象和#34;的队列)(使用queue填充此send您要发送的数据),并且只有一个后台线程,其唯一目的是将队列排入相应的套接字X(一次WSAEWOULDBLOCK个字节);你现在可以使用阻塞套接字(因为它是后台工作者),但如果你使用非阻塞套接字并获得{{1}},你可以继续尝试排空队列(这里赢了& #39; t阻碍你的申请流程。

答案 1 :(得分:0)

您可以使用基于boost(boost-asio)构建的libtorrent.org。它专注于效率和可扩展性。

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