tcp服务器异常情况-创新互联

服务器提供回射服务(将客户端发送的内容回送到客户端上) 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服务器异常情况-创新互联
标题URL:http://pwwzsj.com/article/dsceeo.html