close和shutdown函数的区别

本文详细解释了TCP连接中close和shutdown函数的行为差异。close函数仅标记套接字为关闭状态,而shutdown则允许选择性地关闭读或写操作。文章还讨论了在多进程环境中这些函数如何影响共享套接字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:https://blog.youkuaiyun.com/lgp88/article/details/7176509

《UNIX网络编程》

close()函数:

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

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

shutdown()函数:

int shutdown(int sockfd,int how)

该函数行为依赖how的值。

 1.SHUT_RD:值为0,关闭连接的读这一半,套接字中不再有数据接收,且套接字接收缓冲区中的现有数据全都被丢弃,该套接字描述符不能再被进程调用,对端发送的数据会被确认,然后丢弃。

 2.SHUT_WR:值为1,关闭连接的写这一半。这称为半关闭,当前在套接字发送缓冲区数据被发送,然后连接终止序列。不论套接字描述符引用技术是否等于0,写半部都会被关闭。

 3.SHUT_RDWR:值为2,连接的读和写都关闭。相当于先调用SHUT_RD,再调用SHUT_WR。

close与shutdown的区别:

①:close函数函数会关闭套接字,如果由其他进程共享着这个套接字,那么它仍然是打开的,这个连接仍然可以用来读和写。

②:shutdown会切断进程共享的套接字的所有连接,不管引用计数是否为0,由第二个参数选择断连的方式。

 

 

 

### 方法 `close` `shutdown` 的区别 在网络编程上下文中,方法 `close` `shutdown` 都用于管理套接字连接的状态,但两者有着不同的行为用途。 #### 关闭资源的方法 `close` 当调用 `close()` 方法时,这会立即终止整个套接字连接并释放所有相关联的资源。这意味着任何未发送的数据都将被丢弃,并且不能再通过该套接字进行读写操作[^1]。 对于 Java 中的 Socket 类来说: ```java socket.close(); ``` 这段代码将关闭 socket 并清理其占用的操作系统级别的文件描述符其他资源。 #### 控制数据传输方向的方法 `shutdown` 相比之下,`shutdown()` 提供更细粒度控制的能力。可以单独指定要停止接收还是发送数据的方向。具体而言,在 Java NIO 库中有两个选项可用:`Socket.shutdownInput()`, 它阻止进一步从这个通道读取;以及 `Socket.shutdownOutput()`, 这样就不会再允许向此通道写出新消息[^2]。 例如: ```java // 停止接受新的输入流 socket.shutdownInput(); // 或者只停止输出流 socket.shutdownOutput(); ``` 值得注意的是,一旦任一方向上的通信被禁用了,则相应的 I/O 操作将会抛出异常来指示这一点。 综上所述,如果应用程序只需要部分结束会话而不完全断开连接的话,那么应该优先考虑使用 `shutdown()` 函数而不是直接调用 `close()` 来实现更加优雅地处理网络交互过程中的各种情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值