当前位置:  开发笔记 > 运维 > 正文

如何检查TCP发送缓冲区的容量以确保数据传输

如何解决《如何检查TCP发送缓冲区的容量以确保数据传输》经验,为你挑选了1个好方法。

我想在我的TCP界面添加发送确认.非阻塞写入可以填充发送缓冲区,但是如果连接失败,数据可能永远不会到达 - 同时写入已报告数据已被接收(由本地套接字).

如果我在堆栈中添加额外的ack,我可以验证收到的每个数据.我认为ftp会这样做.但我不能借用任何人的代码而宁愿不实施ack/resend,特别是因为TCP已经完成了大部分工作.

我认为如果我可以在每次write()之后验证套接字发送缓冲区是否为空,那么可以实现.如果没有更多的数据,它应该已经全部交付.我不介意清空缓冲区的延迟.

编辑:我意识到TCP/socket实现因系统而异,但如果有Berkeley或Linux解决方案,它可能对我有用.

编辑:为了解决一些建议,我想实现三个级别的TCP接口,我不知道如何完成*一个.

对于喜欢危险生活的应用程序,不保证交付的正常TCP.

*TCP验证远程主机的接收,即使数据包从未传递到远程应用程序.这降低了我的大部分连接风险(移动客户端),并且可以在客户端完全实现.我认为如果我可以验证套接字传出缓冲区为空,这可以实现.

应用层ACK和重新发送在TCP或UDP之上实现,以便验证端点.

cnicutar.. 9

实际上,在应用程序级别寻找东西是唯一的方法.以下是一些问题:

当你进行send数据处理时,即使它离开了你的内核,它也会在你TCP收到ACK它之前完成.API不会向您提供此信息.

您的应用程序收到ACK的事实可能意味着:

远程内核(不是应用程序)接收到数据.没有人知道远程进程是否被调用recv.也许它在有机会之前崩溃了recv.

一些代理(许多廉价设备这样做)正在与您交谈,并且正在使用与真实接收器的单独连接.您收到了ACK但是您不知道远程系统是否有它.如果远程系统有它,请阅读上面的子弹.

结论:

您无权访问TCP ACKs

即使你会对他们有所帮助,他们也会毫无用处

所以你需要一个应用程序级别的ACK,但当然没有重传.本ACK应只是告诉你"我收到并处理您的数据".

编辑

我看到你坚持你的想法.SIOCOUTQ按照一些Linux手册页中的描述进行查找.当然它只是Linux,但看看它是否能满足您的需求.



1> cnicutar..:

实际上,在应用程序级别寻找东西是唯一的方法.以下是一些问题:

当你进行send数据处理时,即使它离开了你的内核,它也会在你TCP收到ACK它之前完成.API不会向您提供此信息.

您的应用程序收到ACK的事实可能意味着:

远程内核(不是应用程序)接收到数据.没有人知道远程进程是否被调用recv.也许它在有机会之前崩溃了recv.

一些代理(许多廉价设备这样做)正在与您交谈,并且正在使用与真实接收器的单独连接.您收到了ACK但是您不知道远程系统是否有它.如果远程系统有它,请阅读上面的子弹.

结论:

您无权访问TCP ACKs

即使你会对他们有所帮助,他们也会毫无用处

所以你需要一个应用程序级别的ACK,但当然没有重传.本ACK应只是告诉你"我收到并处理您的数据".

编辑

我看到你坚持你的想法.SIOCOUTQ按照一些Linux手册页中的描述进行查找.当然它只是Linux,但看看它是否能满足您的需求.

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有