为什么我们必须在TCP服务器套接字编程中获得两个文件描述符?

时间:2016-04-19 22:51:49

标签: sockets tcp network-programming

我将本教程用于服务器套接字编程link。对于功能,我没有任何问题,我所要求的更多是关于架构设计问题。请看一下教程。我们实际上看到两个文件描述符,一个在调用socket()时,一个在调用accept()时。在创建套接字时我们获取文件描述符是有道理的,因为我们将套接字视为文件;在接受不同的连接时,我们必须拥有多个文件描述符。但是,为什么我们需要两者都让它发挥作用呢?

4 个答案:

答案 0 :(得分:6)

一个套接字表示侦听端点。另一个套接字表示已接受的传入连接。如果您不想再接受任何连接,可以在调用accept后关闭侦听套接字。

答案 1 :(得分:3)

第一个套接字称为侦听套接字。 TCP是面向连接的流。每个客户端连接都在自己的套接字上运行,就像文件一样。如果您只有一个套接字,则无法区分接收到的数据属于哪个连接。因此TCP套接字设计的方式是使侦听套接字以LISTEN模式运行,每次客户端想要建立与服务器的连接时,accept调用将返回一个新的套接字,即客户端socket,表示新连接,以便它专门用于与此客户端通信。

另一方面,UDP是一种基于无连接数据报的协议,其中只有一个套接字用于处理来自所有客户端的所有数据。

答案 2 :(得分:1)

理想情况下,它们是两个不同的TCP端点,其中一个用作侦听端点(LISTENING),另一个用作接受的传入连接(ESTABLISTED)。完成接受连接后,您可以关闭侦听端点。

答案 3 :(得分:0)

想象一下一家快速维修店,客户将要维修的PC携带到这里,然后坐在候车室,直到PC固定好。不需要花费数周的长时间维修;快速维修需要一个小时。

经营这家商店的明智方法是让接待员给客户,拿走损坏的PC,然后将其传递给当前免费的修理工。他接受工作,然后去上班。客户去坐。当另一位客户到达时,接待员可以自由地向他们打招呼,并将他们引导给另一位修理工(如果有)。

经营这家商店的不明智方法是让接待员自己修理电脑。下一位要来商店的客户必须将损坏的PC握在怀中,等待接待员修理前一位客户的PC后再移交给他们。最终,人们的手变得疲倦,他们离开队列,可能会找到一家更健康的商店。同时,可怜的接待员感到压力很大,看着所有等待与她互动的人...