linux复习杂记(二) linux网络编程中的细节
来源:互联网 发布:印度软件 编辑:程序博客网 时间:2024/06/04 19:03
1.在学习《Unix网络编程》过程中,有一个例子,就是服务器每收到一个连接请求,在调用accept函数并获取socketid之后,就会调用一个fork函数生成一个子进程来处理这个连接(这种是多进程服务器的模式吧~)。然而在子进程的事务结束之后,会发出一个SIG_CHLD信号,告诉父进程子进程结束了。这时候如果父进程不做任何处理,子进程就会进入僵死状态,会占用着资源。这时候需要父进程捕捉这个信号,并且调用wait()或者waitpid来“等待”子进程从而顺利结束子进程。
2.如果负责信息处理的服务器的进程被杀死了,那么会发送一个FIN给客户端,然后客户端返回一个ACK。如果返回ACK之后,客户端继续发送信息(因为FIN并不代表服务器已经被杀死),服务器端会返回一个RST,如果客户端这时候试图读东西(例如调用readline函数读取信息),就会返回0)。如果在收到RST之后,客户端继续向服务端发送信息,内核就会向进程发送一个SIGPIPE信号。无论如何处理这个信号,写的操作(例如write()函数)的返回值都是EPIPE错误。
3.如果在完成连接之后,服务器崩溃或者网络连接线路断开,这时候如果客户端发送消息,根据Berkeley的实现,客户TCP会尝试重传该数据12次,共等待9分钟才放弃。9分钟之后,客户端的读操作会返回ETIMEOUT错误(假如客户端调用readline并且阻塞了)。但是如果中间某个路由器返回了目的地不可达的信息,那么读操作的返回值是EHOSTUNREACH或者ENETUNREACH错误。如果要避免客户端等待9分钟才返回,需要对readline操作调用一个超时。其实如果客户端不发送信息,是不知道服务器崩溃的,如果不想主动发送信息却又要知道服务器是否崩溃,就要使用SO_KEEPALIVE套接字选项。又或者,如果崩溃的服务器重启了,这时候收到来自客户端的消息,由于连接消息都丢失了,所以对于每一个数据分节都返回一个RST;客户收到RST之后,此时如果正在阻塞在readline等读的操作,会返回ECONNRESET错误。
- linux复习杂记(二) linux网络编程中的细节
- linux 复习杂记(一) linux中的进程
- linux网络编程复习
- linux 网络编程复习
- Linux 杂记(二)
- Linux网络编程复习笔记
- Linux网络编程(二)
- Linux网络编程(二)
- linux学习杂记(二)
- Linux复习(二)
- linux复习(二)
- Linux网络编程(二)
- Linux网络编程(二)
- Linux网络编程二
- Linux--网络编程(二)UDP编程
- Linux网络杂记
- Linux网络杂记
- linux系统编程杂记
- 异或运算及其应用
- ganglia监控kafka
- 一个数组内的非负整数,能组合成的最大整数
- weiphp使用心得
- 堆排序的实现(c++)
- linux复习杂记(二) linux网络编程中的细节
- nodejs使用mysql例子
- Android开发学习之路--RxAndroid之简单原理
- 阿里面试问题
- 【LeetCode OJ 073】Set Matrix Zeroes
- 蓝桥杯
- 使用thinkphp时因为一个’/‘造成页面一直跳转
- [几何 递推] BZOJ 1074 折纸
- Struts2国际化介绍及详细说明