对于面向连接的套接字调用recvfrom返回0代表对端连接被关闭;那么,对于UDP这样的无连接的套接字调用recvfrom返回0代表什么呢?请高人指教一下,谢谢!

解决方案 »

  1.   

    recvfrom返回值为0有两种情况。
    1.socket已经"温和"关闭(使用shutdown或者设置linear属性)
    2.对方发送一个空数据,也就是对方发送的数据长度为0。这时socket也就可以接收到的,并且recvfrom返回值为0。
      

  2.   

    0也表示接收成功,但是数据报大小0,返回SOCKET_ERROR(-1)为出错
      

  3.   

    If no error occurs, this function returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. If an error occurs, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError. 
      

  4.   

    强烈建议使用WSAGetLastError来观察一下,如果没有什么错误,表示正常,对方没有数据或关闭了
      

  5.   

    谢谢大家的帮忙,我已经在代码里加了getLastError之类的函数了,正在等待重现,BTW:我的程序在VxWorks上出现的这个问题(协议栈的问题?)。
    我感到不明白的地方是,我的select总是返回可读,然后每次调用recvfrom都返回0,这样的包数以万计,导致我的程序在一段时间内CPU爆高。当然,我可以加sleep来缓解这个情况,但是,我想明白到底在什么情况下,会有那么多的0长度的包过来?本来我怀疑我的UDP套接字被别人关掉,然后刚好有人创建了一个TCP的套接字,分配到了这个fd,然后又关闭掉了,那么就可以解释为什么收到那么多的0长的包,因为套接字被关闭了嘛,但是,很郁闷的是,我打出了socket的类型居然还是UDP。
    各位大侠,有没有遇到过这样收到大量的0长的包?
      

  6.   

    补充一下,在收到0长包的时候,我打出peer的IP和port,发现:
    ip: 0.0.0.0
    port: 0请高人帮忙解释一下,这代表什么意思?再次谢谢!
      

  7.   

    UDP的情况比较复杂,很多的协议都是以UDP广播的方式发出的,所以。
      

  8.   

    我以前在Vxworks上遇到过这样的问题,在一个UDP的socket被关闭后该fd被分配给了另外一个TCP类型的socket,就出现你描述的情况.建议你再确认一把,收到很多0长度包的socket是否仍然是UDP类型,并且是否为原来同一个socket?