shutdown 和 close关闭tcp链接的介绍网上有不少,主要区别以下:html
一、调用close后,将停止通讯、删除套接字、丢弃数据。可是,注意喽,可是,若是有多个进程共享一个套接字,close每被调用一次,计数减1,直到计数为0时,也就是所用进程都调用了close,套接字将被释放socket
二、close 关闭了自身数据传输的两个方向(当引用数为0)。tcp
三、shutdown可直接关闭描述符,不考虑描述符的引用数,可选择停止一个方向的链接。测试
但当调用close或者shutdown时在系统底层发生了什么了?google
通过google和测试得出结论以下:.net
一、调用close(引用数为0),tcp协议栈发送fin消息给对端;3d
二、调用shutdown(fd, SHUT_RDWR)同close,但不计多个进程引用数,直接关闭;unix
三、调用shutdown(fd, SHUT_RD), 使阻塞的read(fd,)马上返回0;不发送fin消息;htm
以下图所示:每read一次sleep(1); 10s后对端发送消息,仍是能够读到的,只是否是使read阻塞。blog
四、调用shutdown(fd, SHUT_WR),发送fin消息给对端,但仍可接收对端消息;
http://bbs.chinaunix.net/thread-2178020-1-1.html
http://stackoverflow.com/questions/740817/behavior-of-shutdownsock-shut-rd-with-tcp
http://stackoverflow.com/questions/4160347/close-vs-shutdown-socket