繁体   English   中英

发送数据时异步tcp套接字和进度

[英]async tcp socket and progress when sending data

我在我的C ++代码中使用基于http的文件上传(在linux / android上运行)。 我使用异步tcp套接字写入文件数据。 我的问题是,进度条反映的是写入套接字的内容,而不是实际发送到网络上的内容。 对于慢速链接,问题变得很明显,在100%发送进度通知和发送完整消息之间需要数十秒(有时是一分钟)。

我不修改SO_SNDBUF,在我的情况下为35KB(由getsockopt查询)。 如何修复进度通知以正确反映当前传输状态? 有没有办法查询仍然保留在缓冲区中的数据大小? 有没有一种方法可以获取有关传输进度的TCP通知(由远程套接字确认)?

您将无法知道此缓冲区的当前大小,因为它位于内核区域中,并且没有已知的/已记录的ioctl来告知其大小。 即使您知道它,它也不是便携式的,因此我认为这不是解决此问题的好方法。

您可以:

  • 估算整个传输期间的数据速率,以便最后计算此SO_SNDBUF缓冲区的剩余时间

  • 使用第三方库,其中将包括先前的计算!

编辑:在对《 TCP/IP Architecture, Design & Implementation in Linux中的TCP/IP Architecture, Design & Implementation in Linux 》一书进行了研究之后,我已经看到了用于TCP套接字监视的NETLINK_TCPDIAG选项。 Netlink套接字是内核和用户域之间的IPC方法。 不幸的是,对于NETLINK_TCPDIAG选项,没有详细信息……我只知道您必须创建一个这样的套接字: int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_TCPDIAG)和原始套接字创建需要root特权。

之后,您唯一的朋友似乎是linux/net/ipv4/tcp_diag.chttp://www.cs.fsu.edu/~baker/devices/lxr/http/ident?v=2.6.11.8;i= NETLINK_TCPDIAG )... Google上没有关于这种协议的任何信息...祝您好运!

暂无
暂无

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

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