繁体   English   中英

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

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

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

现在,当我调用mg_write()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%保证写入将完全成功,但它给你很好的机会。

我想做的是检查套接字的传出缓冲区,如果它已满,则跳过一个帧。 有没有办法在应用程序级别检查这个?

当然,调用select ()并查看套接字是否选择为ready-for-write。 如果没有,则表示套接字的传出缓冲区已满。 (你可以使用select()的timeout参数强制select()调用立即返回,如果你不想阻塞它,直到套接字准备好读/写/等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM