在某些情况下,我想用尽可能less的开销来明确地丢弃在套接字上等待的数据包。 似乎没有明确的“drop udp buffer”系统调用,但也许我错了?
下一个最好的方法可能是将数据包recv
一个临时缓冲区,然后放下它。 看来我不能接收0字节,因为男人说关于recv
: The return value will be 0 when the peer has performed an orderly shutdown.
所以在这种情况下1是最小的。
有没有其他办法来处理这个问题?
以防万一 – 这不是一个不成熟的优化。 这个服务器唯一做的就是以特定的方式转发/发送UDP数据包 – 尽piperecv
len=1
recv
不会杀了我,我宁愿只是用一些更具体的函数丢掉整个队列(希望降低延迟)。
您可以通过将UDP接收缓冲区设置为0来让内核丢弃您的UDP数据包。
int UdpBufSize = 0; socklen_t optlen = sizeof(UdpBufSize); setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &UdpBufSize, optlen);
只要你觉得适合接收数据包,就可以将缓冲区设置为例如4096字节。
我宁愿放弃整个队列
由于这是UDP,我们在这里说: close(udp_server_socket)
和套接字()/ bind()再次?
我的理解应该工作。
男人说关于recv:当对方执行有序的关机时,返回值将是0。
这不适用于UDP。 在UDP中没有“连接”关闭。 返回值0是完全有效的,它只是意味着没有有效载荷的数据报被接收(即只有IP和UDP报头)。
不知道这有助于你的问题。 我真的不明白你在哪里用len = 1的东西。