shutdown vs close

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

相关文章
相关标签/搜索