完成了socket编程的阻塞与非阻塞,接下俩就要处理前面讲过的关于超时处理的内容了。
select函数我们可以看下接口手册
如下代码:
FD_ZERO(&set); //文件句柄置空
FD_SET(sock, &set); //把这个sock加入到这个文件句柄当中
timeval tm;
tm.tv_sec = 0;
tm.tv_usec = timeoutms * 1000;
if (select(sock + 1, 0, &set, 0, &tm) <= 0) //监听这个文件序列是否有可读可写
{
printf("connect %s:%d failed:%s\n", ip, port, strerror(errno));
printf("connect timeout or error!\n");
return false;
}
概述:
对于一个套接字的读写(read/write)操作默认是阻塞的,如果当前套接字还不可读/写,那么这个操作会一直阻塞下去。可以在进行读写操作的时候可以指定超时值,这样就读写操作就不至于一直阻塞下去。
对于非阻塞的套接字立即返回.超时对于阻塞的套接字更有用.
在涉及套接字的I/O操作上设置超时的方法有三种:
1:调用alarm,它在指定的超时期满时产生SIGALRM信号。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。
2:在select中阻塞等待I/O(select有内置的时间限制),依次代替直接阻塞在read或write调用上。(linux2.6以后的内核也可以使用epoll的epoll_wai