TCP/IP网络编程 -- (七)优雅地断开套接字连接

TCP/IP网络编程 -- (七)优雅地断开套接字连接

7.1基于TCP的半关闭

Linux 中的 close 与 Windows 中的 closesocket 函数都是完全断开连接。此时既无法发送也不能接受数据

更多情况下需要半关闭,可以传输不能接受,或可以接受不能传输

image

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() 函数只关闭服务器的输入流就行了

image

//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);
posted @ 2023-03-15 16:11  hzy0227  阅读(23)  评论(0编辑  收藏  举报