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);
分类:
后端开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本