当数据包传递永久失败时,TCP/IP如何报告错误?我看到的所有Socket.write()API都只是将字节传递给底层TCP/IP输出缓冲区并异步传输数据.如果数据包传递永久失败(即目标主机不再可访问),TCP/IP如何通知开发人员?
任何要求发送方等待远程端确认的协议都会收到错误消息.但是对于发送方不必从目标读取任何字节的协议会发生什么?TCP/IP是否只是默默地失败?也许Socket.close()会返回错误?TCP/IP规范是否说明了这一点?
TCP/IP是一种可靠的字节流协议.您的所有字节都将到达接收器,否则您将收到错误指示.
错误指示将以闭合插座的形式出现.无论通信模式(发送者是谁),如果无法传递字节,套接字将关闭.
所以问题是,你如何看待套接字关闭?如果你从来没有读过,你最终会在尝试写入已关闭的套接字时遇到错误(我认为使用ECONNRESET错误).
如果您需要在另一个文件句柄上休眠或等待输入,您可能希望在select()调用中等待,其中您将套接字包含在您正在等待的源列表中(即使您从未预料到)收到任何东西).如果select()指示套接字已准备好进行读取调用,则可能会返回-1(我认为使用ECONNRESET).EOF表示有序关闭(另一方执行关闭()或关闭().
如何区分这个错误关闭干净关闭(例如,其他程序退出)?errno值可能足以将错误与有序关闭区分开来.
如果您想要明确指出问题,您可能需要在套接字层之上构建某种应用程序级协议.例如,接收方发送给发送方的短"ack"消息.然后违反更高级别的应用程序协议(发件人没有看到确认)将确认它是一个错误关闭与干净关闭.