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



我只是对这个问题很好奇,有人能告诉我吗?

TCP是服务器和客户端之间的流协议。该协议是可靠的,并且需要每个服务器的单独状态<>客户端流。通过侦听/接受启动的连接协议设置此服务器<>客户端连接状态。UDP是一种无连接、不可靠的数据报(消息(协议,因此无需侦听新的连接——数据报可以从任何来源以任何顺序传入。

这是因为UDP不像TCP那样面向连接,所以侦听/接受没有SOCK_STREAM那样的意义。试着阅读段落"2.1。网络编程的Beej指南和整个指南中的"两种类型的Internet套接字"很有趣。

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

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

呼叫链是listen -> inet_listen -> inet_csk_listen_start -> reqsk_queue_alloc

相关内容

最新更新