我想在我的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
ACK
s
即使你会对他们有所帮助,他们也会毫无用处
所以你需要一个应用程序级别的ACK,但当然没有重传.本ACK
应只是告诉你"我收到并处理您的数据".
我看到你坚持你的想法.SIOCOUTQ
按照一些Linux手册页中的描述进行查找.当然它只是Linux,但看看它是否能满足您的需求.
实际上,在应用程序级别寻找东西是唯一的方法.以下是一些问题:
当你进行send
数据处理时,即使它离开了你的内核,它也会在你TCP
收到ACK
它之前完成.API不会向您提供此信息.
您的应用程序收到ACK的事实可能意味着:
远程内核(不是应用程序)接收到数据.没有人知道远程进程是否被调用recv
.也许它在有机会之前崩溃了recv
.
一些代理(许多廉价设备这样做)正在与您交谈,并且正在使用与真实接收器的单独连接.您收到了ACK但是您不知道远程系统是否有它.如果远程系统有它,请阅读上面的子弹.
结论:
您无权访问TCP
ACK
s
即使你会对他们有所帮助,他们也会毫无用处
所以你需要一个应用程序级别的ACK,但当然没有重传.本ACK
应只是告诉你"我收到并处理您的数据".
我看到你坚持你的想法.SIOCOUTQ
按照一些Linux手册页中的描述进行查找.当然它只是Linux,但看看它是否能满足您的需求.