2010-03-04 34 views
7

我很新的编程和ESP网络编程,所以如果它是愚蠢的,请不要太苛刻,谢谢。UDP和套接字,recvfrom()返回-1和资源暂时不可用

我有客户端和服务器通信与图表(UDP)在客户端发送5个信息和收到消息后,服务器发回消息。接收和发送消息非常好,直到客户端完成接收消息。在服务器发回所有消息后,它使用close()终止。所以客户端的recvfrom()应该返回0,对吧?

假设recvfrom()从服务器端返回close()时应返回0,它将返回-1,而错误Resource暂时不可用。这是资源引用从服务器封闭的套接字?还是像其他完全不同的东西,比如用完缓冲区或其他东西(我认为这不是真的)?

,并假设我的假设是错误的,则返回-1,因为服务器端,我也许应该处理与

if(SOMEMACRO) 
    do something 

的错误,但我如何找出SOMEMACRO是什么?我打印出来的错误,但它说资源temp不可用和recvfrom()描述没有提到不可靠的资源..?

btw这是一个非阻塞套接字,如果这有什么区别,因为我读过如果设置了O_NONBLOCK并且没有消息可用,它会将errno设置为EAGAIN或EWOULDBLOCK。 O_NONBLOCK未设置,但MSG_DONTWAIT已设置。他们基本上是相同的东西,其中O_NONBLOCK是用于一般文件描述符,而MSG_DONTWAIT是套接字特定的?

我的大脑现在并不是那么伟大,如果有人能够启发我并澄清我的困惑,我会深表感谢。谢谢!

回答

13

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

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

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

编辑:请注意,“资源暂时不可用”和EAGAIN是同样的错误,一个仅仅是用户友好的descption VS定义名称。基本上它只是告诉你,你试图从插座读取,并没有数据可读

+1

所以,如果你使用UDP,recvfrom()会返回0吗?因为你永远不知道对方是否执行了有序的关机? – 2010-03-04 14:02:13

+2

@Fantastic Fourier - UDP实际上可以发送一个只有IP和UDP头但没有数据有效载荷的数据报。这是完全合法的,并会看起来像一个0字节的读取。 – Duck 2010-03-04 14:21:46

+0

@Fantastic Fourier - 严格来说,由于UDP中没有“连接”,所以没有任何关闭,有序或其他。 – Duck 2010-03-04 14:28:33

2

当你关闭了socket之后,它仍然会一直存在。通常大约两分钟左右。为了避免这种情况,请使用SO_REUSEADDR套接字选项。

以下是您的一些参考。

http://msdn.microsoft.com/en-us/library/ms740476%28VS.85%29.aspx http://docs.hp.com/en/B2355-90136/ch03s01.html

这里是一个例子,向下滚动以udp_listen功能:

http://www.codase.com/search/display?file=L2dlbnRvbzIvdmFyL3RtcC9yZXBvcy9jb2Rhc2UuYy9zbGlycC0xLjAuMTYvd29yay9zbGlycC0xLjAuMTYvc3JjL3VkcC5j&lang=c&off=15730+15796+

相关问题