首页 > 代码库 > 第十四章 高级I/O函数
第十四章 高级I/O函数
在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;
第十四章 高级I/O函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。