收藏 分享(赏)

linux编程异常处理PPT课件.ppt

上传人:Facebook 文档编号:3815857 上传时间:2018-11-19 格式:PPT 页数:17 大小:278.50KB
下载 相关 举报
linux编程异常处理PPT课件.ppt_第1页
第1页 / 共17页
linux编程异常处理PPT课件.ppt_第2页
第2页 / 共17页
linux编程异常处理PPT课件.ppt_第3页
第3页 / 共17页
linux编程异常处理PPT课件.ppt_第4页
第4页 / 共17页
linux编程异常处理PPT课件.ppt_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、第五章 异常处理,异常处理是网络编程中最复杂的部分。本章介绍异常产生的主要原因和处理方法,并且对超时异常、服务器异常、客户异常的处理进行详细分析。,2,本章主要内容,异常处理基础 函数调用的错误处理 I/O超时处理 服务器异常处理 客户异常处理 小结,3,5.1 异常处理基础,在实际的网络开发中,对异常的处理占有相当大的部分。这是由网络的特点决定的。在网络上,各主机系统的运行是独立的,甚至同一网络应用的服务器和客户也是由不同开发商开发的。网络本身也非常复杂,它包括多种路由、信道、防火墙等等。网络的使用情况也随时变化,造成网络拥挤程度的不同。由于这些因素,经常造成通信中断、IP包传输延迟过长或丢

2、失包等异常情况。如果处理不好,会直接影响系统的性能。这些异常,在编程中,通常引起一些I/O操作的超时。 另一类异常是由本地系统引起的,通常是由于系统资源分配造成的。如socket()和bind()函数的调用异常。这些异常影响系统的稳定性,处理不好,可能导致系统的崩溃。,4,5.2 函数调用的错误处理,在网络编程中,应检查每个系统调用的错误返回,尤其是与I/O相关的调用。 对于UNIX系统,大部分系统调用在非正常返回时,其返回值为-1,并设置全局变量errno。如socket()、bind()、accept()、listen()函数等。 变量errno存放一个正整数来表明上一个系统调用的错误值。

3、仅当系统调用发生错误时才设置它。如果系统调用正常返回,它的值是不确定的。因此,当一个系统调用发生错误时应立即检查errno的值,以避免下一个调用修改了errno的值。 对于线程而言,每个线程都有专用的errno变量,它不是一个共享的变量,因此不必考虑多线程同步问题。,5,错误值定义在头文件中,为常量。通常用函数perror()来显示错误信息。其原型如下:#include void perror(const char *s); S: 指向一字符串,如果s为NULL,则perror()函数直接将相应错误信息显示到标准错误输出上。如果s不为NULL,则首先显示s所指向的字符串,再显示“:”,然后显示

4、errno所代表的错误信息。,6,5.2.1 显示错误信息,下面的程序用来显示所有的错误信息。#include #include main() int i; for (i=1; i150; i+) errno=i;perrno(“error is”);,7,5.2.2 定义错误处理函数,对于错误的处理往往会导致程序结构的复杂化,通常将定义一个新的函数,该函数不仅包含了相应的功能调用,也包括了错误的处理。这样就可以提高程序的可读性,并且把错误处理独立出来便于修改和调度。int myaccept(int listenfd, struct sockaddr *client, int *sin_siz

5、e) int connectfd;while (connectfd=accept(listenfd,client,sin_size)=-1) if (errno=EINTR) continue; /*ENITR错误码,表系统中断*/perror(“accept() errorn”); /*错误处理*/break;return connectfd;,8,5.3 I/O超时处理,前面提到由网络引起的异常,主要表现为I/O操作超时。主要处理的方法有: 使用alarm()函数 使用select()函数 使用alarm()函数 该函数将产生定时信号,然后通过信号处理器来处理超时。这种方法较为简单,却不够

6、灵活。,9,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 *) /*取消连接超时设置*/,10,使用select()函数select()函数有一个时间选项,当I/O

