我如何获得在 unix 域套接字中排队的数据报数量

Posted

技术标签:

【中文标题】我如何获得在 unix 域套接字中排队的数据报数量【英文标题】:how do i get amount of datagram queued in a unix domain socket 【发布时间】:2016-10-24 16:30:12 【问题描述】:

我需要获取在 unix 数据报套接字中排队/等待但尚未接收的数据报数量。我看到 max_dgram_qlen 给出了可以在接收缓冲区中排队的最大数据报,之后它将被阻塞。 但是,有没有办法通过一些套接字选项或通过读取一些 linux 文件来确定有多少数据报已经排队等待 unix 数据报套接字。请告诉我。谢谢。

【问题讨论】:

请注意,当您真正有机会对该值进行任何操作时,您获得的任何值可能已经是错误/过时的。你最好想出一个不依赖这些信息的设计。 【参考方案1】:

阅读/proc/net/udp

来自man page:

/proc/net/udp

保存 UDP 套接字表的转储。除了调试之外,大部分信息都没有用处。 “sl”值是内核哈希 套接字的插槽,“local_address”是本地地址和端口 数对。 “rem_address”是远程地址和端口号 对(如果已连接)。 “St”是套接字的内部状态。 该 "tx_queue" 和 "rx_queue" 是传出和传入的数据队列 内核内存使用方面。 “tr”、“tm->when”和“rexmits” UDP 不使用字段。 “uid”字段保存有效的 UID 套接字的创建者。格式为:

sl  local_address rem_address   st tx_queue rx_queue tr rexmits  tm->when uid
1: 01642C89:0201 0C642C89:03FF 01 00000000:00000001 01:000071BA 00000000 0
1: 00000000:0801 00000000:0000 0A 00000000:00000000 00:00000000 6F000100 0
1: 00000000:0201 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0

【讨论】:

以上是关于我如何获得在 unix 域套接字中排队的数据报数量的主要内容,如果未能解决你的问题,请参考以下文章

Beats:将 Unix 域套接字中的数据索引到 Elastic Stack

Beats:将 Unix 域套接字中的数据索引到 Elastic Stack

unix进程间通信方式(下)-unix域套接字(转)

如何确定打开的套接字是 TCP 还是 unix 域套接字?

《Unix 网络编程》15:Unix 域协议

UNIX域协议(命名套接字)