0

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

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

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

4

2 回答 2

1

在 linux 上,实际大小绑定在SOCK_MIN_RCVBUF和之间sysctl_rmem_max,但调用setsockopt永远不会失败。见这里。这包括开销,除其他外,对于struct sk_buff.

的值为SOCK_MIN_RCVBUF

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

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

于 2013-02-04T20:27:59.933 回答
0

您假设SO_RCVBUF以应用程序数据的字节数为单位。对于 UDP,它不在我所知道的任何平台上。

于 2013-02-04T20:27:05.810 回答