在Linux下,可以在UDP上返回0吗?

时间:2012-09-20 04:01:15

标签: c linux udp

我只是清理了一些我们写过的代码,并注意到对于udp套接字,0被视为连接已关闭。

我很确定这是从等效的tcp版本移植相同的recv循环的结果。但这让我很奇怪。对于udp,可以recv返回0吗?在tcp上它发出信号,另一端已经关闭了连接。 udp没有连接的概念所以它能返回0吗?如果可以的话,它的含义是什么?

注意:linux中的手册页不区分udp和tcp,返回代码为零,这可能就是我们保留代码检查的原因。

2 个答案:

答案 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套接字,也会发生这种情况。