是否可以读取为 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)
我有一个应用程序使用 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)