为什么在使用UDP套接字时不需要调用listen()函数?

18

我只是好奇这个问题,有人可以告诉我吗?

4个回答

19

TCP是服务器和客户端之间的流式传输协议。该协议可靠,并需要为每个服务器<>客户端流维护单独的状态。使用listen/accept发起的连接协议设置了此服务器<>客户端连接状态。UDP是一种无连接、不可靠的数据报(消息)协议,因此无需监听新连接 - 数据报可以以任何顺序从任何来源进入。


4
因为UDP不像TCP那样是面向连接的,所以像SOCK_STREAM中的listen/accept没有意义。请尝试阅读Beej网络编程指南中“2.1.两种互联网套接字类型”一节和整个指南,它非常有趣。

2
如果我没记错的话,UDP 没有任何与 Listen() 相关的方法,而是调用 receive(),当使用 TCP 时,两者都会阻塞进程,直到接收到数据包。希望这回答了你的问题。

0

考虑内核源代码,listen() 主要用于初始化 accept queuesyn queue,但在使用 UDP 时是无用的。

调用链为 listen -> inet_listen -> inet_csk_listen_start -> reqsk_queue_alloc


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接