异步tcp套接字和发送数据时的进度 我在我的C++代码中使用HTTP文件上传(在Linux / Android上运行)。我使用异步tcp套接字来写入文件数据。我的问题是,我的进度条反映了已写入套接字的内容,而不是实际发送到线路上的内容。当100%发送进度通知和发送完整消息之间需要数十秒(有时超过一分钟)的慢链接时,问题变得很明显

异步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缓冲区的剩余时间 使用第三方库,其

我不修改sou SNDBUF,在我的例子中它是35KB(由getsockopt查询)。如何修复进度通知以正确反映当前传输状态?有没有办法查询仍保留在缓冲区中的数据的大小?有没有办法获取有关传输进度的TCP通知(由远程套接字确认)?

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

您可以:

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

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

编辑:在《TCP/IP体系结构,Linux中的设计与实现》一书中进行了一些研究之后,我看到了用于TCP套接字监控的
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
()。。。谷歌上没有关于这种协议的内容。。。祝你好运