2014-02-05 41 views
2

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

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

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

任何意见将不胜感激。

回答

3

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

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