linux复习杂记(二) linux网络编程中的细节
2016-03-14 22:42
423 查看
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错误。
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错误。
相关文章推荐
- tcp三次握手都没有建立, 还谈什么业务包呢?------聊聊最近的一个扯皮问题
- 23种设计模式 (http://www.cnblogs.com/beijiguangyong/)
- tcp 服务端FIN_WAIT_2 状态下,客户端操作的抛错实验
- COGS731 [网络流24题] 最长递增子序列(最大流)
- http协议详解(超经典)
- 网络流 ISAP 模板
- OpenCv实现卷积神经网络实例:tiny_cnn代码详解(6)——average_pooling_layer层结构类分析
- 使用android-async-http来封装Android网络请求框架
- 网络编程---(数据请求+slider)将网络上的大文件下载到本地,并打印其进度
- 复制粘贴出来的悲剧----spring实现文件下载和HttpStatus.CREATED
- Swift - 网络请求
- TCP 的那些事儿(下)
- HTTPS到底是个啥玩意儿?
- TCP 的那些事儿(上)
- 【Stanford CNN课程笔记】6.神经网络的数据预处理
- 复杂网络中聚类算法总结
- C语言中的可变参数函数 三个点“…” http://blog.chinaunix.net/uid-7283526-id-2198861.html
- php 用guzzule 6 发送HTTP请求
- FIN_WAIT_2 tcp状态多原因剖析和解决
- static_cast < type-id > ( expression ) http://blog.csdn.net/moruihong/article/details/7712260