丢弃传入的UDP数据包而不读取

时间:2010-06-21 15:31:18

标签: linux sockets udp queue

在某些情况下,我想以尽可能少的开销明确地丢弃在套接字上等待的数据包。似乎没有明确的“drop udp buffer”系统调用,但也许我错了?

下一个最好的方法可能是将recv数据包发送到临时缓冲区并放弃它。我似乎无法收到0字节,因为man说的是recvThe return value will be 0 when the peer has performed an orderly shutdown.所以在这种情况下1是最小的。

还有其他方法可以解决这个问题吗?

以防万一 - 这不是一个过早的优化。这台服务器唯一要做的就是以特定的方式转发/分发UDP数据包 - 虽然recv len=1不会杀了我,但我宁愿一次性丢弃整个队列一些更具体的功能(希望降低延迟)。

3 个答案:

答案 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的东西。