在TCP连接拆除时,或者当一个进程不再使用该套接字时,要关闭套接字。有两种方式关闭套接字shutdown和close函数。这里介绍下它们的区别。
先说一下close函数。使用close函数并不一定真的关闭了套接字,因为套接字是使用引用计数的。当一个父进程创建了子进程,父进程中的套接字和子进程的套接字是共享的,只是套接字的引用计数增加了。当用close关闭父进程中的套接字时,只是将该套接字的引用计数减一,并不是真正的关闭该套接字,必须直到引用计数为0,即使用该套接字的所有进程都关闭了该套接字时,套接字才会真的关闭。
使用shutdown函数可有关闭连接的读或者写操作。因为TCP连接是全双工的,所以使用shutdown函数可以实现半关闭。函数原型:
#include <sys/socker.h>
int shutdown(int s, int how);
how: SHUT_RD 关闭连接的接收端,不能再接收数据
SHUT_WR 关闭连接的发送端,不能再发送数据
SHUT_RDWR 两端都关闭
将how设置为SHUT_RDWR时来调用shutdown,实际上也没有关闭套接字,即比没有释放套接字及其资源。同时,调用shutdown会影响所有打开了该套接字的进程,这是与close的区别。