net.unix.max_dgram_qlen 问题
Posted
技术标签:
【中文标题】net.unix.max_dgram_qlen 问题【英文标题】:net.unix.max_dgram_qlen questions 【发布时间】:2011-02-15 17:21:02 【问题描述】:根据内核文档 net.unix.max_dgram_qlen sysctl 控制数据报套接字接收队列的最大长度(对于 AF_UNIX/AF_LOCAL 套接字)。在向该接收者发送呼叫开始阻塞之前,我总是可以发送比该值多 1 的值。有人知道为什么吗?
另外,有谁知道这是否曾经作为套接字选项实现过。 (有点像 SO_SNDBUF 对应 wmem_default 和 wmem_max)。这个thread 提到了这种可能性,但我找不到任何人在哪里做过。
【问题讨论】:
【参考方案1】:1.,就是这样检查的:
static inline int unix_recvq_full(struct sock const *sk)
return skb_queue_len(&sk->sk_receive_queue) > sk->sk_max_ack_backlog;
这就是为什么您可以比您设置的值多发起一个连接。
2.,您传递给listen()的积压参数也用作max_ack_backlog。不过,没有其他方法可以影响它。
【讨论】:
你说的是数据报还是流套接字?我的问题涉及数据报。您是说 max_dgram_qlen (用于数据报)或 backlog 参数(用于流套接字)都映射到 max_ack_backlog 吗?我的问题不是如何检查它(这似乎很清楚),而是为什么检查它为什么?为什么 > 而不是 >=?很难相信没有理由,因为它违反直觉。 listen() 仅适用于流套接字,因此对于数据报,您唯一的选择是 sysctl 旋钮。您说支票违反直觉是对的,但我想这是出于历史原因。以上是关于net.unix.max_dgram_qlen 问题的主要内容,如果未能解决你的问题,请参考以下文章