Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Winsock中多客户端处理方法_C++_Winsock_P2p - Fatal编程技术网

C++ Winsock中多客户端处理方法

C++ Winsock中多客户端处理方法,c++,winsock,p2p,C++,Winsock,P2p,我正在开发一个对等消息解析应用程序。因此,一个对等方可能需要处理多个客户端。此外,还可以通过一条消息发送和接收大数据~20 MB数据。可能会出现许多对等方向同一对等方发送大型数据的情况。我听说有很多方法可以解决这种情况 使用每个对等线程 使用循环遍历对等点,如果有数据,我们可以 接收 使用选择功能 等 处理这类情况最合适的方法或最常见和公认的方式是什么?欢迎提供任何建议或提示 更新:在Windows平台下,有一个很好的对等分布式计算库或C++框架,可以使用在Boost Boost ASIO之上构

我正在开发一个对等消息解析应用程序。因此,一个对等方可能需要处理多个客户端。此外,还可以通过一条消息发送和接收大数据~20 MB数据。可能会出现许多对等方向同一对等方发送大型数据的情况。我听说有很多方法可以解决这种情况

使用每个对等线程 使用循环遍历对等点,如果有数据,我们可以 接收 使用选择功能 等 处理这类情况最合适的方法或最常见和公认的方式是什么?欢迎提供任何建议或提示

<>更新:在Windows平台下,有一个很好的对等分布式计算库或C++框架,可以使用在Boost Boost ASIO之上构建的C++。它专注于效率和可扩展性


<>我在C++开发socket方面没有太多经验,但是在C中,我有很好的异步连接连接并将它们从线程池传递给自己线程的经验。

< P>不要使用每个对等点的线程;超过处理器的数量,额外的线程可能只会影响性能。您还需要调整dwStackSize,这样1000个空闲对等机就不会占用1000MB的RAM

您可以使用线程池X线程处理Y套接字来获得性能提升,或者理想情况下,IO完成端口,但这对于某些类型的应用程序来说效果非常好,而对于其他类型的应用程序则根本不起作用。除非你确定你的工作适合做这个,否则我不会冒险的

完全允许使用单个线程并从大量套接字轮询/发送。我不知道什么时候大的会有令人担忧的开销,但我保守地估计它在低于平均水平的硬件上的2k-5k插槽之间。
WSAEWOULDBLOCK的解决方法是为应用程序中的每个套接字设置一个std::字节队列,而不是数据包对象队列,您可以使用要发送的数据填充该队列,并设置一个后台线程,其唯一目的是将队列排入相应的套接字,每次发送X字节;您现在可以使用阻塞套接字进行此操作,因为它是后台工作程序,但是如果您使用非阻塞套接字并获得WSAEWOULDBLOCK,您可以继续尝试在此处排空队列,它不会阻碍应用程序的流动。

相关问题:是的,我知道libtorrent。但这是一个bittorrent实现。我不打算发送文件。但我计划通过网络发送的数据可能会从1KB到20MB不等。所以使用bittorrent对我来说意味着额外的成本。分享追踪器和很多东西。无论如何,谢谢。然后我会再次建议使用非阻塞异步套接字。是一个跨平台的C++库,用于网络和底层I/O编程,它为开发人员提供了一个使用现代C++方法的异步模型。一个对等方接收的文件是否与另一个对等方相同?我使用的是非阻塞套接字。但问题是,当一个对等方连续向套接字发送数据时,它会阻塞临时数据并返回WSAEWOULDBLOCK error。发生这种情况是因为该套接字的写文件描述符可能被归档。我猜您必须等到缓冲区空间空闲时再进行。WSAEWOULDBLOCK不是一个真正的错误,只是告诉您发送缓冲区已满。如果您使网络饱和,或者对方根本不确认接收到的数据,则可能发生这种情况。看看。是的,这就是我目前正在做的。但是,当多个对等方(即4或5)同时向同一个套接字发送4MB数据时,等待时间很长。是否有更好的解决方案。您的意思是,要发送的数据应该先排队,然后另一个函数可能是在单独线程中运行的函数。在执行等待块等操作时,应该逐个发送这些数据。正当是的,这似乎是个解决办法。然后,数据将被传送到最后,但无法保证它将花费多少时间。如果我需要在一个合理的时间限制内交付数据,我可以遵循哪些技术?@AmithChinthaka如果你排队等待20MB发送给对等方,然后决定需要紧急发送4KB,你不能等待20MB耗尽,这是一个相当棘手的挑战!在这种设计中,您可以确保公平地向每个对等方发送内容,并给予同等的排放优先级,但不会超过此优先级。嗯。。这些阻塞、等待和排队的事情是网络通信中常见的场景,还是因为我做错了什么,我才得到这些东西?@AmithChinthaka,恐怕是这样;这是一门高级学科。你没有做错什么。