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

时间:2011-11-19 13:22:27

标签: sockets

我只是对这个问题感到好奇,任何人都可以告诉我吗?

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:4)

这是因为UDP不是像TCP那样面向连接,所以在listen / accept中没有意义,就像SOCK_STREAM一样。尝试阅读Beej guide to network programming中的“2.1。两种类型的互联网套接字”段落,整个指南一般都很有趣。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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