tcp服务器异常情况

服务器提供回射服务(将客户端发送的内容回送到客户端上) 

1. 服务器没有开启回射服务

客户端启动tcpcli , 调用connect连接

那么在str_cli 里面的 一write socket 就会产生SIGPIPE这是因为connect连接服务器 服务器产生RST, 当向一个接收了RST的套接口进行写操作时

会产生SIGPIPE  此信号默认终止进程。

所以客户端启动一个连接没启动该端口(服务)的地址,客户端输入后会立刻返回

2. 服务器进程终止

服务器与客户端正常连接后  在客户端套接口没有设置SO_KEEPALIVE时

服务器kill进程  tcpserv发送一个FIN给客户端 客户TCP返回ACK,但客户进程现在阻塞与Fgets,无法得到终止信息

过些时候客户端再输入,write套接字,则引发服务器发送一个RST, 这里就分两种情况了:

while(fgets())  // 读入字符串

{

  write();   //写套接字

  if(read() == 0)   //读套接子

    {  printf("server closed prematurely\n");  return ; }

  else fputs();  //输出回射字符串

}  

若在write之后立刻调用read, 则肯定会读到FIN先,默认为0, 则输出服务器过早关闭 返回, 没来得及读入RST

但若在write 之后调用sleep,那么read时RST已经返回到客户端读缓存中,此时RST优于FIN, 则调用read会返回复位错误, errno = ECONNRESET

若 在read前面调用两次write, 则第一次write引发RST,(可能要sleep一下等到RST到达客户TCP),第二次write是对一个接受了RST的套接字写操作,

则生成SIGPIPE,终止进程。

3.服务器主机崩溃

正常连接后服务器主机崩溃,客户端向服务器发送数据, 就阻塞与read调用,但客户TCP一直重传数据分解,想要得到一个ACK。

一般重传12次,9分钟之后才停止(若期间服务器还是没有重启)。read返回有可能是ETIMEOUT,或者EHOSTUNREACH

4.服务器主动关机

当unix主动关机,init进程会发送SIGTERM给所有进程,等待进程清除和终止,然后就SIGKILL所有进程。这种情况就等于第二种,服务器进程关闭,

自动发送FIN。。。

5.服务器主机崩溃后重启

之前连接的所有信息都会丢失,当客户进程write,服务器返回一个RST响应(注意此时客户没有接受到FIN,因为崩溃的),客户read调用

返回ECONNRESET错误。

 

 

转载于:https://www.cnblogs.com/crisxyj/archive/2013/05/10/3070848.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值