socket编程中用到的慢速系统调用函数有:
accept
while(1)
{
int cfd;
if((cfd = accept(sfd,(struct sockaddr*)&add,sizeof(add)))<0)
{
if(errno == ECONNABORTED || errno == EINTER)
continue;
else{
perror("accept");
exit(1);
}
}
break;
}
read
返回值:
>0 ,read实际读到的字节数
=0,数据读完(读到文件末尾、管道(写端关闭,read返回0,好似读到文件末尾)、socket末尾(其中读到socket末尾表示对端关闭))
问题:存不存在对端没关闭,但是不向socket中写数据的情况呢?
存在,此时read函数并不会返回0,而是会阻塞住。
-1,异常,通过errno排除正常的错误;
- errno = EINTR ,被信号中断
- errno = EAGAIN(EWOULDBLOCK) 通过fctl设置为非阻塞时,出现非阻塞方式读,并且没有数据的情况。
表示,过段时间应重新读一下。
- 其他err.
write
返回值同read.
因为是慢速,所以,在调用的过程中,存在被信号中断的可能性,所以,需要当函数返回-1出错的时,需要通过errrono继续进行判断,如果是。。。等错误,可以忽略,应该继续进行。
select:
<0 :出错
=0:超时
>0 :有事件发生
struct timeval wwait;
wwait.tv_sec = 3
wwait.tv_usec = 0;
while(1){
int status = select(socket + 1, &fd_read, (fd_set *)0, (fd_set *)0, &wwait);
if(status < 0)
{
if((errno == EINTR) || (errno == EAGAIN))
{
std::cout<<"erro"<<strerror(errno)<<std::endl;
continue;
}
printf("select error, info: %s!", strerror(errno));
return -1;
}
else if(status == 0)
{
//timeout
// printf(" select timeout: %s!", strerror(errno));
return 0;
}
break;
}
}