7、操作超时后,函数返回0.int fd;fd_set fdRSet,fdWSet;struct timeval timeout;int maxfd=MAXDESCRIPTOR+1; /*设置maxfd为打开的最大描述符+1*/timeout.tv_set=; /*设置超时值*/timeout.tv_usec=0;FD_ZERO( /*读写操作*/,11,5.4 服务器异常处理,无论是网络还是本地系统引起的异常,操作系统都将错误信息通过系统调用的返回值提供给应用程序,因此,异常处理的关键是对返回的错误码进行处理。,12,异常处理的系统调用 对于TCP服务器,主要涉及的系统调用包括:socket()

8、、bind()、listen()、accept()、send()和recv()函数。以下分别讨论对错误的处理。 socket()函数错误处理socket()函数调用失败,则返回-1,并在errno变量中设置如下的错误码。 EMFILE:描述符表已满。通常的处理方法是提示用户,并退出运行。 ENOMEM:没有足够的用户内存。通常的处理方法是提示用户,并退出运行。bind()函数错误处理bind()函数调用失败返回-1,并在errno变量中设置如下的错误码。 EADDRINUSE:地址已被使用。通常的处理方法是选用其他套接字地址或提示用户,并退出运行。,13,listen()函数错误处理liste

9、n()函数调用失败是由程序的逻辑引起的,而不是系统或网络异常造成的。如果调用失败,则显示错误并退出运行。accept()函数错误处理accept()函数调用失败返回-1,并在errno变量中设置如下的错误码。EINTR: 由于信号的传递而引起系统中断该调用。accept()函数是慢系统调用。通常的处理方法是重新执行该函数调用。EMFILE: 描述符表已满。通常的处理方法是提示用户,并退出运行。ENOMEM: 没有足够的用户内存。通常的处理方法是提示用户,并退出运行。,14,recv()函数错误处理recv()函数调用失败返回-1,并在errno变量中设置如下的错误码。EINTR: 由于信号的传

10、递而引起系统中断该调用。通常的处理方法是重新执行该函数调用。EIO:I/O错误。通常的处理方法是重新执行函数调用。ENOMEM:没有足够的用户内存。通常的处理方法是提示用户,并退出运行。send()函数错误处理send()函数调用失败返回-1,并在errno变量中设置如下的错误码。EINTR: 由于信号的传递而引起系统中断该调用。通常的处理方法是重新执行该函数调用。EMSGSIZE: 发送的消息太长,通常的处理方法是将消息分段再进行发送。ENOMEM: 没有足够的用户内存。通常处理方法是提示用户,并退出运行。 从以上的处理方法可以看出,错误处理分为两类:一类是需要终止程序运行,另一类是需要调用

11、该函数。另外,还有一类情况需要考虑,当服务器和客户建立连接后,由于网络故障或客户异常而导致服务器长时间收不到客户发来的信息,此时recv()函数处于阻塞状态,为了减少不必要的系统开销,服务器必须对这种超时进行处理。当发生超时后,服务器应终止连接,释放相应资源以及对客户信息的终止处理。,15,5.5 客户异常处理,与服务器相同,客户异常处理的关键是对返回的错误码进行处理。对于TCP客户,主要涉及的系统调用包括:socket()、connect()、send()和recv()。其中只有connect()函数与服务器不同。connect()调用失败,则返回-1,并在errno变量中设置如下的错误码。

12、EADDRNOTAVAIL: 远程地址无效。通常处理方法是选择新的地址,并重新连接或提示用户,关闭套接字并终止程序。ECONNREFUSED: 连接被拒绝。当客户调用connect()函数,初始一个TCP连接请求,而此时服务器端没有进程等待在相应的端口上(例如服务器未启动),远程系统发回一个连接复位信号(RST),这时connect()函数将返回ECONNREFUSED错误码。通常的处理方法是等待一段时间后,仍无法连接则退出。EINTR: 由于信号的传递而引起系统中断该调用。通常的处理方法是重新执行该函数调用。ENETUNREACH: 网络无法抵达。由于路由器故障,导致网络无法返回ICMP的响

13、应包,此时系统将进行多次尝试直到超时。通常处理方法是提示用户,并退出运行。,16,ENXIO: 服务器在建立连接成功之前退出。通常处理方法是提示用户,并退出运行。ETIMEDOUT: 连接超时。当客户发出连接请求信号(SYN)后,服务器在指定时间段内(75秒)没有响应,则产生连接超时错误。通常处理方法是提示用户,并退出运行。ENOMEM: 没有足够的用户内存。通常处理方法是提示用户,并退出运行。,17,5.6 小结,在网络编程中,异常处理是非常重要的。由于网络的复杂性,异常出现的频率较高,处理不好,不仅影响系统的性能,有时也会导致系统的崩溃。 无论是服务器还是客户,处理异常的关键是处理与网络I/O操作相关的系统调用。通常有如下三类处理方法。 对于致命错误,需要终止程序。 对于一般性错误,处理完异常后,重新执行调用。 对于超时异常,根据网络应用情况进行处理。 I/O操作超时的处理主要用alarm()或select()函数来实现。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > linux/Unix相关

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报