mr_*_*ude 0 sockets ip networking tcp
我想在我的TCP界面添加发送确认.非阻塞写入可以填充发送缓冲区,但是如果连接失败,数据可能永远不会到达 - 同时写入已报告数据已被接收(由本地套接字).
如果我在堆栈中添加额外的ack,我可以验证收到的每个数据.我认为ftp会这样做.但我不能借用任何人的代码而宁愿不实施ack/resend,特别是因为TCP已经完成了大部分工作.
我认为如果我可以在每次write()之后验证套接字发送缓冲区是否为空,那么可以实现.如果没有更多的数据,它应该已经全部交付.我不介意清空缓冲区的延迟.
编辑:我意识到TCP/socket实现因系统而异,但如果有Berkeley或Linux解决方案,它可能对我有用.
编辑:为了解决一些建议,我想实现三个级别的TCP接口,我不知道如何完成*一个.
实际上,在应用程序级别寻找东西是唯一的方法.以下是一些问题:
当你进行send数据处理时,即使它离开了你的内核,它也会在你TCP收到ACK它之前完成.API不会向您提供此信息.
您的应用程序收到ACK的事实可能意味着:
recv.也许它在有机会之前崩溃了recv.结论:
TCP ACKs所以你需要一个应用程序级别的ACK,但当然没有重传.本ACK应只是告诉你"我收到并处理您的数据".
我看到你坚持你的想法.SIOCOUTQ按照一些Linux手册页中的描述进行查找.当然它只是Linux,但看看它是否能满足您的需求.