当前位置:  开发笔记 > 运维 > 正文

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

如何解决《UDP和套接字,recvfrom()返回-1,资源暂时不可用》经验,为你挑选了1个好方法。

我有一个客户端和服务器与C中的数据报(UDP)通信.客户端发送5个消息,并在收到消息后,服务器发回消息.在客户端完成接收消息之前,接收和发送消息是很好的.服务器发回所有消息后,它将使用close()终止.所以来自客户端的recvfrom()应该返回0,对吗?

假设recvfrom()应该在服务器端close()时返回0,它返回-1,而错误资源暂时不可用.此资源是否从服务器引用了已关闭的套接字?或者它是否为完全不同的东西,比如用完缓冲区或其他东西(我不认为是真的)?

假设我的假设是错误的,并且因为服务器终止而返回-1,我可能应该处理错误

if(SOMEMACRO)
   do something 

我怎么知道SOMEMACRO是什么?我打印出错误,但它说资源临时不可用,recvfrom()描述没有提到无法使用的资源..?

顺便说一句,这是一个非阻塞套接字,如果这有任何区别,因为我读到如果设置O_NONBLOCK并且没有可用的消息,它会将errno设置为EAGAIN或EWOULDBLOCK.未设置O_NONBLOCK但设置了MSG_DONTWAIT.它们基本上是相同的东西,其中O_NONBLOCK用于一般文件描述符,而MSG_DONTWAIT是特定于套接字的吗?

我的大脑现在没有那么好用,如果有人可以启发我并澄清我的困惑,我会深深体会到这一点.谢谢!



1> bdk..:

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

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

这似乎是你正在发生的事情

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


@Fantastic Fourier - UDP实际上可以发送一个数据报,它只是IP和UDP报头但没有数据负载.它是完全合法的,并且看起来像读取0字节.
推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有