网络编程---socket中关闭套接字的函数close和shutdown区别

1.函数close():释放描述符

某个进程调用了close(sockfd)函数,描述符的计数就会减1,直到计数为0。当计数为0时,也就是所用进程都调用了close,这时程序会调用shutdown函数释放套接字。

2.函数shutdown():断开连接

有些地方见到调用了shutdown()之后接着就是close()。有种解释是:调用shutdown()只是进行了TCP断开, 并没有释放文件描述符,需要调用close()来释放。
某个进程中调用了shutdown(sockfd,SHUT_RDWR)函数,其它的进程将无法通过sockfd进行通信。而如果调用的不是shutdown而是close(sockfd),将不会影响到其它进程。

总结:如果没有几个进程共享套接字,那么使用close;如果共享了,那么shutdown 后接着要用close

close函数:
close 一个套接字的默认行为是把套接字标记为已关闭,然后立即返回到调用进程,该套接字描述符不能再由调用进程使用,也就是说它不能再作为read或write的第一个参数,然而TCP将尝试发送已排队等待发送到对端的任何数据,发送完毕后发生的是正常的TCP连接终止序列。

在多进程并发服务器中,父子进程共享着套接字,套接字描述符引用计数记录着共享着的进程个数,当父进程或某一子进程close掉套接字时,描述符引用计数会相应的减一,当引用计数仍大于零时,这个close调用就不会引发TCP的四路握手断连过程。

shutdown()函数
close函数会关闭套接字ID,如果有其他的进程共享着这个套接字,那么它仍然是打开的,这个连接仍然可以用来读和写,并且有时候这是非常重要的 ,特别是对于多进程并发服务器来说。

而shutdown会切断进程共享的套接字的所有连接,不管这个套接字的引用计数是否为零,那些试图读得进程将会接收到EOF标识,那些试图写的进程将会检测到SIGPIPE信号,同时可利用shutdown的第二个参数选择断连的方式。
————————————————

3.两函数的区别

使用close中止一个连接,但它只是减少描述符的参考数,并不直接关闭连接,只有当描述符的参考数为0时才关闭连接。
shutdown可直接关闭描述符,不考虑描述符的参考数,可选择中止一个方向的连接。

注意:
1>. 如果有多个进程共享一个套接字,close每被调用一次,计数减1,直到计数为0时,也就是所用进程都调用了close,套

接字将被释放。
2>. 在多进程中如果一个进程中shutdown(sfd, SHUT_RDWR)后其它的进程将无法进行通信. 如果一个进程close(sfd)将不会

影响到其它进程. 得自己理解引用计数的用法了.

socket中关闭套接字的函数close和shutdown区别

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Socket编程shutdown()函数通常用于关闭已连接的套接字的一部分或全部通信。shutdown()函数可以用于以下情况: 1. 关闭一个已连接套接字的一侧:当套接字的一侧想要停止发送数据时,可以使用shutdown()函数关闭套接字的一侧。这个时候,另一侧仍然可以发送和接收数据,而关闭的一侧则不能再发送数据。 2. 完全关闭一个已连接套接字:当一个套接字的双方都不需要再进行通信时,可以使用shutdown()函数关闭整个套接字。这个时候,套接字的两侧都不能再发送和接收数据了。 需要注意的是,关闭套接字并不是必需的,因为在套接字关闭时,操作系统会自动释放套接字所占用的资源。但是,当应用程序需要显式地关闭套接字时,可以使用shutdown()函数。 ### 回答2: shutdown()函数可以用于关闭套接字的一个或多个方向的通信。它适用于以下场景: 1. 安全地关闭套接字:在关闭套接字之前,可以使用shutdown()函数停止对该套接字的读取和写入操作。这样可以确保在关闭套接字之前,所有未发送和接收的数据都已经处理完毕,避免数据丢失或混乱。 2. 断开连接:在网络编程,当一个套接字与另一个套接字建立连接之后,可以使用shutdown()函数断开与对方的连接。通过关闭套接字的某个方向的通信,可以使得另一个套接字无法再发送或接收数据,从而实现断开连接的效果。 3. 超时处理:使用shutdown()函数可以设置超时,即在一定时间内没有收到对方的数据或没有发送数据,就可以通过关闭套接字来处理超时情况,从而及时释放资源,提高程序的效率和可靠性。 总之,shutdown()函数适用于需要精确控制套接字通信的场景,可以确保数据的安全传输和及时释放资源。在网络编程,合理地使用shutdown()函数可以提高程序的效率和可靠性。 ### 回答3: socketshutdown()函数用于在网络通信关闭连接的一部分。它适用于以下场景: 1. 半关闭连接:可以通过shutdown()函数关闭socket的读或写操作,从而实现半关闭连接。例如,在一个TCP连接,一个端口发送完所有的数据后可以调用shutdown(socket.SHUT_WR)来关闭写操作,而接收端仍可以继续读取数据。这种情况下,可以使用shutdown()函数来表明数据的发送已经完成,但是仍然可以接收数据。 2. 优雅关闭连接:在网络通信,通常需要先发送一个特殊的标志来告知对方关闭连接。在TCP,如果直接调用close()函数关闭连接,对方可能会认为是异常关闭而无法正确处理。因此,可以通过调用shutdown()函数来发送这个特殊的标志,然后再调用close()函数关闭连接。这样可以告知对方连接即将关闭,对方可以做一些必要的处理。 3. 超时关闭连接:在网络通信,有些情况下需要在一定时间内关闭连接。通过设置超时时间,可以在规定的时间内调用shutdown()函数关闭连接。如果在超时时间内没有调用close()函数关闭连接,则系统会自动关闭连接。 综上所述,shutdown()函数适用于需要局部关闭连接、优雅关闭连接或者超时关闭连接的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值