UNIX网络编程--服务器的几种异常终止
来源:互联网 发布:win10系统如何优化提速 编辑:程序博客网 时间:2024/05/16 19:26
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网络编程--服务器的几种异常终止
- 唯快不破:UNIX网络编程--服务器的几种异常终止
- unix网络编程---服务器和客户端上的异常处理
- 《unix网络编程》(11)tcp服务器的几种常见状况分析
- UNIX网络编程——TCP的连接建立与终止、基本TCP客户/服务器套接字函数
- unix网络编程几种模型比较
- 网络服务器并发编程的几种方案对比
- unix下的网络编程学习(tcp连接和终止的过程)
- UNIX 网络编程学习(一) TCP连接的建立和终止
- 《unix网络编程》(3)TCP连接的建立和终止
- 几种服务器网络编程模型
- UNIX网络编程的回射服务器的改进步骤
- 简单的获取服务器时间程序(UNIX网络编程)
- UNIX网络编程,时间获取服务器的搭建,程序运行
- [UNIX网络编程] sun rpc实现的简单echo服务器
- unix网络编程3 多进程web服务器的实现
- UNIX网络编程练习-简单的时间服务器和客户端
- UNIX网络编程笔记(3):简单的并发服务器
- JSON对象 和 java对象互相转换
- Android view 惰性加载 - ViewStub的应用
- 虚函数的声明和定义与编译器错误提示
- 32位和64位系统区别及int字节数
- 高效开发Android App的10个建议
- UNIX网络编程--服务器的几种异常终止
- 云计算时代IT专业人员需具备的10项技能
- 美丽英文短语集锦
- 调试STM32F4 VCP遇到的问题
- windows内核情景分析---内核对象
- wikioi 1017 乘积最大 (2000年NOIP全国联赛普及组NOIP全国联赛提高组)
- impala测试
- win2012 + IIS8 + 动网 环境配置
- 解决错误RPE-02259,即运行grant_upgrade_privileges.sql