首页 > 代码库 > 第十四章 高级I/O函数

第十四章 高级I/O函数

在I/O操作上设置超时的三种方法:

  1. 调用alarm,超时产生SIGALRM信号;

  2. 在select中阻塞等待I/O,select可以设定超时,代替阻塞在I/O调用上;

  3. 使用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;

第十四章 高级I/O函数