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模式和超时的更多相关文章

  1. WinSockets编程(六)select模式

    select模式的思想 创建FD_SET fd_all,并初始化FD_ZERO(&fd_all); Step1  初始时: Step2   加入一个套接字之后,比如FD_SET(sServer ...

  2. select模式

    在很多比较各种网络模型的文章中,但凡提到select模型时,都会说select受限于轮询的套接字数量,这个 数量也就是系统头文件中定义的FD_SETSIZE值(例如64).但事实上这个算不上真的限制. ...

  3. go语言之进阶篇 select实现的超时机制

    1.select实现的超时机制 示例: package main import ( "fmt" "time" ) func main() { ch := mak ...

  4. WPF InkCanvas EditingMode为Select时 在其选择时各种事件中撤销Select模式的方法

    InkCanvas有多种输入模式. 通过InkCanvasEditingMode来进行对其调整 分别是 None=0// 忽略鼠标和手写笔输入 Ink = 1// 允许用户绘制批注,默认模式.使用鼠标 ...

  5. python 简单搭建非阻塞式单进程,select模式,epoll模式服务

    由于经常被抓取文章内容,在此附上博客文章网址:,偶尔会更新某些出错的数据或文字,建议到我博客地址 :  --> 点击这里 可以看我的上篇文章 <python 简单搭建阻塞式单进程,多进程, ...

  6. select 设置发送超时发送注意事项

    //设置发送超时你只发送, 并发送足够多的数据以填满发送缓冲区, 接收端一直不接收.发送端一量满发送缓冲区就会阻塞, 如果你设置了发送超时, 超时到了它就会返回发送超时了. 在send(),recv( ...

  7. 使用 select 实现 goroutine 超时

    虽然携程是Go语言中一个新的概念,嗯,但它本质上依然是属于多线程.超时机制是多线程中是一个非常重要的保障程序的鲁棒性的一个措施:错误是很难预估的,在多线程中更为显著,更容易出现难以预料的错误. 一个异 ...

  8. TCP Socket Port Check

    写了两个小程序,主要是用于linux和windows下TCP端口的检测,自带的telnet无法满足我批量检测的需要,在我眼里这类端口检测程序最为关键的是超时的限制,若端口不能却要老久才返回结果,有点不 ...

  9. 套接字IO超时设置和使用select实现超时管理

    在涉及套接字IO超时的设置上有一下3种方法: 1.调用alarm,它在指定的时期满时产生SIGALRM信号.这个方法涉及信号的处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm ...

随机推荐

  1. node api 之:process - 进程

    process 对象是一个全局变量,它提供当前 Node.js 进程的有关信息,以及控制当前 Node.js 进程. 因为是全局变量,所以无需使用 require().

  2. 从输入URL到页面加载的过程?由一道题完善自己的前端知识体系!

    出处:http://mp.weixin.qq.com/s/qMsf4DcMhn2cf0fXC-PLVA 强缓存与弱缓存 缓存可以简单的划分成两种类型: 强缓存( 200fromcache)与 协商缓存 ...

  3. docker 容器时间跟宿主机时间同步

    docker 容器时间跟宿主机时间同步 docker cp /etc/localtime 87986863838b:/etc/docker cp /etc/localtime container-na ...

  4. 深入解析 ext2 文件系统 (转)

    http://blog.chinaunix.net/uid-24774106-id-3266816.html 很久以来,就想写一篇关于ext 家族文件系统的文章,源于我刚工作的时候,曾经一不小心rm ...

  5. Spring4相关jar包介绍(转)

    Spring4相关jar包介绍 spring-core.jar(必须):这个jar 文件包含Spring 框架基本的核心工具类.Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心,当 ...

  6. Zookeeper watcher机制

    一.watcher机制 1.针对每个节点的操作,都会有一个监督者-> watcher 2.当监控的某个对象(znode)发生了变化,则触发watcher事件 3.zk中的watcher是一次性的 ...

  7. ASP.NET AJAX入门系列(8):自定义异常处理

    在UpdatePanel控件异步更新时,如果有错误发生,默认情况下会弹出一个Alert对话框显示出错误信息,这对用户来说是不友好的,本文看一下如何在服务端和客户端脚本中自定义异常处理,翻译自官方文档. ...

  8. Qt 中的事件处理(二)

    1. 回顾事件传递的过程 ①源头:操作系统   操作系统检测到用户的动作时,就会产生一个系统消息,系统消息就会被发送到正在运行的Qt应用程序中, ②应用程序收到系统消息后, 他会将系统消息翻译成对应的 ...

  9. Spring Cloud(Dalston.SR5)--Eureka 注册中心搭建

    基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务治理可以说是微服务架构中最为核心和基础的模块,他主要用来实现各个微服务实例的自动化注册与发现 服务注册:在 ...

  10. Video to SDI Tx Bridge模块video_data(SD-SDI)处理过程

    Video to SDI Tx Bridge模块video_data(SD-SDI)处理过程 1.Top Level Block Diagram of Video to SDI TX Bridge V ...