UNIX网络编程--服务器的几种异常终止
2014-04-04 10:11
585 查看
1、在accept函数返回前连接夭折
这种情况发生在TCP 3次握手刚好完成,服务器TCP将连接放入到已经建立好连接队列中,此时客户端给一个RST,接下来accept返回,不过这时accept返回的是ECONNECTABORT错误.这不是一个致命错误。
2、服务器进程终止
过程如下:
a、kill掉服务进程,作为进程善后处理的部分,所有打开的文件描述符被关闭,这导致服务端TCP(注意"服务端"和"服务端TCP"是不同概念)发送FIN给客户端,客户端TCP响应以ACK。
b、客户端此时正阻塞在scanf函数(基于上篇中提到的客户端模型),这导致客户端不知道服务端TCP已经关闭连接。
c、客户端在scanf返回后调用write向服务端发数据,由于服务端已经被kill掉,所以服务端TCP会发送一个RST给客户端TCP.
d、客户端在发送完数据后立即调用read读取数据,由于有第一步的FIN,read立即返回0(表示EOF),然而客户端希望的是收到刚才发送的数据而不是EOF。如果客户端接着往服务端发数据,将诱发服务端TCP向服务端发送SIGPIPE信号,因为向接收到RST的套接口写数据都会收到此信号.
问题的本质在于客户端同时处理两个描述字--套接口和用户输入,程序被单纯地阻塞在一个源上了。这个问题可以通过1、设置非阻塞模式。2、采用select以及epoll处理。
3、服务器主机崩溃
在客户TCP发送数据后,由于接收不到ACK,它将试图一直重传,直到最后放弃,并返回给客户进程一个出错信息。ETIMEOUT表示没有相应,EHOSTUNREACH表示路由器判定主机不可达。
4、服务器崩溃后重启
由于服务端TCP丢失了以前的连接信息,这将导致服务端发送一个RST,而此时客户端阻塞在read函数,这将导致返回一个ECONNECTRESET错误.
5、服务器关机
服务器关机时init进程会先发送SIGTERM(此信号可捕获)给所有进程,再过一段时间发送SIGKILL(次信号不可捕获)给仍然在运行的程序,这时就和服务器进程终止一样了。
相关文章推荐
- 唯快不破:UNIX网络编程--服务器的几种异常终止
- 服务器上几种常见异常的解决方案.
- 服务器上几种常见异常的解决方案
- C# 截获某个域中未捕获的异常 CLR20R3 程序终止的几种解决方案
- 38-连接断开异常(服务器进程终止)
- 《unix网络编程》(11)tcp服务器的几种常见状况分析
- asp.net服务器上几种常见异常的解决方案.
- asp.net服务器上几种常见异常的解决方案.
- Win7/Win8 系统下安装Oracle 10g 提示“程序异常终止,发生未知错误”的解决方法
- $.ajax()方法从服务器获取json数据几种方式详解
- Android客户端项目全局异常处理和服务器数据保存
- ECS服务器CPU使用率异常100%时_你需要了解的一些事情
- MSSQL跨服务器连接的几种方法
- PHP带头大哥讲解几种综合PHP网络服务器系统的选择!
- 从服务器上获得网络时间的几种方法
- UNIX网络编程----多进程并发服务器(这样就支持多个客户端连接了)
- win7 安装oracle10g 出现兼容性错误--程序异常终止
- "已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)"
- 防止服务器宕机时MySQL数据丢失的几种方案