调用 close 函数,并不会实际意义地马上执行 close (这是不是有点反常识了?),比如两个进程 共享一个 socket 的 fd ,那么第二个调用 close 的进程,才会马上 发送 FIN 包。
最后一个调用 close 的进程执行的动作 和 shutdown(SHUT_RDWR) 的唯一区别,就是 后者没有关闭描述符。
最后一个调用 close 的进程执行的动作 和 shutdown(SHUT_RDWR) 的相同点:都会马上发送一个 FIN 包,都会在应用程序层次上关闭读操作(这对应到第 5 点)。
最后一个调用 close 的进程执行的动作、调用 shutdown(SHUT_WR)、shutdown(SHUT_RDWR) ,都会 马上发送一个 FIN 包出去。
我理解是没有真正意义上的 shutdown(SHUT_RD),因为你无法阻止对方传数据过来,所以 shutdown(SHUT_RD)只是 象征性 关闭了读,内核其实还在接受数据,只是内核会直接丢弃掉数据,不让应用程序有机会读到。
基于上一点,如果我调用了 shutdown(SHUT_RD),内核会把对方发来的普通数据都给丢弃掉,即使对方一直会源源不断地一直发数据过来。但如果是 对方发来的是一个 FIN 包呢,此时 内核会 返回一个 对应的 ACK 包回去吗?
大佬们,看看我这些理解对吗,望指点一下
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.