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

时间:2013-02-18 09:40:36

标签: c multithreading sockets client-server posix

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

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

2)哪一个是最好的型号?     i)使用单线程,单插槽进行发送和接收     ii)使用2个线程(一个用于发送,一个用于接收),单个插槽     iii)使用2个插座和2个线程,一个用于发送,一个用于接收。

4 个答案:

答案 0 :(得分:3)

连接是全双工的,这意味着发送和接收可以同时发生。因此,在回答问题1时,客户端和服务器都可以同时从其套接字发送/读取数据。

在哪个"模型"最好的,这取决于您的应用程序以及您尝试实现的目标。顺便说一下,您不需要来进行多线程。你可以:

  • 多进程(分叉)
  • 使用非阻塞套接字(select / poll)
  • 使用异步通知(信号)

所有这些都有利有弊。

答案 1 :(得分:2)

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

由于同时发送/接收没有问题,第二个问题中的第一个选择将是最简单的。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

如果要在多个套接字上轮询,则存在 no 固有的多线程需求。 您真正需要做的就是使用select()

要实现此目的,您需要定义一个FD_SET(文件描述符集),您要添加要轮询的所有套接字。这个set交给select(),它会返回所有带有待处理数据的文件描述符。

selectfd_setselect tutorial

的手册页