socket send / recv的独立线程?

时间:2014-02-05 10:05:33

标签: sockets tcp

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

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

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

非常感谢任何建议。

1 个答案:

答案 0 :(得分:3)

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

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