您的位置:首页 > 理论基础 > 计算机网络

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错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: