我可以在UDP套接字上将SO_RCVBUF设置为1

时间:2013-02-04 20:18:32

标签: c sockets udp setsockopt

我有一个系统,当发生某些事情时,单个字节的消息通过UDP套接字从一个进程发送到另一个进程。在接收端,重要的不是这个事件是发生过一次,十几次甚至一百万次。

我认为也许我可以使用setsockopt将SO_RCVBUF设置为1,而我希望系统能够简单地忽略除第一条消息之外的所有消息(直到它被读取,从而允许另一条消息),而不是进行许多无用的recvfrom()调用。 )。然而,谷歌搜索提出了一些证据,证明这可能不是100%可移植的(看起来某些系统可能会悄悄地强制执行最小尺寸?)。

所以在我开始尝试这项工作之前,我想知道是否有人知道这有多大可能起作用?如果这在任何方面都很重要,那就是在Red Hat Linux上。

2 个答案:

答案 0 :(得分:1)

在linux上,实际大小绑定在SOCK_MIN_RCVBUFsysctl_rmem_max之间,但对setsockopt的调用永远不会失败。见here。这包括struct sk_buff的开销等。

SOCK_MIN_RCVBUF的值为:

#define SOCK_MIN_RCVBUF (2048 + sizeof(struct sk_buff))

关于你想做什么:AFAIK,没有读取(或关闭套接字)就无法清除接收缓冲区。

答案 1 :(得分:0)

您假设SO_RCVBUF以应用数据的字节数来衡量。对于UDP,它不在我所知道的任何平台上。