close 和 shutdown

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoyilong2007101095/article/details/86522764

close和shutdown都是关闭套接字的系统调用函数

区别如下:

先说包交互流程:

close会直接发送FIN包,并且(一般情况)不再接收对方发送的任何报文,如果有收到报文会回复RST。

shutdown有三类情况:

1,在参数是SHUT_RD,也就是只关闭了读的时候,是不会发送任何表明关闭了读的协议报文的。同时对端还可以发送报文,本端也会回复ack,但是本端在用系统调用recv是收不到报文的,确切的说是:先以SHUT_RD调用了shutdown,再后面recv的时候是直接返回ret=0的,不管是阻塞还是非阻塞。

2,在参数是SHUT_WR,也就是只关闭了写的时候,会发送FIN报文,通知对端(关闭了写,其实没有明确flag表明是写)。对端的协议栈也会直接回复对FIN的ACK的,同时对端的socket状态会在协议栈发送了ack后变成CLOSE_WAIT。但是对端可以继续发送报文,然后本端也可以继续接收报文。

3,在参数是SHUT_RDWR,也就是关闭了读写的时候,会发送FIN报文,通知对端(关闭了读写,没有明确flag表明是读写)。对端的协议栈也会直接回复对FIN的ACK的,同时对端的socket状态会在协议栈发送了ack后变成CLOSE_WAIT。但是如果对端继续发送报文,那么主动关闭的一方会直接回RST的。

作用方式(没有亲测,查阅得知):

close关闭其实是减少计数,假如有dup过,那么并不会完全关闭套接字。

shutdown会直接根据参数对socket执行操作,而不管是不是dup过。

猜你喜欢

转载自blog.csdn.net/xiaoyilong2007101095/article/details/86522764