套接字发送/接收的单独线程?

MrB*_*MrB 3 sockets tcp

我正在权衡如何实现基于 TCP 的服务器(用 C 语言) - 服务器将接受来自客户端的连接,接收来自客户端的命令,然后发送响应。非常简单的东西 - 但命令的处理必须由系统中的另一个线程完成,这会引入一些并发性。

因此,我试图决定是使用非阻塞套接字和 select() 在一个线程中处理所有 TCP 通信,还是使用阻塞套接字和两个单独的通信线程(一个用于发送,一个用于接收)。

我对后者的担忧是处理套接字同步 - 如果我在发送线程中关闭套接字,接收线程中会发生什么(反之亦然)..以及如何处理这个问题并以正确的方式进行清理。

任何建议将不胜感激。

Rem*_*eau 5

您不需要为客户端提供单独的接收和发送线程。当客户端被接受时,创建一个线程来处理该客户端的所有 I/O,包括接收和发送(特别是因为您正在实现命令/响应协议)。但是,如果您选择使用单独的线程,则关闭一个线程中的套接字将导致使用同一套接字的另一个线程中出现可检测到的错误。当发生套接字错误时,只需终止每个线程,然后决定哪个线程将负责关闭套接字。

但是,如果您需要处理大量并发客户端,那么线程并不是最佳选择。使用非阻塞套接字(或在 Windows 上,使用 I/O 完成端口)的异步 I/O 更好,因为它需要较少数量的线程。