错误处理函数
在网络编程中,一些函数的属于慢速调用,对其作异常处理的时候需要避免其在正常进程阻塞的过程中被异常处理,需要对其作一些相关的信号判断。
1.int Accept(int fd,struct sockaddr *sock,socklen_t *sock_len)
accept 是慢速调用处理函数,在错误管理中,在通信阻塞期间可能会存在异常断开,所以需要另外的处理。
int Accept(int fd,struct sockaddr *sock,socklen_t *sock_len)
{
int n;
again:
if((n = accept(fd,sock,sock_len))<0)
{
if((errno == ECONNABORTED)||(errno == EINTR))//当函数处于阻塞期间,为了防止异常断开,添加信号中断判断函数。
goto again;
else
perr_exit("accept error");
}
return n;
}
2.ssize_t Read(int fd,void *ptr,size_t nbytes)
read 函数返回值详解:
1.return > 0 ; 返回实际读到的字节数
2.return == 0;数据读到(文件,管道,socket)的末尾—对端关闭,(对端write关闭)
3.return = -1;异常情况
3.1 errno == EINTR 信号中断,重新启动 go to again;
3.2 errno == EAGAIN(EWOULDBLOCK) 非阻塞方式度,并且没有数据
3.3 其他值 出现错误,perror exit;
ssize_t Read(int fd,void *ptr,size_t nbytes)
{
ssize_t n;
again:
if((n=read(fd,ptr,nbytes)) <0){
if(errno == EINTR)
goto again;
else
return -1;
}
return n;
}
3.ssize_t Write(int fd,void *ptr,size_t nbytes)
write 函数处理与read函数处理过程相似
ssize_t Write(int fd,void *ptr,size_t nbytes)
{
ssize_t n;
again:
if((n = write(fd,ptr,nbytes)) <0){
if(errno == EINTR)
goto again;
else
return -1;
}
return n;
}