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 "); 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错误。
文章标题:tcp服务器异常情况-创新互联
新闻来源:http://azwzsj.com/article/dsceeo.html