调用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