作者回复: 正解。
作者回复: 这里是从应用层报文数据角度出发来说的,因为数据是一个流,没有办法判断数据的哪些部分没对端收到。
从TCP角度来说,确实是通过ACK来感知TCP包的接收情况的。
作者回复: 基本和我的Linux下结果一致。
作者回复: 为啥要区分这两种情况呢?程序这端都是连接无效,无法进行数据的有效传输。
作者回复: 一个是TCP RST的状态异常,一个是SIGPIPE 信号将进程进行回收。
作者回复: 这个问题很大。。。。
作者回复: kill掉A进程后,B进程如果收不到FIN包,它的却能保持ESTABLISHED状态,通过对链路进行读写可以感知链路的状态,当然,你也可以加上心跳检测,检测出链路的状态。
作者回复: 如文中所说,我在MAC系统上实验的结果却是是SIGPIPE,但是在Linux 4.4内核上的实验结果却是直接返回了RST结果,传统教科书都是说应该返回SIGPIPE,但是我得到的Linux 4.4上的结果却不是这样的。
我建议你通过实验再尝试一下。
作者回复: 到现在为止,都是阻塞的,后面会切成非阻塞的。
作者回复: 休眠4秒之后往一个已经关闭的套接字记下写数据,于是得到了SIGPIPE信号。
作者回复: 是打印出来的error信息,
if (err)
fprintf(stderr, ": %s (%d)\n", strerror(err), err);
作者回复: 这就是为什么需要使用select、poll等事件分发机制,正确的解法是一旦有事件发生,比如这里read读到EOF,就应用直接去处理此类事件,而不是阻塞在这里等待用户的输入。好消息是,很快我们就会详细学习这部分内容了。
作者回复: 我猜想是会直接关闭的,没有对ACK的ACK包。
作者回复: 你已经回答自己的问题了,当然是新的连接。
作者回复: 因为TCP是双向的,对端是一个相对的概念,连接建立之后,服务器和客户端彼此互为对方的对端。
建议你再多理几遍,欢迎提具体的问题。
作者回复: 这里想要表达的就是通过read/write来感知TCP链路的状态,一个是通过read来感知,一个是在没有read的情况下使用write来感知。