TCP/IP网络编程 -- (七)优雅地断开套接字连接
TCP/IP网络编程 -- (七)优雅地断开套接字连接
7.1基于TCP的半关闭
Linux 中的 close 与 Windows 中的 closesocket 函数都是完全断开连接。此时既无法发送也不能接受数据
更多情况下需要半关闭,可以传输不能接受,或可以接受不能传输
close 会同时断开这两个流
针对优雅断开的 shutdown 函数
#include <sys/socket.h>
int shutdown(int sock, int howto)
成功返回 0,失败返回 -1
sock:需要断开的 socket 文件描述符
howto:断开的方式,参数有
SHUT_RD:断开输入流
SHUT_WR:断开输出流
SHUT_RDWR:同时断开I/O流,相当于分两次调用 SHUT_RD 与 SHUT_WR
为什么需要半关闭
比如服务器给客户端发数据,发完后客户端回一个 “Thank you”,但客户端不知道什么时候发完,所以需要一直调用 read() 函数
改进1:可以在发完数据后服务器向客户端发送EOF表示发送结束
问题:服务器调用 close() 函数关闭连接并发送 EOF 后,输入流也断了,客户端发的 "Thank you" 将无法收到
改进2:调用 shutdown() 函数只关闭服务器的输入流就行了
//server.c 服务器发送完数据后
shutdown(clnt_sd, SHUT_WR);
read(clnt_sd, buf, BUF_SIZE);
printf("%Message from client: %s \n", buf);
close(clnt_sd); close(serv_sd);