异步tcp套接字和发送数据时的进度 我在我的C++代码中使用HTTP文件上传(在Linux / Android上运行)。我使用异步tcp套接字来写入文件数据。我的问题是,我的进度条反映了已写入套接字的内容,而不是实际发送到线路上的内容。当100%发送进度通知和发送完整消息之间需要数十秒(有时超过一分钟)的慢链接时,问题变得很明显
我不修改sou SNDBUF,在我的例子中它是35KB(由getsockopt查询)。如何修复进度通知以正确反映当前传输状态?有没有办法查询仍保留在缓冲区中的数据的大小?有没有办法获取有关传输进度的TCP通知(由远程套接字确认)?您将无法知道此缓冲区的当前大小,因为它位于内核区,并且没有已知/记录的ioctl来告诉它的大小。即使你知道,它也不会便携,因此我认为这不是解决这个问题的好方法 您可以:异步tcp套接字和发送数据时的进度 我在我的C++代码中使用HTTP文件上传(在Linux / Android上运行)。我使用异步tcp套接字来写入文件数据。我的问题是,我的进度条反映了已写入套接字的内容,而不是实际发送到线路上的内容。当100%发送进度通知和发送完整消息之间需要数十秒(有时超过一分钟)的慢链接时,问题变得很明显,c++,linux,asynchronous,tcp,asyncfileupload,C++,Linux,Asynchronous,Tcp,Asyncfileupload,我不修改sou SNDBUF,在我的例子中它是35KB(由getsockopt查询)。如何修复进度通知以正确反映当前传输状态?有没有办法查询仍保留在缓冲区中的数据的大小?有没有办法获取有关传输进度的TCP通知(由远程套接字确认)?您将无法知道此缓冲区的当前大小,因为它位于内核区,并且没有已知/记录的ioctl来告诉它的大小。即使你知道,它也不会便携,因此我认为这不是解决这个问题的好方法 您可以: 估计整个传输过程中的数据速率,以便在最后计算此SO_SNDBUF缓冲区的剩余时间 使用第三方库,其
- 估计整个传输过程中的数据速率,以便在最后计算此SO_SNDBUF缓冲区的剩余时间
- 使用第三方库,其中将包括以前的计算
NETLINK\u TCPDIAG
选项。Netlink sockets是内核和用户之间的一种IPC方法。不幸的是,对于NETLINK\u TCPDIAG
选项,没有详细信息。。。我只知道您必须创建这样的套接字:int fd=socket(AF\u NETLINK,SOCK\u RAW,NETLINK\u TCPDIAG)
并且原始套接字创建需要根权限
在那之后,你唯一的朋友似乎是
linux/net/ipv4/tcp_diag.c
()。。。谷歌上没有关于这种协议的内容。。。祝你好运你考虑使用一些HTTP客户端库吗?如果没有,原因是什么?@BasileStarynkevitch它是大型代码库的一部分,包含所有这些代码以及更多内容。这是不现实的,采取每一个其他的lib做这项工作有可能从代码中使用netstat实用程序,看看是如何填充sou SNDBUF的?如果内容字节数持续增加,你的传输速率就会受到影响。只是一个想法。这是我从实验中看到的。问题是,由于移动链路速度极慢,可以随机更改缓冲的最后20K发送,因此可能需要任意时间。在我的情况下,我有一个错误报告,它几乎花了一分钟。我认为应该有一种方法从TCP堆栈获取关于远程接收状态的通知。TCP stack在内部执行所有检查,我不明白为什么不能通知userland代码有关TCP进度。因为我发现了一些关于TCP监控的信息,所以我编辑了我的响应;)