TCP客户端与服务器函数调用过程及特殊情况

本文介绍了TCP客户端与服务器的连接流程,包括服务器的socket创建、bind、listen、accept,以及客户端的socket创建、connect。在连接过程中,详细讨论了'三次握手'和'四次挥手'。同时,文章探讨了特殊情况,如accept前连接终止、服务器进程崩溃、服务器主机崩溃、服务器重启和主机关机等,并提出了解决策略,如重新调用accept和使用keep-alive机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本结构如下图所示:

一般而言服务器是被动建立连接,服务器调用socket创建套接字,bind给socket分配具体的ip地址以及端口号,再调用listen函数将刚创建好的socket放入监听队列,之后调用accept等待指定地址(协议)的客户端的连接。

客户端调用socket创建套接字,随后connect来建立连接,客户端的socket的bind操作在connect中隐藏完成。

调用connect之后发生“三次握手”建立TCP连接,随后客户端与服务器之间开始传输数据;

客户端调用close(),发生“四次挥手”撤销TCP连接。

特殊情况:

1、在accept返回之前连接终止

由于系统中断或客户端传入RST,解决办法:再次调用accept即可。因为TCP连接是在内核之中完成的,与accept函数执行并未干系。

2、服务器进程崩溃(子进程终止)

服务器主动发送FIN关闭TCP连接的服务器端,但实际上是服务器的进程都kill掉了,于是客户端继续发送数据,这时候服务器只能响应一个RST,客户端有可能选择忽视掉RST信号,而继续接收数据(例如立刻调用别的读取数据函数),此时就会返回一个错误。

3、服务器主机崩溃(断网)

一般情况下会一直由TCP重传机制来不断重传,直到超出TCP重传定时器所设时限。视为放弃连接,返回服务器不可达错误;

也可以使用keep-alive策略;

keepalive,是在TCP中一个可以检测死连接的机制。

1).如果主机可达,对方就会响应ACK应答,就认为是存活的。

2).如果可达,但应用程序退出,对方就发RST应答,发送TCP撤消连接。

3).如果可达,但应用程序崩溃,对方就发FIN消息。

4).如果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值