我需要同时发送和 recv 。
哪个选项会更好:
或
还是有另一种解决方案吗?
我期待最多约50个双向连接。这导致选项#1中的50个线程和选项#2中的100个线程。
答案 0 :(得分:3)
答案 1 :(得分:2)
你应该使用非阻塞套接字,但不是手动轮询它们,你应该让内核为你做。为此使用poll
或select
(前者是首选,因为它可以一次处理更多套接字)。执行此操作时,您将在选项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作为更好的解决方案。