ioctl(socketFd_, SIOCOUTQ, &outstandingBytes);
getsockopt(socketFd_, SOL_SOCKET, SO_SNDBUF, &sendBuffSize, &buffLen);
我正在使用这两个api来调试程序中的数据包丢弃 观察:
sendto
将始终返回数据包大小,因此对sendto
的调用始终是成功的。 getsockopt
返回。 sendto
是否无法检测到错误,因为数据包在达到sendBuffSize限制之前被丢弃了?getsockopt()
api返回的124928
我有这个问题的类似线程如下所示但是我无法得到答案所以决定开始一个新的线程
rawsocket sendto() some of the packet are dropped and not seen in the network 答案 0 :(得分:0)
UDP和原始套接字不提供任何方法来检测丢弃的数据包。由于路由器故障或网络拥塞,数据包可能在网络中丢失,或者可以在内核中丢弃它们。如果需要检测丢失的数据包,则必须在应用层中执行,或者在UDP上实现会话层。
如果内核在您致电sendto()
时无法缓冲数据包,则应返回-1
并将errno
设置为EWOULDBLOCK
。