2

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

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

2)以下哪个是最好的模型?i) 使用单线程,单套接字发送和接收 ii) 使用 2 个线程(一个发送,一个接收),单套接字 iii) 使用 2 个套接字和 2 个线程,一个发送,一个接收。

4

4 回答 4

3

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

至于哪种“模型”最好,这取决于您的应用程序以及您想要实现的目标。顺便说一句,您不需要多线程。你可以:

  • 多进程(分叉)
  • 使用非阻塞套接字(选择/轮询)
  • 使用异步通知(信号)

所有这些都有优点和缺点。

于 2013-02-18T09:48:01.620 回答
2

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

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

于 2013-02-18T09:48:24.273 回答
2

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

于 2013-02-18T09:49:44.113 回答
1

如果您想在多个套接字上轮询,则不需要多线程您真正需要做的就是使用select().

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

selectfd_setselect 教程的手册页

于 2013-02-18T09:48:53.190 回答