我有一个系统,当发生某些事情时,单个字节的消息通过UDP套接字从一个进程发送到另一个进程。在接收端,重要的不是这个事件是发生过一次,十几次甚至一百万次。
我认为也许我可以使用setsockopt将SO_RCVBUF设置为1,而我希望系统能够简单地忽略除第一条消息之外的所有消息(直到它被读取,从而允许另一条消息),而不是进行许多无用的recvfrom()调用。 )。然而,谷歌搜索提出了一些证据,证明这可能不是100%可移植的(看起来某些系统可能会悄悄地强制执行最小尺寸?)。
所以在我开始尝试这项工作之前,我想知道是否有人知道这有多大可能起作用?如果这在任何方面都很重要,那就是在Red Hat Linux上。
答案 0 :(得分:1)
在linux上,实际大小绑定在SOCK_MIN_RCVBUF
和sysctl_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,它不在我所知道的任何平台上。