标签:
在I/O操作上设置超时的三种方法:
调用alarm,超时产生SIGALRM信号;
在select中阻塞等待I/O,select可以设定超时,代替阻塞在I/O调用上;
使用SO_RCVTIMEO和SO_SNDTIMEO套接字选项;
书中的connect_timeo.c是封装了connect,并且多传入一个超时时间参数。
#include "../include/unpv13.h"
static void connect_alarm(int);
int connect_timeo(int sockfd, const struct sockaddr *saptr, socklen_t salen, int nsec) { /* typedef void Sigfunc(int); 这是在头文件中定义的 */ Sigfunc *sigfunc; int n;
sigfunc = signal(SIGALRM, connect_alarm); //先设置SIGALRM处理函数 if (alarm(nsec) != 0) { // 设置超时时间 printf("connect_timeo: alarm was already set\n"); exit(1); } if ((n = connect(sockfd, saptr, salen)) < 0) { close(sockfd); if (errno == EINTR) errno = ETIMEDOUT; }
alarm(0); signal(SIGALRM, sigfunc);
return (n); }
static void connect_alarm(int signo) { return; } 这可以缩短超时时间,但是不能延长connect自身的超时时间 struct timeval tv; tv.tv_sec = 5; tv.tv_usec = 0; setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); 超时设置errno为EWOULDBLOCK;
标签:
原文地址:http://my.oschina.net/bxxfighting/blog/375034