C 当客户端和服务器想要同时通话时,是否需要多线程?

C 当客户端和服务器想要同时通话时,是否需要多线程?,c,multithreading,sockets,client-server,posix,C,Multithreading,Sockets,Client Server,Posix,关于使用套接字进行客户机-服务器通信,我有两个问题。假设在这两种情况下只有一个客户机 我知道我们可以使用单个套接字在客户端和服务器之间发送和接收数据。但在这种情况下,当服务器和客户端同时尝试发送数据时会发生什么情况 2以下哪种型号最好? 我使用单线程、单套接字进行发送和接收 ii使用2根线一根用于发送,一根用于接收,单插座 iii使用2个套接字和2个线程,一个用于发送,一个用于接收。连接是全双工的,这意味着发送和接收可以同时进行。所以在回答第一个问题时,客户机和服务器将能够同时从它们的套接字发送

关于使用套接字进行客户机-服务器通信,我有两个问题。假设在这两种情况下只有一个客户机

我知道我们可以使用单个套接字在客户端和服务器之间发送和接收数据。但在这种情况下,当服务器和客户端同时尝试发送数据时会发生什么情况

2以下哪种型号最好? 我使用单线程、单套接字进行发送和接收 ii使用2根线一根用于发送,一根用于接收,单插座
iii使用2个套接字和2个线程,一个用于发送,一个用于接收。

连接是全双工的,这意味着发送和接收可以同时进行。所以在回答第一个问题时,客户机和服务器将能够同时从它们的套接字发送/读取数据

就哪种模型最好而言,这取决于您的应用程序和您试图实现的目标。顺便说一句,您不需要多线程。你可以:

多工序叉 使用非阻塞套接字选择/轮询 使用异步通知信号
所有这些都有利弊。

对于第一个问题,没有什么特别的事情会发生。TCP是全双工的,连接的双方可以同时发送

同时发送/接收没有问题,因此第二个问题中的第一个备选方案将是最简单的。

如果要在多个套接字上轮询,则不需要多线程。 你真正需要做的就是使用select

要实现这一点,您需要定义一个FD_集文件描述符集,向其中添加所有要轮询的套接字。您可以手动选择此集合,它将返回所有带有挂起数据的文件描述符


在这种情况下,您不需要线程。套接字本身缓冲传入的数据,直到您从文件描述符读取数据为止。更准确地说,从硬件开始有多个级别的缓冲区。您不会错过数据,因为您正在同时写入,它只会等待您,直到您下次读取套接字的文件描述符

您在套接字之间使用什么协议?TCP/IP?谢谢。如果我使用两个线程和两个套接字,性能会有什么提高吗?@linuxfreak可能不会,很可能是相反的。@Joachim:对不起。。我不明白这个概念。假设,两台机器试图同时通信,使用两个线程和两个套接字不是更快吗?你能解释一下当我使用超过一个线程时,性能是如何落后的吗?你能给我指一些文章来帮助我理解什么时候使用多线程/套接字吗?@linuxfreak当你有两个线程时,处理器必须一直在它们之间切换。即使在现代多核处理器上,切换上下文也可能需要时间。此外,线程必须同步,这也会降低性能。当然还有增加的代码复杂性。实际上,许多服务器可以在一个线程中处理数百个连接,同时执行输入和输出以及检查新连接。使用单个线程编写只处理一个连接的服务器非常简单。感谢您的解释。那么,我应该什么时候去买线程呢?