限制发送队列中的udp数据包数量

时间:2018-04-18 18:54:56

标签: c sockets

有没有办法限制发送队列中的UDP数据包数量?!

喜欢

setsockopt(SO_SOCK, SO_SND_QUEUE_DGRAMS, value, length)

如果是这样,如果队列已满,行为会怎样?丢弃数据包,或等待队列将数据包传输到网络

1 个答案:

答案 0 :(得分:1)

要更改内核发送套接字缓冲区的大小(在字节中),请使用SO_SNDBUF

默认行为是阻止,但您可以对此进行修改,以使套接字无阻塞(SOCK_NONBLOCK调用时使用socket选项)。否则,您可以通过O_NONBLOCK来设置fcntl

然后,您将收到错误代码EAGAIN/EWOULDBLOCK,而不是阻止send来电。

您还可以使用selectpoll系统调用来控制等待。

还有ioctl次调用来检查队列中的当前字节数,例如接收队列的TIOCINQ或发送队列的TIOCOUTQ

请注意,同样,因为您使用的是UDP,所以上述任何一种都不能保证通过网络传送,因为路径中的任何其他节点都可能丢弃数据包。以上仅保证源节点不会因缓冲区溢出而丢失。

[通常]更有用的是使用SO_RCVBUF增加相应的内核接收缓冲区的大小,以允许在没有内核丢弃的情况下接收大突发。由于UDP,这保证本地节点丢弃任何东西,但它可以限制丢弃的数量。