Golang Go语言中有没有办法获取当前 TCP 发送缓存区剩余空间

发布于 1周前 作者 wuwangju 来自 Go语言

例如 TCP 发送缓冲区 10k,已经写了 8K ,剩余 2K 。有办法获取吗。


Golang Go语言中有没有办法获取当前 TCP 发送缓存区剩余空间
28 回复

net.Conn.Write()会返回写了多少

更多关于Golang Go语言中有没有办法获取当前 TCP 发送缓存区剩余空间的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这样只知道缓存是否写满。

这是内核层了吧

好久没写过底层代码了,请教下 C 语言能做到吗 ?

可以通过反射 getsockopt 读 SOCK_INFO 获取缓冲区有多大,写了多少这个。。。。真不知道。

你要在乎这个就别用 go ,不讲究才符合 go 的理念。

请这位大神牛,给我们讲讲自己写过啥著名 go 项目

获取缓存区剩余大小是做什么用的呢?

阴阳怪气个啥,go 就是这样子的啊,为了保持“简单性”,把 go 团队认为不重要的“细节”能隐藏则隐藏能默认则默认。你要是想精确地控制细节或确保代码的准确性,建议你换 rust 。
可以参考一下 go 是如何“解决”时间单调性问题的:
https://github.com/golang/go/issues/12914

如果 C 可以,那 golang 应该可以通过获取 fd 之后用 C 相同的方法查询。这个肯定是特定 OS 耦合的方法。
C 使用 getsockopt TCP_INFO 能获得一些状态信息。
不过我觉得你都用 go 了,不应该用这种方式应对写阻塞。

这个应该跟语言无关了

如果 C 能做的话, go 应该可以通过 syscall 实现, 前提是 go 有对应的系统调用

和 Go 无关啊。。。走 NETLINK 的 TCP-DIAG 能拿

https://github.com/vishvananda/netlink

倒是有个还不错的封装

用 go 为啥会有这个需求,go 的 tcp_nodelay 默认为真的。

大神啊,请教 Rust 怎么实现这个需求。大神还给标准库 time 提交过代码?

首先要看内核层是否提供了这个接口,没提供的话应用层是毫无办法的

我没有理解为什么 op 会对 穷追不舍。
Buges 措辞上可能有点歧义,但是表达的意思应该没有恶意吧。在补充的回复甚至给出了一个佐证,我自问是做不到他这样被“怼”了之后还能如此回复的。

同不理解,@Buges 措辞上似乎也没啥歧义,go 就是这思路啊,用合适的工具做合适的事情挺好

golang 自己写代码通过 syscall 调用 getsockopt 来实现。初步估计 golang 自身的 tcp 库可能没有这个功能。TCPConn 一共就一二十个方法。

这个没弄过,虽然写过几个 socket 程序

不过为啥有这个需求,实际上缓冲区(特别是发送),变化非常快,对端如果没阻塞的话

不要再怼认真回答你问题的人了
另外建议你讲一下原始需求

做不到难道不是一种回答?(不论这个回答正确与否)

golang 当然是可以的啊, 手动实现一个 TCP/IP 栈就可以了

什么阴阳人

TCP 缓冲区大小在内核是随时变化的。即便有接口让你拿到当前缓冲区大小,在系统调用返回之前,这个值也可能发生变化。
这个没啥用啊。

如果你担心数据延迟,就不应该使用 TCP 协议。
如果你担心 Write 阻塞,你可以用非阻塞操作,或者异步 io 类操作。

你能再更详细的描述一下你的需求吗?

ss -tm 就可以看

在 Golang 中,直接获取当前 TCP 发送缓存区(send buffer)的剩余空间并不是通过标准库直接提供的接口来完成的。TCP 发送缓存区的管理主要由操作系统内核负责,而 Go 的 net 包主要提供了高层次的网络编程接口,并未直接暴露底层 TCP 连接的详细状态信息。

然而,你可以通过一些间接的方式来获取相关信息,比如:

  1. 系统调用:在某些操作系统上,你可以使用系统调用或特定的库来获取 TCP 连接的状态信息,包括发送缓存区的使用情况。这通常需要使用 CGO 或者调用外部命令(如 netstatss)并解析其输出。

  2. 监控和统计:使用系统的网络监控工具或库(如 Prometheus 与其 netstat_exporter)来监控 TCP 连接的状态,这些工具可以定期抓取并报告网络连接的详细统计信息。

  3. 调整发送缓存区大小:虽然不能直接获取剩余空间,但你可以通过 SetWriteBuffer 方法调整 TCP 连接的发送缓存区大小,以间接管理发送缓存区的使用。

需要注意的是,直接依赖操作系统层面的细节可能会带来跨平台兼容性问题,因此在设计系统时,应谨慎考虑是否需要通过这种方式获取 TCP 发送缓存区的剩余空间,并评估其必要性和风险。

回到顶部