我工作在一个非阻塞的C tcp套接字的Linux系统。 我读过非阻塞模式,如果没有错误,“send”命令将立即返回“发送的字节”。 我猜这个返回值实际上并不意味着这些数据已经传递到目的地,而是数据已经传递给内核内存进行处理和发送。
如果是这样的话,我的应用程序将如何知道哪个数据包真的被内核发送到另一端,假定networking连接有一些问题,并且内核决定在几分钟内重新尝试几次后才放弃后来?
我问,因为我希望我的应用程序以后重新发送这些失败的数据包。
在Windows Store应用程序中播放.flvvideo
C PF_PACKET链路层处理
在GCC中禁用堆栈保护不起作用
如何避免由于Linux中的信号而中断睡眠呼叫
为什么SharpDX的Direct X内容在使用最大化窗口模式时不能渲染?
调整其他窗口或应用程序c#
为什么C clock()返回0
如何在Linux中限制ac代码的堆大小
C ++应用程序和Java应用程序在Windows操作系统环境下的进程间通信
如果是这样的话,我的应用程序将如何知道哪个数据包真的被内核发送到另一端,假定网络连接有一些问题,并且内核决定在几分钟内重新尝试几次后才放弃后来?
您的应用程序不会知道,除非它能够重新收到接收应用程序,并询问接收应用程序以前收到的数据。
请记住,即使在阻塞I / O的情况下,应用程序也不会阻塞,直到远程应用程序接收到数据 – 它只会阻塞,直到内核的传出数据缓冲区中有一些空间容纳您询问TCP的字节堆栈发送()。 所以即使阻塞I / O你也会面临同样的问题。
另外请记住,您传递的发送的字节数组()与TCP堆栈发出的TCP数据包没有保证1对1的对应关系。 TCP协议栈可以自由地把你的字节打包成任意方式的TCP数据包(例如,来自多个send()调用的数据可以在单个TCP数据包中结束,或者单个send()调用的数据最终可以以多个TCP数据包,或者您能想到的任何其他组合)。 根据网络条件,TCP堆栈可以采取各种不同的方式进行打包,它们唯一的承诺就是以FIFO的顺序接收字节(如果它们被接收到的话)。
无论如何,你的问题的答案是:你不知道,除非你后来问接收程序有什么(或没有得到)。
TCP在内部负责重试,应用程序不需要为它做任何特殊的处理。 如果您希望确认收到TCP堆栈的另一端的数据包,则可以将发送套接字缓冲区( setsockopt(SOL_SOCKET,SO_SNDBUF) )设置为零。 在这种情况下,内核使用您的应用程序缓冲区发送数据,并且在TCP收到此数据的确认之后才释放它。 这样你可以确认数据被推送到TCP栈的接收端。 它不确认应用程序是否已收到数据。 您需要在协议中有应用层确认,以确认数据到达接收方应用程序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。