- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux编程异常处理
第五章 异常处理 异常处理是网络编程中最复杂的部分。本章介绍异常产生的主要原因和处理方法,并且对超时异常、服务器异常、客户异常的处理进行详细分析。 * 本章主要内容 异常处理基础 函数调用的错误处理 I/O超时处理 服务器异常处理 客户异常处理 小结 * 5.1 异常处理基础 在实际的网络开发中,对异常的处理占有相当大的部分。这是由网络的特点决定的。在网络上,各主机系统的运行是独立的,甚至同一网络应用的服务器和客户也是由不同开发商开发的。网络本身也非常复杂,它包括多种路由、信道、防火墙等等。网络的使用情况也随时变化,造成网络拥挤程度的不同。由于这些因素,经常造成通信中断、IP包传输延迟过长或丢失包等异常情况。如果处理不好,会直接影响系统的性能。这些异常,在编程中,通常引起一些I/O操作的超时。 另一类异常是由本地系统引起的,通常是由于系统资源分配造成的。如socket()和bind()函数的调用异常。这些异常影响系统的稳定性,处理不好,可能导致系统的崩溃。 * 5.2 函数调用的错误处理 在网络编程中,应检查每个系统调用的错误返回,尤其是与I/O相关的调用。 对于UNIX系统,大部分系统调用在非正常返回时,其返回值为-1,并设置全局变量errno。如socket()、bind()、accept()、listen()函数等。 变量errno存放一个正整数来表明上一个系统调用的错误值。仅当系统调用发生错误时才设置它。如果系统调用正常返回,它的值是不确定的。因此,当一个系统调用发生错误时应立即检查errno的值,以避免下一个调用修改了errno的值。 对于线程而言,每个线程都有专用的errno变量,它不是一个共享的变量,因此不必考虑多线程同步问题。 * 错误值定义在头文件sys/errno.h中,为常量。通常用函数perror()来显示错误信息。其原型如下: #include stdio.h void perror(const char *s); S: 指向一字符串,如果s为NULL,则perror()函数直接将相应错误信息显示到标准错误输出上。如果s不为NULL,则首先显示s所指向的字符串,再显示“:”,然后显示errno所代表的错误信息。 * 5.2.1 显示错误信息 下面的程序用来显示所有的错误信息。 #include errno.h #include stdio.h main() { int i; for (i=1; i150; i++) { errno=i; perrno(“error is”); } } * 5.2.2 定义错误处理函数 对于错误的处理往往会导致程序结构的复杂化,通常将定义一个新的函数,该函数不仅包含了相应的功能调用,也包括了错误的处理。这样就可以提高程序的可读性,并且把错误处理独立出来便于修改和调度。 int myaccept(int listenfd, struct sockaddr *client, int *sin_size) { int connectfd; while ((connectfd=accept(listenfd,client,sin_size))==-1) { if (errno==EINTR) continue; /*ENITR错误码,表系统中断*/ …… perror(“accept() error\n”); /*错误处理*/ break; } return connectfd; } * 5.3 I/O超时处理 前面提到由网络引起的异常,主要表现为I/O操作超时。主要处理的方法有: 使用alarm()函数 使用select()函数 使用alarm()函数 该函数将产生定时信号,然后通过信号处理器来处理超时。这种方法较为简单,却不够灵活。 * static int sTimeout=0; static void AlarmHandler(int sig) { sTimeout=1; /*超时处理函数,将超时状态置为1*/ } …… signal(SIGALRM,AlarmHandler); /*设置报警信号的处理函数AlarmHandler()*/ sTimeout=0; /*超时状态置为0*/ alarm(CONNECT_TIMEOUT); /*设置连接超时的时间值*/ if (connect(sock,(struct sockaddr *)server,sizeof(server))==-1) {/*连接服务器*/ if (sTimeout) /*处理连接超时*/ perr
您可能关注的文档
- .GMP偏差处理.ppt
- .GSM功率控制简介.ppt
- .GDP的核算:三种方法.ppt
- .GeoChem 5-3.ppt
- .GB150压力容器制造常用知识名词图解.ppt
- .GPS模块资料.ppt
- .GSM003-SDCCH指配失败率高问题处理.ppt
- .F第七章一阶电路二阶电路(第五版).ppt
- .HLA2.ppt
- .Http协议详解.ppt
- 05MR404 城市道路-路缘石建筑工程 图集 conv.docx
- 07SG531 钢网架结构设计建筑工程 图集 conv.docx
- 05SS121 热水机组选用与安装建筑工程 图集 conv.docx
- 03J501-2 钢筋混凝土雨蓬建筑构造建筑工程 图集 conv.docx
- 88D369电气设备在轻钢龙骨隔墙及吊顶上的安装建筑工程 图集 conv.docx
- 05R401-3 常压蓄热水箱21建筑工程 图集 .docx
- 97R412 室外热力管道支座53建筑工程 图集 conv.docx
- 05S518雨水口建筑工程 图集 conv.docx
- 05S506-1 自承式平直型架空钢管建筑工程 图集 conv.docx
- 12K101-2 屋顶风机安装建筑工程 图集 conv.docx
文档评论(0)