是否可以读取为 TCP 写入套接字缓冲的字节数?

Is it possible to read the number of bytes buffered for a TCP write socket?

我有一个应用程序使用 civetweb(以前称为 mongoose)HTTP 服务器库来创建 MJPEG 流。当我的 MJPEG 设置与客户端连接的网络带宽配置文件相匹配时工作正常,但有时我们有一个低带宽连接,我想通过丢帧来适应。

现在当我调用 mg_write() 时,猫鼬库会这样调用 send()

send(sock, buf + sent, (size_t) k, MSG_NOSIGNAL);

我想做的是检查套接字的传出缓冲区,如果已满,则跳过一帧。有什么方法可以在应用程序级别进行检查吗?

编辑:只是对 MJPEG 人员的旁注,这些 TCP 缓冲区非常大,我实际最终测量的只是缓冲区中是否存在任何字节。如果多于零,我跳过一帧。

您可以在 Linux 上使用 ioctl(以及其他系统上的类似界面):

#include <linux/sockios.h>

size_t sb_sz = sizeof(sock_buffer_size);
ioctl(sock, SIOCOUTQ, &bytes_in_queue);
getsockopt(sock, SOL_SOCKET, SO_SNDBUF, &sock_buffer_size, &sb_sz);
size_t bytes_available = sock_buffer_size - bytes_in_queue;

请注意,它仍然不能 100% 保证写入会完全成功,但它给了您很大的机会。

What I'd like to do is check the outgoing buffer of the socket, and if it's full, skip a frame. Is there any way to check this at the application level?

当然,调用 select() 并查看套接字 select 是否准备好写入。如果没有,则意味着套接字的传出缓冲区已满。 (您可以使用 select() 的超时参数强制 select() 立即调用 return,如果您不希望它阻塞直到套接字准备好 read/write/etc)