C++网络编程(三):基于TCP的半关闭

本文介绍了在C++网络编程中,调用close可能导致的问题以及如何通过TCP半关闭来解决这个问题。详细阐述了半关闭的概念,即仅断开套接字连接的一个流,而不是两个。文章还解释了为何需要半关闭,特别是在服务器传输文件后,客户端仍需发送数据的情况。通过示例代码展示了如何使用shutdown函数实现半关闭。最后给出了相关参考资料。
摘要由CSDN通过智能技术生成

调用close带来的问题

假设主机A、B正在进行双向通信,当主机A发送完最后数据,调用close断开连接,之后A无法再接收B传输的数据。因此,最终由B传输的、A必须接收的数据也销毁了。

为了解决这类问题,需要使用“优雅”的半关闭了~~~

半关闭的定义

一旦两台主机建立了套接字连接,每个主机就会拥有单独的输入流、输出流,半关闭即只断开其中1个流,而非同时断开两个流。


shutdown函数

用于半关闭的函数为shutdown:

#include<sys/socket.h>

int shutdown(int sock, int howto);

Linux中:
成功返回0,失败返回-1
参数一:需要断开的套接字的文件描述符
参数二:断开方式,可取值:
SHUT_RD 断开输入流           
SHUT_WR 断开输出流            
SHUT_RDWR 同时断开输入与输出流

为何需要半关闭

考虑以下情况:

服务器端将约定的文件传给客户端,客户端收到后还要发送数据给服务器端,此时因为传输文件的服务器端只需连续传输文件即可,而客户端无法知道接收数据到何时,也没办法无休止调用输入函数,因为可能会导致程序阻塞(调用的函数未返回)。

此时就需要调用半关闭的shutdown函数,只关闭服务器的输出流,这样既可以发送EOF,又保留了输入流接收对方数据


代码示例

服务器端:

if( NULL == (fp 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值