gpt4 book ai didi

c - 在 C 中查询剩余的套接字发送缓冲区大小?

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:46 24 4
gpt4 key购买 nike

我正在尝试解决在无法使用 splice() 的情况下能够从一个套接字读取然后写入另一个套接字而不会阻塞和缓冲的问题。

作为第一步解决方案,我想到的是查询写入套接字上发送缓冲区的剩余大小,从读取套接字读取那么多,然后在知道我们不能阻塞的情况下将那么多写入写入套接字.

我发现有人在 https://stackoverflow.com/a/9982492/4598583 提出 claim 要查询剩余的缓冲区大小,您可以执行以下操作:

getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &send_buf, &optlen);

但是,我找不到关于 SO_SNDBUF 将返回最大缓冲区大小还是剩余缓冲区大小的引用。

谁能确认是否可以查询剩余的(不是最大的)缓冲区大小?

或者,当写入套接字指示该套接字可写(通过 poll() 或其他某种机制)时,是否定义了最小数据大小,在这种情况下,您可以在不阻塞或截断的情况下写入任何地方?

最佳答案

SO_SNDBUF 不会给您发送缓冲区的剩余大小,而是它的最大大小。这应该是 OS 每次可以发送的最大缓冲区,或者 max send witout blocking。所以无论如何它应该适合您的需要。
来自 Linux 手册:

SO_SNDBUF Sets or gets the maximum socket send buffer in bytes. The kernel doubles this value (to allow space for bookkeeping overhead) when it is set using setsockopt(2), and this doubled value is returned by getsockopt(2). The default value is set by the /proc/sys/net/core/wmem_default file and the maximum allowed value is set by the /proc/sys/net/core/wmem_max file. The minimum (doubled) value for this option is 2048.

关于c - 在 C 中查询剩余的套接字发送缓冲区大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35958990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com