Unix网络编程之给阻塞式函数设定超时限定
来源:互联网 发布:淘宝买日系钢笔的店铺 编辑:程序博客网 时间:2024/05/16 18:33
1.给read函数设定超时时间。
代码:
int read_timeout(int fd,unsigned int wait_seconds){ int ret = 0; if(wait_seconds > 0){ fd_set set; struct timeval timeout; FD_ZERO(&set); FD_SET(fd,&set); timeout.tv_sec = wait_seconds; timeout.tv_usec = 0; do{ ret = select(fd+1,&set,NULL,NULL,&timeout); }while(ret < 0 && errno == EINTR); if(ret == 0){ ret = -1; errno = ETIMEDOUT; } else if(ret == 1) ret = 0; } return ret;}
2.给write函数设定超时时间。
代码:
int write_timeout(int fd,unsigned int wait_seconds){ int ret = 0; if(wait_seconds > 0){ fd_set set; struct timeval timeout; FD_ZERO(&set); FD_SET(fd,&set); timeout.tv_sec = wait_seconds; timeout.tv_usec = 0; do{ ret = select (fd+1,NULL,&set,&timeout); }while(ret <0 && errno == EINTR); if(ret == 0){ ret = -1; errno == ETIMEDOUT; } else if(ret == 1){ ret = 0; } } return ret;}
3.给accept函数设定超时限定。
代码:
int accept_timeout(int fd,struct sockaddr_in *addr,unsigned int wait_seconds){ int ret = 0; socklen_t addrlen = sizeof(struct sockaddr_in); if(wait_seconds > 0){ fd_set set; struct timeval timeout; FD_ZERO(&set); FD_SET(fd,&set); timeout.tv_sec = wait_seconds; timeout.tv_usec = 0; do{ ret = select(fd+1,&set,NULL,NULL,&timeout); }while(ret < 0 && errno == EINTR); if(ret == -1) return -1; else if(ret == 0){ errno = ETIMEDOUT; } } if(addr != NULL){ accept(fd,(struct sockaddr*)addr,&addrlen); }else ret = accept(fd,NULL,NULL); if(ret == -1) ERR_EXIT("accept"); return ret;}
4.给connect 函数设定超时限定。
代码:
int connect_timeout(int fd,struct sockaddr_in *addr,unsigned int wait_seconds){ int ret; socklen_t addrlen = sizeof(struct sockaddr_in); if(wait_seconds > 0){ activate_nonblock(fd); } ret = connect(fd,(struct sockaddr*)addr,addrlen); if(ret < 0&& errno == EINPROGRESS){ fd_set set; struct timeval timeout; FD_ZERO(&set); FD_SET(fd,&set); timeout.tv_sec = wait_seconds; timeout.tv_usec = 0; do{ ret = select(fd+1,NULL,&set,NULL,&timeout); }while(ret < 0 && errno == EINTR); if(ret == 0){ ret = -1; errno = ETIMEDOUT; }else if(ret < 0) return -1; else if(ret ==1) { int err; socklen_t socklen = sizeof(err); int sockoptret = getsockopt(fd,SOL_SOCKET,SO_ERROR,&err,&socklen); if(err == 0){ ret = 0; }else{ errno = err; ret = -1; } } } if(wait_seconds > 0) { deactivate_nonblock(fd); } return ret;}
5.给一个fd设置阻塞还是非阻塞的函数:
(1)设定fd为非阻塞
void deactivate_nonblock(int fd){ int ret; int flags = fcntl(fd,F_GETFL); if(flags ==-1) ERR_EXIT("fcntl"); flags &= ~O_NONBLOCK; ret = fcntl(fd,F_SETFL,flags); if(ret == -1) ERR_EXIT("fcntl");}(2)设定fd为阻塞:
void activate_nonblock(int fd){ int ret; int flags = fcntl(fd,F_GETFL); if(flags == -1){ ERR_EXIT("fcntl"); } flags |= O_NONBLOCK; ret = fcntl(fd,F_SETFL,flags); if(ret == -1){ ERR_EXIT("fcntl"); }}
0 0
- Unix网络编程之给阻塞式函数设定超时限定
- Unix网络编程之socket阻塞与非阻塞模式下函数调用结果分析
- Unix网络编程之同步/异步/阻塞/非阻塞
- UNIX网络编程之常用函数
- Unix网络编程之readline函数
- UNIX网络编程----非阻塞式I/O(十六)
- 【UNIX网络编程】非阻塞式IO总结
- UNIX网络编程--设置I/O超时
- Unix 网络编程 函数
- 网络编程Socket之UDP(三)超时设置和非阻塞
- UNIX网络编程--socket中的同步/异步 阻塞/非阻塞
- UNIX网络编程--socket中的同步/异步 阻塞/非阻塞
- [python&php 网络编程]设定并获取socket超时时间
- Java非阻塞NIO网络编程连接超时的处理
- Linux网络编程-UDP数据阻塞接收超时设置
- unix 网络编程常用函数
- Unix网络编程 gethostbyname函数
- Unix网络编程相关函数
- 文本超出部分用省略号表示
- C#IO流总结
- swift学习笔记--for循环移除后的不便
- C++如何读取任意数目的整数
- MQ、JMS以及ActiveMQ
- Unix网络编程之给阻塞式函数设定超时限定
- VS2015使用小技巧 添加COM组件 Windows media player
- Linux进程与线程的区别
- Android Java.lang.UnsatisfiedLinkError: Couldn't load locSDK3: findLibrary returned null.
- 在Linux运行期间升级Linux系统(Uboot+kernel+Rootfs)
- 小米2017校招面试经历
- 线性表的实现
- LeetCode 258. Add Digits 题解(C++)
- 研究Fast rcnn代码