Linux 数据报Unix域套接字受SNDBUF限制

Linux 数据报Unix域套接字受SNDBUF限制,linux,sockets,dns,datagram,setsockopt,Linux,Sockets,Dns,Datagram,Setsockopt,通过Unix数据报域套接字发送16字节数据包,SNDBUF保留在我的框124928上的默认值,并通过getsockopt验证。还将max_dgram_qlen的最大值提高到了512。出于测试目的,我的接收器在绑定到Unix数据报域套接字后当前处于休眠状态 当我启动发送器时,我在发送423个数据包后开始接收EAGAIN错误,我正在使用MSG_DONTWAIT发送数据包。当时我只发送了大约7k,不包括任何标题,考虑到SNDBUF的当前设置,填充它似乎有点早 为了验证限制发送的确实是SNDBUF,我逐

通过Unix数据报域套接字发送16字节数据包,SNDBUF保留在我的框124928上的默认值,并通过getsockopt验证。还将max_dgram_qlen的最大值提高到了512。出于测试目的,我的接收器在绑定到Unix数据报域套接字后当前处于休眠状态

当我启动发送器时,我在发送423个数据包后开始接收EAGAIN错误,我正在使用MSG_DONTWAIT发送数据包。当时我只发送了大约7k,不包括任何标题,考虑到SNDBUF的当前设置,填充它似乎有点早

为了验证限制发送的确实是SNDBUF,我逐渐增加了SNDBUF,直到它能够达到max_dgram_qlen,实际上它达到了513。我必须为此设置的SNDBUF值是getsockopt返回的75177 151554


如果您有任何想法,我将不胜感激,因为我觉得这里似乎遗漏了一些显而易见的东西。

一个16字节的数据包有8字节的UDP报头开销,当它离开IP层时,也有20字节的IP报头开销。因此,您需要将“7k不包括任何标头”修改为10.5k,包括UDP标头。max_dgram_qlen似乎是用于接收,而不是发送。即使有这样的开销,我仍然希望它能放在原始缓冲区中。max_dgram_qlen仍然发挥作用,如果从sendto调用排队的数据包的数量在排队的数据包的总大小达到SNDBUF之前达到此值,您仍然会得到EAGAIN错误。请引用。我找不到任何有信誉的东西说这是为了接收以外的东西。有一个建议是,如果你在接收端超过了max_dgram_qlen,发送方就会阻止,但这就是问题的症结所在。当然,所有这些都只涉及Unix域套接字。不反对您的声明,即它只适用于receive,但我们发现它也是在线的。我的发送方打开一个数据报Unix域套接字,不绑定,但执行sendto操作,目标是我的接收方绑定到的套接字。在这种情况下,如果使用MSG_DONTWAIT,我的发送方将阻止或返回EAGAIN,如果它达到发送的总字节数加上开销达到SNDBUF或等待在该套接字上处理的数据报数,则我的接收方绑定的数据报达到max_dgram_qlen值。