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

Mat*_*att 13 c linux udp

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

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

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

cni*_*tar 13

udp没有连接的概念所以它能返回0吗?如果可以的话,它的意义是什么

这意味着收到了一个0长度的数据报.来自伟大的UNP:

写入长度为0的数据报是可以接受的.在UDP的情况下,这导致IP数据报包含IP报头(通常为IPv4的20字节和IPv6的40字节),8字节的UDP报头,没有数据. 这也意味着来自recvfrom的返回值0对于数据报协议是可接受的:这并不意味着对等体已关闭连接,因为TCP套接字上的读取返回值为0.由于UDP是无连接的,因此不存在关闭UDP连接的问题.

  • @cnicutar"一个发送总是意味着一个接收UDP下"是严重措辞.send()发送的数据在UDP中完整或全部接收或完全不接收.但丢包意味着发送和接收之间没有1 :: 1的对应关系. (2认同)