13 个解决方案
#1
顶一下!
#2
recvfrom返回值为0有两种情况。
1.socket已经"温和"关闭(使用shutdown或者设置linear属性)
2.对方发送一个空数据,也就是对方发送的数据长度为0。这时socket也就可以接收到的,并且recvfrom返回值为0。
1.socket已经"温和"关闭(使用shutdown或者设置linear属性)
2.对方发送一个空数据,也就是对方发送的数据长度为0。这时socket也就可以接收到的,并且recvfrom返回值为0。
#3
再检查一下WSAGetLastError();
#4
0也表示接收成功,但是数据报大小0,返回SOCKET_ERROR(-1)为出错
#5
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.
#6
强烈建议使用WSAGetLastError来观察一下,如果没有什么错误,表示正常,对方没有数据或关闭了
#7
0 表示对方没有发送数据,我频繁使用这种方法。
#8
谢谢大家的帮忙,我已经在代码里加了getLastError之类的函数了,正在等待重现,BTW:我的程序在VxWorks上出现的这个问题(协议栈的问题?)。
我感到不明白的地方是,我的select总是返回可读,然后每次调用recvfrom都返回0,这样的包数以万计,导致我的程序在一段时间内CPU爆高。当然,我可以加sleep来缓解这个情况,但是,我想明白到底在什么情况下,会有那么多的0长度的包过来?本来我怀疑我的UDP套接字被别人关掉,然后刚好有人创建了一个TCP的套接字,分配到了这个fd,然后又关闭掉了,那么就可以解释为什么收到那么多的0长的包,因为套接字被关闭了嘛,但是,很郁闷的是,我打出了socket的类型居然还是UDP。
各位大侠,有没有遇到过这样收到大量的0长的包?
我感到不明白的地方是,我的select总是返回可读,然后每次调用recvfrom都返回0,这样的包数以万计,导致我的程序在一段时间内CPU爆高。当然,我可以加sleep来缓解这个情况,但是,我想明白到底在什么情况下,会有那么多的0长度的包过来?本来我怀疑我的UDP套接字被别人关掉,然后刚好有人创建了一个TCP的套接字,分配到了这个fd,然后又关闭掉了,那么就可以解释为什么收到那么多的0长的包,因为套接字被关闭了嘛,但是,很郁闷的是,我打出了socket的类型居然还是UDP。
各位大侠,有没有遇到过这样收到大量的0长的包?
#9
补充一下,在收到0长包的时候,我打出peer的IP和port,发现:
ip: 0.0.0.0
port: 0
请高人帮忙解释一下,这代表什么意思?再次谢谢!
ip: 0.0.0.0
port: 0
请高人帮忙解释一下,这代表什么意思?再次谢谢!
#10
UDP的情况比较复杂,很多的协议都是以UDP广播的方式发出的,所以。。。。
#11
谢谢大家,再顶!
#12
再顶!!
#13
我以前在Vxworks上遇到过这样的问题,在一个UDP的socket被关闭后该fd被分配给了另外一个TCP类型的socket,就出现你描述的情况.建议你再确认一把,收到很多0长度包的socket是否仍然是UDP类型,并且是否为原来同一个socket?
#1
顶一下!
#2
recvfrom返回值为0有两种情况。
1.socket已经"温和"关闭(使用shutdown或者设置linear属性)
2.对方发送一个空数据,也就是对方发送的数据长度为0。这时socket也就可以接收到的,并且recvfrom返回值为0。
1.socket已经"温和"关闭(使用shutdown或者设置linear属性)
2.对方发送一个空数据,也就是对方发送的数据长度为0。这时socket也就可以接收到的,并且recvfrom返回值为0。
#3
再检查一下WSAGetLastError();
#4
0也表示接收成功,但是数据报大小0,返回SOCKET_ERROR(-1)为出错
#5
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.
#6
强烈建议使用WSAGetLastError来观察一下,如果没有什么错误,表示正常,对方没有数据或关闭了
#7
0 表示对方没有发送数据,我频繁使用这种方法。
#8
谢谢大家的帮忙,我已经在代码里加了getLastError之类的函数了,正在等待重现,BTW:我的程序在VxWorks上出现的这个问题(协议栈的问题?)。
我感到不明白的地方是,我的select总是返回可读,然后每次调用recvfrom都返回0,这样的包数以万计,导致我的程序在一段时间内CPU爆高。当然,我可以加sleep来缓解这个情况,但是,我想明白到底在什么情况下,会有那么多的0长度的包过来?本来我怀疑我的UDP套接字被别人关掉,然后刚好有人创建了一个TCP的套接字,分配到了这个fd,然后又关闭掉了,那么就可以解释为什么收到那么多的0长的包,因为套接字被关闭了嘛,但是,很郁闷的是,我打出了socket的类型居然还是UDP。
各位大侠,有没有遇到过这样收到大量的0长的包?
我感到不明白的地方是,我的select总是返回可读,然后每次调用recvfrom都返回0,这样的包数以万计,导致我的程序在一段时间内CPU爆高。当然,我可以加sleep来缓解这个情况,但是,我想明白到底在什么情况下,会有那么多的0长度的包过来?本来我怀疑我的UDP套接字被别人关掉,然后刚好有人创建了一个TCP的套接字,分配到了这个fd,然后又关闭掉了,那么就可以解释为什么收到那么多的0长的包,因为套接字被关闭了嘛,但是,很郁闷的是,我打出了socket的类型居然还是UDP。
各位大侠,有没有遇到过这样收到大量的0长的包?
#9
补充一下,在收到0长包的时候,我打出peer的IP和port,发现:
ip: 0.0.0.0
port: 0
请高人帮忙解释一下,这代表什么意思?再次谢谢!
ip: 0.0.0.0
port: 0
请高人帮忙解释一下,这代表什么意思?再次谢谢!
#10
UDP的情况比较复杂,很多的协议都是以UDP广播的方式发出的,所以。。。。
#11
谢谢大家,再顶!
#12
再顶!!
#13
我以前在Vxworks上遇到过这样的问题,在一个UDP的socket被关闭后该fd被分配给了另外一个TCP类型的socket,就出现你描述的情况.建议你再确认一把,收到很多0长度包的socket是否仍然是UDP类型,并且是否为原来同一个socket?