?一、close与shutdown 的区别: 1、close终止了数据传送的两个方向;?这个函数会对套接字引用计数减一,一旦发现套接字引用计数到 0,就会对套接字进行彻底释放,并且会关闭 TCP 两个方向的数据流。 2、shutdown 可以有选择的终止某个方向的数据传送或者数据传送的两个方向、
二、shutdown 如果howto=1(SHUT_WR),就可以保证对等方接收到一个EOF字符,而不管其他进程是否已经打开了套接字(不管引用计数是否为1都激发TCP的正常终止连接)。shutdown直接使得该套接字不可用,如果有别的进程企图使用该套接字,将会受到影响。而close不能保证(详见下面三中的例子,conn引用计数减为0才关闭),直到套接字引用计数减为0时才发送。也就是说直到所有的进程都关闭了套接字。
三、 int shutdown(int sockfd,int howto) howto=SHUT_RD (0)关闭连接的读的一半,不再接收数据 howto=SHUT_WR (1)关闭连接的写的一半, howto=SHUT_RDWR(2)
例子:
int conn;
pid_t pid=fork();
if(pid==-1)
ERR_EXIT("fork");
if(pid==0) //子进程
{
//通信
//....
//子进程使用完conn,close(conn) 引用计数减为0,这时才会向双方发送FIN段。
close(conn);
} else if(pid>0) //父进程
{
//父进程不会向客户端发送FIN.要考虑到引用计数。
//close(conn) 父进程用不到conn,将conn引用计数减一 。
//shutdown(conn,SHUT_WR) 的话不理会引用计数,直接向对方发送FIN段
close(conn);
}
|