Select模式和超时
fd_set rset;
FD_ZERO(&rset); int nready;
int maxfd;
int fd_stdin = fileno(stdin);
if(fd_stdin > sock)
{
maxfd = fd_stdin;
}
else
{
maxfd = sock;
} char sendbuf[] = { };
char recvbuf[] = { };
while()
{
FD_SET(fd_stdin,&rset);
FD_SET(sock,&rset);
nready = select(maxfd+,&rset,NULL,NULL,NULL);
if(nready == -)
ERR_EXIT("select");
if(nready == )
continue; if(FD_ISSET(sock,&rset))
{ int ret = readline(sock,recvbuf,sizeof(sendbuf));
if(ret == -)
ERR_EXIT("readn");
else if(ret == )
{
printf("server close");
break;
} fputs(recvbuf,stdout);
memset(sendbuf,, sizeof(sendbuf));
memset(recvbuf,, sizeof(recvbuf));
} if(FD_ISSET(fd_stdin,&rset))
{
if(fgets(sendbuf,sizeof(sendbuf),stdin) == NULL)
break;
writen(sock,sendbuf,strlen(sendbuf));
}
}
close(sock);
- void FD_CLR(int fd,fd_set *set);
- int FD_ISSET(int fd,fd_set *set);
- void FD_SET(int fd,fd_set *set);
- void FD_ZERO(fd_set *set);
- select的超时
-
//读超时
int read_timeout(int fd,unsigned int wait_seconds)
{
int ret = ;
if(wait_seconds > )
{
fd_set read_fdset;
struct timeval timeout; FD_ZERO(&read_fdset);
FD_SET(fd,&read_fdset); timeout.tv_sec = wait_seconds;
timeout.tv_usec = ;
do
{
ret = select(fd+,&read_fdset,NULL,NULL,&timeout);
}while(ret < && errno == EINTR) if(ret == )
{
ret = -;
errno = ETIMEDOUT;
}
else if(ret == )
ret = ;
}
return ret;
} //接收超时
int accept_timeout(int fd,struct sockaddr_in *addr,unsigned int wait_seconds)
{
int ret;
socklen_t addrlen = sizeof(struct sockaddr_in); if(wait_seconds > )
{
fd_set accept_fdset;
struct timeval timeout;
FD_ZERO(&accept_fdset);
FD_SET(fd,&accept_fdset);
timeout.tv_sec = wait_seconds;
timeout.tv_usec = ;
do
{
ret = select(fd+,&accept_fdset,NULL,NULL,&timeout);
}while(ret < && errno == EINTR) if(ret == -)
return -;
else if(ret == )
{
errno = ETIMEDOUT;
return -;
}
}
if(addr != NULL)
ret = accept(fd,(struct sockaddr*)addr,&addrlen);
else
ret = accept(fd,NULL,NULL);
if(ret == -)
ERR_EXIT("accept");
return ret;
} void activate_nonblock(int fd)
{
int ret;
int flags = fcntl(fd,F_GETFL);
if(flags == -)
ERR_EXIT("fcntl");
flags |= O_NONBLOCK;
ret = fcntl(fd,F_SETFL,flags);
if(ret == -)
ERR_EXIT("fcntl");
} void deactivate_nonblock(int fd)
{
int ret;
int flags = fcntl(fd,F_GETFL);
if(flags == -)
ERR_EXIT("fcntl");
flags &~ O_NONBLOCK;
ret = fcntl(fd,F_SETFL,flags);
if(ret == -)
ERR_EXIT("fcntl");
} //连接超时
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 > )
activat_nonblock(fd); ret = connect(fd,(struct sockaddr*)addr,addrlen);
if(ret < && errno == EINPROGRESS)
{
fd_set connect_fdset;
struct timeval timeout;
FD_ZERO(&connect_fdset);
FD_SET(fd,&connect_fdset);
timeout.tv_sec = wait_seconds;
timeout.tv_usec = ;
do
{
ret = select(fd+,NULL,&connect_fdset,NULL,&timeout);
}while(ret < && errno == EINTR)
if(ret == )
{
ret = -;
errno = ETIMEDOUT;
}
else if(ret < )
return -;
else if(ret == )
{
int err;
socklen_t socklen = sizeof(err);
int sockoptret = getsockopt(fd,SOL_SOCKET,SO_ERROR,&err,&socklen);
if(sockoptret == -)
{
return -;
}
if(err == )
ret = ;
else
{
errno = err;
ret = -;
}
}
} if(wait_seconds > )
{
deactivate_nonblock(fd);
}
return ret;
}
-
Select模式和超时的更多相关文章
- WinSockets编程(六)select模式
select模式的思想 创建FD_SET fd_all,并初始化FD_ZERO(&fd_all); Step1 初始时: Step2 加入一个套接字之后,比如FD_SET(sServer ...
- select模式
在很多比较各种网络模型的文章中,但凡提到select模型时,都会说select受限于轮询的套接字数量,这个 数量也就是系统头文件中定义的FD_SETSIZE值(例如64).但事实上这个算不上真的限制. ...
- go语言之进阶篇 select实现的超时机制
1.select实现的超时机制 示例: package main import ( "fmt" "time" ) func main() { ch := mak ...
- WPF InkCanvas EditingMode为Select时 在其选择时各种事件中撤销Select模式的方法
InkCanvas有多种输入模式. 通过InkCanvasEditingMode来进行对其调整 分别是 None=0// 忽略鼠标和手写笔输入 Ink = 1// 允许用户绘制批注,默认模式.使用鼠标 ...
- python 简单搭建非阻塞式单进程,select模式,epoll模式服务
由于经常被抓取文章内容,在此附上博客文章网址:,偶尔会更新某些出错的数据或文字,建议到我博客地址 : --> 点击这里 可以看我的上篇文章 <python 简单搭建阻塞式单进程,多进程, ...
- select 设置发送超时发送注意事项
//设置发送超时你只发送, 并发送足够多的数据以填满发送缓冲区, 接收端一直不接收.发送端一量满发送缓冲区就会阻塞, 如果你设置了发送超时, 超时到了它就会返回发送超时了. 在send(),recv( ...
- 使用 select 实现 goroutine 超时
虽然携程是Go语言中一个新的概念,嗯,但它本质上依然是属于多线程.超时机制是多线程中是一个非常重要的保障程序的鲁棒性的一个措施:错误是很难预估的,在多线程中更为显著,更容易出现难以预料的错误. 一个异 ...
- TCP Socket Port Check
写了两个小程序,主要是用于linux和windows下TCP端口的检测,自带的telnet无法满足我批量检测的需要,在我眼里这类端口检测程序最为关键的是超时的限制,若端口不能却要老久才返回结果,有点不 ...
- 套接字IO超时设置和使用select实现超时管理
在涉及套接字IO超时的设置上有一下3种方法: 1.调用alarm,它在指定的时期满时产生SIGALRM信号.这个方法涉及信号的处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm ...
随机推荐
- operator 重载内置运算符
operator 关键字来重载内置运算符,或提供类或结构声明中的用户定义转换.它可以定义不同类型之间采用何种转化方式和转化的结果. operator用于定义类型转化时可采用2种方式,隐式转换(impl ...
- 【KiCad】 如何给元件给元件的管脚加上划线?
如何给元件给元件的管脚加上划线? 在一线元件需要注明一些引脚是低电位使能的. 比如这样. 每款 EDA 软件有不同的做法,有的是在前后使用 /,有的是给每个字母加上 /. KiCad 不一样,使用的是 ...
- docker for mac 安装 kubernetes、kubernetes dashboard
安装参考地址(按照此文档,安装成功):https://yq.aliyun.com/articles/508460 官方说明:https://kubernetes.io/docs/tasks/acces ...
- 实例对象与 new 命令
引用:https://wangdoc.com/javascript/oop/new.html JavaScript 语言的对象体系,不是基于"类"的,而是基于构造函数(constr ...
- 到底什么是ES索引?
你会发现,其实在ES里面,索引扮演的角色其实并不是存储,而是“索引”,看起来有点傻,但是其实我之前一直理解索引是存储,其实从命名上可以看出来,索引其实是分片的索引,分片的字典,记录了每个分片的位置,索 ...
- C# ASCII与字符串间相互转换 (转)
引言: 最近开始学习C#,在写串口助手小工具时遇到十六进制发送与字符发送之间转换的问题, 小弟通过网络各路大神的帮助下,终于实现正确显示收发,小弟菜鸟一枚,不足之处还望各位批评指正O(∩_∩)O! 其 ...
- openwrt lan/wan口自动翻转
参考: http://www.right.com.cn/forum/thread-75532-1-1.html 该实验基于ar9331 dragino2板子的,板子只引出一个LAN口. 1. 固件编译 ...
- AXI_LITE源码学习笔记
AXI_LITE源码学习笔记 1. axi_awready信号的产生 准备接收写地址信号 // Implement axi_awready generation // axi_awready is a ...
- VGA图像显示组成模块分析
VGA图像显示组成模块分析 1.片上内存(FPGA RAM)充当存储器 2.静态内存(SRAM)充当存储器 3.将静态内存换为动态内存 动态内存容量大,但是即时能力不好,它无法立即响应VGA功能模块, ...
- 2015.4.21第一篇cnblog文章
个人学习记录第一篇. 输出才是最好一条途径,这也是开源的精神所在.