我只是清理了一些我们写过的代码,并注意到对于udp套接字,0被视为连接已关闭。
我很确定这是从等效的tcp版本移植相同的recv循环的结果。但这让我很奇怪。对于udp,可以recv返回0吗?在tcp上它发出信号,另一端已经关闭了连接。 udp没有连接的概念所以它能返回0吗?如果可以的话,它的含义是什么?
注意:linux中的手册页不区分udp和tcp,返回代码为零,这可能就是我们保留代码检查的原因。
答案 0 :(得分:12)
udp没有连接的概念所以它能返回0吗?和 如果它可以,那是什么意思
这意味着收到了一个0长度的数据报。来自伟大的UNP:
编写长度为0的数据报是可以接受的。在UDP的情况下,这 导致包含IP头的IP数据报(通常为20个字节) 对于IPv4和40字节用于IPv6),一个8字节的UDP报头,没有数据。 这也意味着recvfrom的返回值为0是可以接受的 对于数据报协议:这并不意味着对等关闭了 连接,在TCP套接字上读取的返回值为0。 由于UDP是无连接的,因此不存在关闭UDP的问题 连接。
答案 1 :(得分:-1)
在Linux中,UDP套接字上的recvfrom可能返回零的原因有两个:
1)收到零长度的数据报,或者 2)在套接字上调用了关机
第二个行为很有用,因为它使您可以取消阻塞正在套接字上等待的线程。但是,recvfrom的调用者无法知道套接字是否已关闭,或者是否接收到零长度数据报。为此,您需要一些其他方式来向线程发出套接字已关闭的信号,例如使用共享变量。
第二种行为似乎也与recv(2)手册页相矛盾,该手册页说:
When a stream socket peer has performed an orderly shutdown, the return
value will be 0 (the traditional "end-of-file" return).
很显然,对于不是流套接字的UDP套接字,也会发生这种情况。