已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章异常处理 异常处理是网络编程中最复杂的部分 本章介绍异常产生的主要原因和处理方法 并且对超时异常 服务器异常 客户异常的处理进行详细分析 2 本章主要内容 异常处理基础函数调用的错误处理I O超时处理服务器异常处理客户异常处理小结 3 5 1异常处理基础 在实际的网络开发中 对异常的处理占有相当大的部分 这是由网络的特点决定的 在网络上 各主机系统的运行是独立的 甚至同一网络应用的服务器和客户也是由不同开发商开发的 网络本身也非常复杂 它包括多种路由 信道 防火墙等等 网络的使用情况也随时变化 造成网络拥挤程度的不同 由于这些因素 经常造成通信中断 IP包传输延迟过长或丢失包等异常情况 如果处理不好 会直接影响系统的性能 这些异常 在编程中 通常引起一些I O操作的超时 另一类异常是由本地系统引起的 通常是由于系统资源分配造成的 如socket 和bind 函数的调用异常 这些异常影响系统的稳定性 处理不好 可能导致系统的崩溃 4 5 2函数调用的错误处理 在网络编程中 应检查每个系统调用的错误返回 尤其是与I O相关的调用 对于UNIX系统 大部分系统调用在非正常返回时 其返回值为 1 并设置全局变量errno 如socket bind accept listen 函数等 变量errno存放一个正整数来表明上一个系统调用的错误值 仅当系统调用发生错误时才设置它 如果系统调用正常返回 它的值是不确定的 因此 当一个系统调用发生错误时应立即检查errno的值 以避免下一个调用修改了errno的值 对于线程而言 每个线程都有专用的errno变量 它不是一个共享的变量 因此不必考虑多线程同步问题 5 错误值定义在头文件中 为常量 通常用函数perror 来显示错误信息 其原型如下 includevoidperror constchar s S 指向一字符串 如果s为NULL 则perror 函数直接将相应错误信息显示到标准错误输出上 如果s不为NULL 则首先显示s所指向的字符串 再显示 然后显示errno所代表的错误信息 6 5 2 1显示错误信息 下面的程序用来显示所有的错误信息 include includemain inti for i 1 i 150 i errno i perrno erroris 7 5 2 2定义错误处理函数 对于错误的处理往往会导致程序结构的复杂化 通常将定义一个新的函数 该函数不仅包含了相应的功能调用 也包括了错误的处理 这样就可以提高程序的可读性 并且把错误处理独立出来便于修改和调度 intmyaccept intlistenfd structsockaddr client int sin size intconnectfd while connectfd accept listenfd client sin size 1 if errno EINTR continue ENITR错误码 表系统中断 perror accept error n 错误处理 break returnconnectfd 8 5 3I O超时处理 前面提到由网络引起的异常 主要表现为I O操作超时 主要处理的方法有 使用alarm 函数使用select 函数使用alarm 函数该函数将产生定时信号 然后通过信号处理器来处理超时 这种方法较为简单 却不够灵活 9 staticintsTimeout 0 staticvoidAlarmHandler intsig sTimeout 1 超时处理函数 将超时状态置为1 signal SIGALRM AlarmHandler 设置报警信号的处理函数AlarmHandler sTimeout 0 超时状态置为0 alarm CONNECT TIMEOUT 设置连接超时的时间值 if connect sock structsockaddr 取消连接超时设置 10 使用select 函数select 函数有一个时间选项 当I O操作超时后 函数返回0 intfd fd setfdRSet fdWSet structtimevaltimeout intmaxfd MAXDESCRIPTOR 1 设置maxfd为打开的最大描述符 1 timeout tv set 设置超时值 timeout tv usec 0 FD ZERO 读写操作 11 5 4服务器异常处理 无论是网络还是本地系统引起的异常 操作系统都将错误信息通过系统调用的返回值提供给应用程序 因此 异常处理的关键是对返回的错误码进行处理 12 异常处理的系统调用对于TCP服务器 主要涉及的系统调用包括 socket bind listen accept send 和recv 函数 以下分别讨论对错误的处理 socket 函数错误处理socket 函数调用失败 则返回 1 并在errno变量中设置如下的错误码 EMFILE 描述符表已满 通常的处理方法是提示用户 并退出运行 ENOMEM 没有足够的用户内存 通常的处理方法是提示用户 并退出运行 bind 函数错误处理bind 函数调用失败返回 1 并在errno变量中设置如下的错误码 EADDRINUSE 地址已被使用 通常的处理方法是选用其他套接字地址或提示用户 并退出运行 13 listen 函数错误处理listen 函数调用失败是由程序的逻辑引起的 而不是系统或网络异常造成的 如果调用失败 则显示错误并退出运行 accept 函数错误处理accept 函数调用失败返回 1 并在errno变量中设置如下的错误码 EINTR 由于信号的传递而引起系统中断该调用 accept 函数是慢系统调用 通常的处理方法是重新执行该函数调用 EMFILE 描述符表已满 通常的处理方法是提示用户 并退出运行 ENOMEM 没有足够的用户内存 通常的处理方法是提示用户 并退出运行 14 recv 函数错误处理recv 函数调用失败返回 1 并在errno变量中设置如下的错误码 EINTR 由于信号的传递而引起系统中断该调用 通常的处理方法是重新执行该函数调用 EIO I O错误 通常的处理方法是重新执行函数调用 ENOMEM 没有足够的用户内存 通常的处理方法是提示用户 并退出运行 send 函数错误处理send 函数调用失败返回 1 并在errno变量中设置如下的错误码 EINTR 由于信号的传递而引起系统中断该调用 通常的处理方法是重新执行该函数调用 EMSGSIZE 发送的消息太长 通常的处理方法是将消息分段再进行发送 ENOMEM 没有足够的用户内存 通常处理方法是提示用户 并退出运行 从以上的处理方法可以看出 错误处理分为两类 一类是需要终止程序运行 另一类是需要调用该函数 另外 还有一类情况需要考虑 当服务器和客户建立连接后 由于网络故障或客户异常而导致服务器长时间收不到客户发来的信息 此时recv 函数处于阻塞状态 为了减少不必要的系统开销 服务器必须对这种超时进行处理 当发生超时后 服务器应终止连接 释放相应资源以及对客户信息的终止处理 15 5 5客户异常处理 与服务器相同 客户异常处理的关键是对返回的错误码进行处理 对于TCP客户 主要涉及的系统调用包括 socket connect send 和recv 其中只有connect 函数与服务器不同 connect 调用失败 则返回 1 并在errno变量中设置如下的错误码 EADDRNOTAVAIL 远程地址无效 通常处理方法是选择新的地址 并重新连接或提示用户 关闭套接字并终止程序 ECONNREFUSED 连接被拒绝 当客户调用connect 函数 初始一个TCP连接请求 而此时服务器端没有进程等待在相应的端口上 例如服务器未启动 远程系统发回一个连接复位信号 RST 这时connect 函数将返回ECONNREFUSED错误码 通常的处理方法是等待一段时间后 仍无法连接则退出 EINTR 由于信号的传递而引起系统中断该调用 通常的处理方法是重新执行该函数调用 ENETUNREACH 网络无法抵达 由于路由器故障 导致网络无法返回ICMP的响应包 此时系统将进行多次尝试直到超时 通常处理方法是提示用户 并退出运行 16 ENXIO 服务器在建立连接成功之前退出 通常处理方法是提示用户 并退出运行 ETIMEDOUT 连接超时 当客户发出连接请求信号 SYN 后 服务器在指定时间段内 75秒 没有响应 则产生连接超时错误 通常处理方法是提示用户 并退出运行 ENOMEM 没有足够的用户内存 通常处理方法是提示用户 并退出运行 17 5 6小结 在网络编程中 异常处理是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 镇江市人民医院Monteggia骨折诊断与治疗考核
- 安全月知识竞赛题库及答案解析
- 特种设备安全管理人员a4题库及答案解析
- 连云港市人民医院妊娠期高血压疾病早期识别与防治考核
- 杭州市人民医院腹腔镜结直肠手术专项考核
- 太阳能发电技术咨询合同
- 全国工矿产品买卖合同
- 土地开发借款合同范本
- 红枣枸杞五红汤企业制定与实施新质生产力项目商业计划书
- 有机芝麻加工创新创业项目商业计划书
- 玫瑰知识培训课件
- 青桐鸣大联考2025-2026学年高一上学期10月月考物理试卷
- 2025年10月全国教育学原理自考试题及答案
- 2025济钢集团有限公司校园招聘(48人)笔试参考题库附带答案详解
- 2025版《煤矿安全规程》题库
- 辽宁省名校联盟2025-2026年高三10月联考物理试卷+答案
- 非人力资源经理的人力资源管理
- 公司庆典合同(标准版)
- 诉讼保全险培训课件
- 2025年自学考试《艺术概论》考试复习题库(含答案)
- 中南地区民航消防员理论考试题库(精简500题)
评论
0/150
提交评论