5

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

  • 1 个使用非阻塞套接字处理发送和接收的线程

或者

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

还是有其他解决方案?

我预计最多有 50 个双向连接。这导致选项#1 中有 50 个线程,选项#2 中有 100 个线程。

4

4 回答 4

4

我不会使用这两种方法中的任何一种。

看看这个SO question。我将使用一个工作线程模型,在该模型中,您将有 N 个线程使用非阻塞套接字处理所有流量。

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

于 2009-06-04T13:17:12.593 回答
3

您应该使用非阻塞套接字,而不是手动轮询它们,您应该让内核为您完成。使用其中一个pollselect为此(前者是首选,因为它可以一次处理更多套接字)。当你这样做时,你将在选项 1 中得到 1 个线程,或者在选项 2 中得到 2 个线程。:-P

于 2009-06-04T13:15:07.793 回答
0

如果您担心性能和可扩展性,请尝试 IOCP(异步套接字读/写):如何编写基于可扩展 Tcp/Ip 的服务器

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

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

于 2009-06-05T02:52:38.390 回答
0

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

然后您不需要轮询,因为 select() 阻塞而不使用处理器时间。

于 2009-06-04T13:14:47.140 回答