码迷,mamicode.com
首页 > 其他好文 > 详细

套接字I/O超时设置的方法

时间:2020-03-25 23:11:15      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:soc   rar   sizeof   支持   sele   ndt   read   nbsp   unsigned   

用select实现超时

1.read_timeout函数封装

2.write_timeout

3.accept_timeout

4.connect_timeout

套接字I/O超时设置方法

1.ararm

第一种:

SIGALRM

void handler(int sig)

{

return 0;

}

signal(SIGLRM,handler);

alarm(5);                     

int ret =read(fd,buf,sizeof(buf));

if(ret== -1&&errno == EINET)

{

  errno = ETIMEOUT;

}else if (ret>=0)

{

   alarm(0);

第二种

sctsockopt(sock, SOL_SOCKET, SO_RECVTIMEO,5);

int ret = read(sock, buf, sizeof(buf));

if(ret == -1&&errno = EWOULLBLOCK)

{

    errno = ETIMEOUT;  

}// 有些时候不支持

2.套接字选项

   1)  SO_SNDTIMEO

   2)  SO_RCVTIMEO

a)  read_timeout(int fd,  unsigned int wait_seconds )

逻辑: 读超时检测函数(不含读操作)

       成功(未超时),返回0;

       失败 /超时-1 且 errno = ETIMEOUT;

int ret = read_timeout(fd, 5);

if (ret ==0)

{

    read(fd...);

}

else if(ret==-1)

{

 timeout...

}else

{

  ERR_EXIT("read_timeout");

}

b)  write_timeout 同理(不含写操作)

c)  accept_timeout 带超时的accept

成功返回已连接的套接字,超市返回-1且errno = ETIMEOUT

accept_timeout (int fd , struct sockaddr_in  *addr. unsigned int wait_seconds)

d)connect-timeout

connect_timeout (int fd, struct sockaddr_in *addr, unsigned int wait_seconds)

addr: 要连接的对方的地址

成功返回0 , 失败返回-1且errno = ETIMEOUT

如果waite_seconds>0就改成非阻塞模式,调用connect_timeout

 

获取错误信息:调用getsockopt()

int err;

socklen_t socklen = sizeof(err);

int  sockoptret = getsockopt(fd , SOL_SOCKET, SO_ERROR, &err, &socklen);

if (sockoptret == -1) 

return -1;

if(err ==0)

ret=0;

else

{

errno =err;

ret =-1;

}

最后处理完成还要返回ret 的值

 

套接字I/O超时设置的方法

标签:soc   rar   sizeof   支持   sele   ndt   read   nbsp   unsigned   

原文地址:https://www.cnblogs.com/Begin-Again/p/12571023.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!