UDP和套接字,recvfrom()返回-1,资源暂时不可用

UDP和套接字,recvfrom()返回-1,资源暂时不可用,c,sockets,client,udp,C,Sockets,Client,Udp,我有一个客户端和一个服务器与C语言中的数据报(UDP)通信。客户端发送5个MSG,收到MSG后,服务器将MSG发回。在客户端完成接收MSG之前,接收和发送消息都是非常棒的。服务器发回所有MSG后,使用close()终止。所以客户端的recvfrom()应该返回0,对吗 假设recvfrom()在服务器端close()时返回0,则返回-1,错误资源暂时不可用。此资源引用是否来自服务器的已关闭套接字?或者是为了其他完全不同的事情,比如缓冲区耗尽或者其他事情(我不认为这是真的) 假设我的假设是错误的,

我有一个客户端和一个服务器与C语言中的数据报(UDP)通信。客户端发送5个MSG,收到MSG后,服务器将MSG发回。在客户端完成接收MSG之前,接收和发送消息都是非常棒的。服务器发回所有MSG后,使用close()终止。所以客户端的recvfrom()应该返回0,对吗

假设recvfrom()在服务器端close()时返回0,则返回-1,错误资源暂时不可用。此资源引用是否来自服务器的已关闭套接字?或者是为了其他完全不同的事情,比如缓冲区耗尽或者其他事情(我不认为这是真的)

假设我的假设是错误的,并且由于服务器终止而返回了-1,我可能应该使用

if(SOMEMACRO)
   do something 
如何找出什么是
SOMEMACRO
?我打印出了错误,但它说resource temp unavailable,recvfrom()说明没有提到不可用的资源

顺便说一句,这是一个非阻塞套接字,如果这有什么区别,因为我读到,如果设置了O_NONBLOCK,并且没有可用的MSG,它会将errno设置为EAGAIN或ewoodblock。未设置O_NONBLOCK,但已设置MSG_DONTWAIT。它们基本上是相同的吗?O_NONBLOCK表示一般文件描述符,而MSG_dont表示特定于套接字


我的大脑现在工作得不太好,如果有人能启发我,澄清我的困惑,我将不胜感激。谢谢

在您关闭插座后,它仍会在周围徘徊一段时间。通常大约两分钟左右。要避免这种情况,请使用SO_REUSEADDR套接字选项

这里有一些参考资料给你

下面是一个示例,向下滚动到udp_listen函数:


与面向连接的TCP不同,UDP是一种无状态协议。您的接收代码将不知道发件人是否已关闭其套接字,它只知道是否有数据等待读取。根据Linux上recvfrom的手册页:

如果套接字上没有可用的消息,则接收调用将等待消息到达,除非套接字是非阻塞的(请参阅fcntl(2)),在这种情况下,返回值-1,并将外部变量errno设置为EAGAIN

这似乎是你正在经历的事情


编辑:请注意,“资源暂时不可用”和EAGAIN是相同的错误,一个是用户友好的描述与定义名称。基本上,它只是告诉您您正在尝试从套接字读取数据,并且没有数据可读取

,因此如果您使用UDP,recvfrom()是否会返回0?因为您永远不知道对等方是否执行了有序关机?@UDP实际上可以发送一个数据报,它只是IP和UDP报头,但没有数据负载。这是完全合法的,在你看来就像一个0字节的读取。@神奇的傅立叶-严格地说,因为UDP中没有“连接”,所以没有任何东西可以关闭,有序或其他。谢谢,我想我现在对UDP有了更好的理解。