无阻塞套接字轮询与阻塞套接字

时间:2009-06-04 13:11:55

标签: sockets networking client-server blocking

我需要同时发送 recv
哪个选项会更好:

  • 1个线程处理发送&带有非阻塞套接字的recv

  • 2个线程,其中一个处理阻塞recv()+一个处理send()?

还是有另一种解决方案吗?

我期待最多约50个双向连接。这导致选项#1中的50个线程和选项#2中的100个线程。

4 个答案:

答案 0 :(得分:3)

我不会使用其中任何一种方法。

看看this SO问题。我会使用一个工作线程模型,你将有N个线程使用非阻塞套接字处理所有流量。

如果你绝对必须遵循你刚才描述的方法之一,请选择非阻塞的恕我直言。

答案 1 :(得分:2)

你应该使用非阻塞套接字,但不是手动轮询它们,你应该让内核为你做。为此使用pollselect(前者是首选,因为它可以一次处理更多套接字)。执行此操作时,您将在选项1中使用1个线程,或在选项2中使用2个线程:.- P

答案 2 :(得分:0)

您可以使用一个带有两个非阻塞套接字的线程,并使用select()等待输出队列中的传入输入和空间。

然后您不需要轮询,因为select()会在不使用处理器时间的情况下进行阻止。

答案 3 :(得分:0)

如果您担心性能和可伸缩性,请尝试IOCP(异步套接字读/写):How to write a scalable Tcp/Ip based server

请注意,实现IOCP比“每个连接的线程”要复杂得多,并且由于您只需要50个连接(或者您建议的100个线程),这可能“足够好”且更简单正确实施。

尝试简单的方法并对其进行测量......但如果您要么:需要更多性能,或者要扩展(远远超过50个连接),请认真考虑IOCP作为更好的解决方案。