[程序员] 关于 socket 的 shutdown close 函数的几个疑问?

  1. 调用 close 函数,并不会实际意义地马上执行 close (这是不是有点反常识了?),比如两个进程 共享一个 socket 的 fd ,那么第二个调用 close 的进程,才会马上 发送 FIN 包。

  2. 最后一个调用 close 的进程执行的动作 和 shutdown(SHUT_RDWR) 的唯一区别,就是 后者没有关闭描述符。

  3. 最后一个调用 close 的进程执行的动作 和 shutdown(SHUT_RDWR) 的相同点:都会马上发送一个 FIN 包,都会在应用程序层次上关闭读操作(这对应到第 5 点)。

  4. 最后一个调用 close 的进程执行的动作、调用 shutdown(SHUT_WR)、shutdown(SHUT_RDWR) ,都会 马上发送一个 FIN 包出去。

  5. 我理解是没有真正意义上的 shutdown(SHUT_RD),因为你无法阻止对方传数据过来,所以 shutdown(SHUT_RD)只是 象征性 关闭了读,内核其实还在接受数据,只是内核会直接丢弃掉数据,不让应用程序有机会读到。

  6. 基于上一点,如果我调用了 shutdown(SHUT_RD),内核会把对方发来的普通数据都给丢弃掉,即使对方一直会源源不断地一直发数据过来。但如果是 对方发来的是一个 FIN 包呢,此时 内核会 返回一个 对应的 ACK 包回去吗?

大佬们,看看我这些理解对吗,望指点一下

发表评论

您的电子邮箱地址不会被公开。