欢迎来到天天文库
浏览记录
ID:30365712
大小:91.90 KB
页数:15页
时间:2018-12-29
《《unix网络编程笔记》word版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、unix网络编程笔记unix网络编程笔记2010-06-0416:09索引:1处理SIGCHLD信号2捕获信号时,注意处理被中断的系统调用3accept返回前连接夭折的处理4具有多个输入的处理5SIGPIPE的产生和处理6处理服务器主机崩溃7处理服务器主机崩溃重启8处理服务器主机关机9网络函数的可重入问题10套接口设置超时的方法11辅助数据12如何得知套接口接收队列中有多少数据?13UNIX域协议14UNIX域套接口使用套接口函数的一些差别和限制15描述字传递机制16非阻塞套接口I/O17服务器程序常见设计方法18注意网络编程的移植性问题19注意对等方的不合理行为20开发和使用应用程序"
2、框架"21在应用程序中中实现keep-alive机制22理解TCP的写操作23使应用程序事件驱动24不要试图绕过TIME-WAIT状态25服务器应当设置SO_REUSEADDR选项26尽量使用大型写操作代替多个小规模写操作27注意异步connect的可移植问题28避免数据拷贝在使用之前置sockaddr_in结构为029理解缓冲区大小对TCP性能的影响30理解已连接UDP套接字--1.处理SIGCHLD信号当编写fork子进程处理连接的服务器程序时,子进程退出会给父进程产生SIGCHLD信号,父进程若不处理该信号会导致僵尸进程。处理SIGCHLD信号,使用waitpid调用,不能使用wa
3、it简单处理。一般的处理方法如下(信号处理函数):voidsig_chld(intsigno){pid_tpid;intstat;while((pid=waitpid(-1,&stat,WNOHANG))0)continue;return;}2.捕获信号时,注意处理被中断的系统调用信号处理可能会中断慢系统调用,所以我们必须对慢系统调用返回EINTR错误做准备。一般处理方法如下(以accept为例):for(;;){clilen=sizeof(cliaddr);if((connfd=accept(listenfd,(SA*)&cliaddr,&clilen)0){if(errno==EIN
4、TR)continue;elseerr_sys("accepterror");}此法对accept、read、write、select、open等合适;但connect调用不能重启,若connect返回EINTR,我们不能再调用它,否则立即返回错误。3.accept返回前连接夭折的处理连接在listen后建立,在accept前夭折,此时accept可能会返回错误,对此必须处理。但对于夭折的连接处理依赖于实现,源自Berkekey的实现在内核中处理夭折的连接,服务器进程根本看不到,若当前没有新连接,则accept阻塞;大多数SVR4实现会返回一个错误给进程,作为accept的返回,此值可能
5、是EPROTO("协议错")errno值;Posix.1g要求返回ECONNABORTED("软件引起的连接夭折")。所以,在ECONNABORTED错误情况下,服务器可以忽略错误而简单的再调用accept一次。经过测试,在Solaris8和AIX4.3下返回ECONNABORTED,但在SCOOpenserver5.05下返回EINVAL。4.具有多个输入的处理当工作在有两个或多个描述字的情况下,不能只阻塞于某个特定源输入中,而是应该阻塞于任一个源的输入中。否则在网络描述字中会出现有异常数据而没有读到,导致出错的情况。方法是使用select或poll。5.SIGPIPE的产生和处理在一
6、个服务器进程终止的情况下,终止关闭了描述字,此时客户对此描述字写,服务器TCP接收到来自客户的数据,由于先前打开那个套接口的进程已经终止,所以以RST响应。客户端可能会收到先前关闭时的FIN,也可能收到后面的RST,这依赖于当时的具体情况。因为同时有FIN和RST时,RST优先于FIN。当进程向接收了RST的套接口进行写操作时,内核个该进程发一个SIGPIPE信号,此信号的缺省行为是终止进程,所以,进程必须捕获该信号以免不情愿的被终止。进程不论是捕获了该信号并从其信号处理程序返回,还是不理会该信号,写操作都会返回EPIPE错误。写一个已接收FIN的套接口是可行的,但写一个已接收了RST的
7、套接口则是错误的。处理SIGPIPE的建议方法取决于它发生时应用想做什么。如果没有什么特殊的情况处理,可将信号处理方法简单的设置为SIG_IGN,并假设后续的写操作将捕捉EPIPE错误并终止。若在信号处理程序中处理,要注意的是,如果使用了多个套接口,该信号的递交无法知道是哪个套接口出的错。6.处理服务器主机崩溃假设服务器主机已经崩溃,客户此时写数据,客户TCP会持续重传数据分节,若客户的数据分节根本没有响应,则错误为ETIMEDOU
此文档下载收益归作者所有