1. fd_set rset;
  2. FD_ZERO(&rset);
  3.  
  4. int nready;
  5. int maxfd;
  6. int fd_stdin = fileno(stdin);
  7. if(fd_stdin > sock)
  8. {
  9. maxfd = fd_stdin;
  10. }
  11. else
  12. {
  13. maxfd = sock;
  14. }
  15.  
  16. char sendbuf[] = { };
  17. char recvbuf[] = { };
  18. while()
  19. {
  20. FD_SET(fd_stdin,&rset);
  21. FD_SET(sock,&rset);
  22. nready = select(maxfd+,&rset,NULL,NULL,NULL);
  23. if(nready == -)
  24. ERR_EXIT("select");
  25. if(nready == )
  26. continue;
  27.  
  28. if(FD_ISSET(sock,&rset))
  29. {
  30.  
  31. int ret = readline(sock,recvbuf,sizeof(sendbuf));
  32. if(ret == -)
  33. ERR_EXIT("readn");
  34. else if(ret == )
  35. {
  36. printf("server close");
  37. break;
  38. }
  39.  
  40. fputs(recvbuf,stdout);
  41. memset(sendbuf,, sizeof(sendbuf));
  42. memset(recvbuf,, sizeof(recvbuf));
  43. }
  44.  
  45. if(FD_ISSET(fd_stdin,&rset))
  46. {
  47. if(fgets(sendbuf,sizeof(sendbuf),stdin) == NULL)
  48. break;
  49. writen(sock,sendbuf,strlen(sendbuf));
  50. }
  51. }
  52. 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的超时
    •   

      1. //读超时
      2. int read_timeout(int fd,unsigned int wait_seconds)
      3. {
      4. int ret = ;
      5. if(wait_seconds > )
      6. {
      7. fd_set read_fdset;
      8. struct timeval timeout;
      9.  
      10. FD_ZERO(&read_fdset);
      11. FD_SET(fd,&read_fdset);
      12.  
      13. timeout.tv_sec = wait_seconds;
      14. timeout.tv_usec = ;
      15. do
      16. {
      17. ret = select(fd+,&read_fdset,NULL,NULL,&timeout);
      18. }while(ret < && errno == EINTR)
      19.  
      20. if(ret == )
      21. {
      22. ret = -;
      23. errno = ETIMEDOUT;
      24. }
      25. else if(ret == )
      26. ret = ;
      27. }
      28. return ret;
      29. }
      30.  
      31. //接收超时
      32. int accept_timeout(int fd,struct sockaddr_in *addr,unsigned int wait_seconds)
      33. {
      34. int ret;
      35. socklen_t addrlen = sizeof(struct sockaddr_in);
      36.  
      37. if(wait_seconds > )
      38. {
      39. fd_set accept_fdset;
      40. struct timeval timeout;
      41. FD_ZERO(&accept_fdset);
      42. FD_SET(fd,&accept_fdset);
      43. timeout.tv_sec = wait_seconds;
      44. timeout.tv_usec = ;
      45. do
      46. {
      47. ret = select(fd+,&accept_fdset,NULL,NULL,&timeout);
      48. }while(ret < && errno == EINTR)
      49.  
      50. if(ret == -)
      51. return -;
      52. else if(ret == )
      53. {
      54. errno = ETIMEDOUT;
      55. return -;
      56. }
      57. }
      58. if(addr != NULL)
      59. ret = accept(fd,(struct sockaddr*)addr,&addrlen);
      60. else
      61. ret = accept(fd,NULL,NULL);
      62. if(ret == -)
      63. ERR_EXIT("accept");
      64. return ret;
      65. }
      66.  
      67. void activate_nonblock(int fd)
      68. {
      69. int ret;
      70. int flags = fcntl(fd,F_GETFL);
      71. if(flags == -)
      72. ERR_EXIT("fcntl");
      73. flags |= O_NONBLOCK;
      74. ret = fcntl(fd,F_SETFL,flags);
      75. if(ret == -)
      76. ERR_EXIT("fcntl");
      77. }
      78.  
      79. void deactivate_nonblock(int fd)
      80. {
      81. int ret;
      82. int flags = fcntl(fd,F_GETFL);
      83. if(flags == -)
      84. ERR_EXIT("fcntl");
      85. flags &~ O_NONBLOCK;
      86. ret = fcntl(fd,F_SETFL,flags);
      87. if(ret == -)
      88. ERR_EXIT("fcntl");
      89. }
      90.  
      91. //连接超时
      92. int connect_timeout(int fd,struct sockaddr_in *addr, unsigned int wait_seconds)
      93. {
      94. int ret;
      95. socklen_t addrlen = sizeof(struct sockaddr_in);
      96.  
      97. if(wait_seconds > )
      98. activat_nonblock(fd);
      99.  
      100. ret = connect(fd,(struct sockaddr*)addr,addrlen);
      101. if(ret < && errno == EINPROGRESS)
      102. {
      103. fd_set connect_fdset;
      104. struct timeval timeout;
      105. FD_ZERO(&connect_fdset);
      106. FD_SET(fd,&connect_fdset);
      107. timeout.tv_sec = wait_seconds;
      108. timeout.tv_usec = ;
      109. do
      110. {
      111. ret = select(fd+,NULL,&connect_fdset,NULL,&timeout);
      112. }while(ret < && errno == EINTR)
      113. if(ret == )
      114. {
      115. ret = -;
      116. errno = ETIMEDOUT;
      117. }
      118. else if(ret < )
      119. return -;
      120. else if(ret == )
      121. {
      122. int err;
      123. socklen_t socklen = sizeof(err);
      124. int sockoptret = getsockopt(fd,SOL_SOCKET,SO_ERROR,&err,&socklen);
      125. if(sockoptret == -)
      126. {
      127. return -;
      128. }
      129. if(err == )
      130. ret = ;
      131. else
      132. {
      133. errno = err;
      134. ret = -;
      135. }
      136. }
      137. }
      138.  
      139. if(wait_seconds > )
      140. {
      141. deactivate_nonblock(fd);
      142. }
      143. return ret;
      144. }

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. C#模拟键盘按键的三种方式实现

    1.System.Windows.Forms.SendKeys 组合键:Ctrl = ^ .Shift = + .Alt = % 模拟按键:A private void button1_Click(o ...

  2. httpclient中文乱码

    https://blog.csdn.net/teamlet/article/details/8605840

  3. 读懂 PetaLinux:让 Linux 在 Zynq 上轻松起“跑”(转)

    对于Zynq这样一个“ARM+可编程逻辑”异构处理系统我们已经不陌生,其创新性大家也有目共睹.不过想要让更多的应用享受到这一“创新”带来的红利,让其真正“落地”则需要大量系统性的工作,去营造一个完善的 ...

  4. Spring 中PageHelper分页插件使用

    1.增加pagehelper <!-- mybatis pager --> <dependency> <groupId>com.github.pagehelper& ...

  5. 菜鸟如何学习vue

    作为一个前端菜鸟,最近开始接触和学习vue. 以前用到的是bootstrap前端框架. Bootstrap,来自 Twitter,是目前最受欢迎的前端框架. Bootstrap 是基于 HTML.CS ...

  6. python kafka client--confluent-kafka-python

    项目中需要使用python 向Kafka生产和消费数据,最初使用pykafka .后来发现pykafka不支持client.id. 最后,终于找到confluent-kafka. python kaf ...

  7. java面试题001

    1.指针和函数的关系 这里主要谈指针函数和函数指针,在c中指针函数是返回值为指针的函数:函数指针是指向函数的指针变量. 2.什么是事务? 为了完成对数据的操作,要求并发访问在多个构件之间共享的数据.这 ...

  8. System Generator 使用离散资源

    System Generator 使用离散资源 重要,怎样配置FPGA中的DSP Macro 最后是编译模型

  9. iis重新注册.netframework4.0

    开始-运行-CMD  (管理员权限运行) %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i 废话不多说直接上图:

  10. 测试教程网.unittest教程.3. 实例: 测试弱密码

    From: http://www.testclass.net/pyunit/test_example_1/ 背景 考虑这样一个测试弱密码的实例,这个我们在pytest相关教程中也有过描述. 我们需要判 ...