在某些情况下,我想以尽可能少的开销明确地丢弃在套接字上等待的数据包。似乎没有明确的“drop udp buffer”系统调用,但也许我错了?
下一个最好的方法可能是将recv
数据包发送到临时缓冲区并放弃它。我似乎无法收到0字节,因为man说的是recv
:The return value will be 0 when the peer has performed an orderly shutdown.
所以在这种情况下1是最小的。
还有其他方法可以解决这个问题吗?
以防万一 - 这不是一个过早的优化。这台服务器唯一要做的就是以特定的方式转发/分发UDP数据包 - 虽然recv
len=1
不会杀了我,但我宁愿一次性丢弃整个队列一些更具体的功能(希望降低延迟)。
答案 0 :(得分:8)
您可以让内核通过将UDP接收缓冲区设置为0来丢弃您的UDP数据包。
int UdpBufSize = 0;
socklen_t optlen = sizeof(UdpBufSize);
setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &UdpBufSize, optlen);
每当您认为适合接收数据包时,您可以将缓冲区设置为例如4096字节。
答案 1 :(得分:3)
我宁愿一次性丢弃整个队列
由于这是UDP,我们在这里讨论:close(udp_server_socket)
和socket()/ bind()再次?
我的理解应该有效。
答案 2 :(得分:1)
man说recv:当对等体执行有序关闭时,返回值将为0。
这不适用于UDP。在UDP中没有“连接”关闭。返回值0完全有效,它只表示没有收到有效负载的数据报(即仅IP和UDP报头)。
不确定是否有助于解决您的问题。我真的不明白你在哪里使用len = 1的东西。