标签:
在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