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

基本结构如下图所示:

一般而言服务器是被动建立连接,服务器调用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、

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值