golang 有没有办法获取当前 TCP 发送缓存区剩余空间。

2022-03-23 17:25:15 +08:00
 wlgqa

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

3611 次点击
所在节点    Go 编程语言
27 条回复
MidGap
2022-03-23 17:34:11 +08:00
net.Conn.Write()会返回写了多少
wlgqa
2022-03-23 17:36:54 +08:00
@MidGap 这样只知道缓存是否写满。
proxytoworld
2022-03-23 17:54:27 +08:00
这是内核层了吧
guaji123
2022-03-23 17:54:44 +08:00
好久没写过底层代码了,请教下 C 语言能做到吗 ?
ysc3839
2022-03-23 18:01:04 +08:00
SO_SNDBUF?
est
2022-03-23 18:05:04 +08:00
可以通过反射 getsockopt 读 SOCK_INFO 获取缓冲区有多大,写了多少这个。。。。真不知道。
Buges
2022-03-23 18:11:58 +08:00
你要在乎这个就别用 go ,不讲究才符合 go 的理念。
wlgqa
2022-03-23 18:20:28 +08:00
@Buges 请这位大神牛,给我们讲讲自己写过啥著名 go 项目
CEBBCAT
2022-03-23 18:30:16 +08:00
获取缓存区剩余大小是做什么用的呢?
Buges
2022-03-23 18:32:53 +08:00
@wlgqa 阴阳怪气个啥,go 就是这样子的啊,为了保持“简单性”,把 go 团队认为不重要的“细节”能隐藏则隐藏能默认则默认。你要是想精确地控制细节或确保代码的准确性,建议你换 rust 。
可以参考一下 go 是如何“解决”时间单调性问题的:
https://github.com/golang/go/issues/12914
jim9606
2022-03-23 18:37:11 +08:00
如果 C 可以,那 golang 应该可以通过获取 fd 之后用 C 相同的方法查询。这个肯定是特定 OS 耦合的方法。
C 使用 getsockopt TCP_INFO 能获得一些状态信息。
不过我觉得你都用 go 了,不应该用这种方式应对写阻塞。
airqj
2022-03-23 18:51:13 +08:00
这个应该跟语言无关了
bruce0
2022-03-23 18:54:37 +08:00
如果 C 能做的话, go 应该可以通过 syscall 实现, 前提是 go 有对应的系统调用
ManjusakaL
2022-03-23 19:13:37 +08:00
和 Go 无关啊。。。走 NETLINK 的 TCP-DIAG 能拿

https://github.com/vishvananda/netlink

倒是有个还不错的封装
xdeng
2022-03-23 19:31:05 +08:00
用 go 为啥会有这个需求,go 的 tcp_nodelay 默认为真的。
wlgqa
2022-03-23 20:27:05 +08:00
@Buges 大神啊,请教 Rust 怎么实现这个需求。大神还给标准库 time 提交过代码?
vance123
2022-03-23 20:51:56 +08:00
首先要看内核层是否提供了这个接口,没提供的话应用层是毫无办法的
fireleaves
2022-03-23 21:27:56 +08:00
我没有理解为什么 op 会对 @Buges 穷追不舍。
Buges 措辞上可能有点歧义,但是表达的意思应该没有恶意吧。在补充的回复甚至给出了一个佐证,我自问是做不到他这样被“怼”了之后还能如此回复的。
masterclock
2022-03-23 21:42:02 +08:00
同不理解,@Buges 措辞上似乎也没啥歧义,go 就是这思路啊,用合适的工具做合适的事情挺好
zhs227
2022-03-23 22:49:11 +08:00
golang 自己写代码通过 syscall 调用 getsockopt 来实现。初步估计 golang 自身的 tcp 库可能没有这个功能。TCPConn 一共就一二十个方法。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/842415

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX