有没有办法限制发送队列中的UDP数据包数量?!
喜欢
setsockopt(SO_SOCK, SO_SND_QUEUE_DGRAMS, value, length)
如果是这样,如果队列已满,行为会怎样?丢弃数据包,或等待队列将数据包传输到网络
答案 0 :(得分:1)
要更改内核发送套接字缓冲区的大小(在字节中),请使用SO_SNDBUF
。
默认行为是阻止,但您可以对此进行修改,以使套接字无阻塞(SOCK_NONBLOCK
调用时使用socket
选项)。否则,您可以通过O_NONBLOCK
来设置fcntl
。
然后,您将收到错误代码EAGAIN/EWOULDBLOCK
,而不是阻止send
来电。
您还可以使用select
或poll
系统调用来控制等待。
还有ioctl
次调用来检查队列中的当前字节数,例如接收队列的TIOCINQ
或发送队列的TIOCOUTQ
。
请注意,同样,因为您使用的是UDP,所以上述任何一种都不能保证通过网络传送,因为路径中的任何其他节点都可能丢弃数据包。以上仅保证源节点不会因缓冲区溢出而丢失。
[通常]更有用的是使用SO_RCVBUF
增加相应的内核接收缓冲区的大小,以允许在没有内核丢弃的情况下接收大突发。由于UDP,这不保证本地节点不丢弃任何东西,但它可以限制丢弃的数量。