zoukankan      html  css  js  c++  java
  • select函数使用

    这两天写了这么一段代码,select直接返回-1,错误信息是“invalid argments”,显然没有达到阻塞超时的效果。

    代码如下:

    bool IsSocketWaitRead(inf fd,int usec)
    {
      fd_set rfds;
      FD_ZERO(&rfds);
      FD_SET(fd,&rfds);
      struct timeval t_out;
      t_out.tv_sec = 0;
      t_out.tv_usec = usec;
      return select(fd+1,&rfds,NULL,NULL,&t_out) > 0? true : false;
    }

    这段代码在标准的linux环境可以运行,但是在ARM体系架构的国产化操作系统下,返回值永远是-1

    修改之后:

    bool IsSocketWaitRead(int fd,int ms)
    {
      fd_set rfds;
      FD_ZERO(&rfds);
      FD_SET(fd,&rfds);
      struct timeval t_out;

      memset(&t_out,0,sizeof(struct timeval));  

      t_out.tv_sec = ms/1000;

      t_out.tv_usec = (ms%1000) *1000;

      return select(sockfd+1,&rfds,NULL,NULL,&t_out) > 0? true : false;
    }

    从这段代码中,参数t_out设置的有问题。这也警告我们,在使用别的函数时,也要初始化struct。

    总结:

    select函数在linux系统编程使用频率很多,它可以监测文件描述符的读写事件,也可以实现小并发服务器。

    一个结构体的初始化,考验的是编程细节。

  • 相关阅读:
    「杂文」随想录
    「小说」妖精舞于废墟之上
    昨日之盛,明日之俗 ~ SDOI2021 退役记
    P6292 区间本质不同子串个数
    「杂文」生之重
    「闭门造车」二叉分块树
    「杂文」雨色的魔法(一)
    「笔记」斜率优化 DP
    「笔记」后缀数组
    NOIP 2020 AFO 记
  • 原文地址:https://www.cnblogs.com/jfyl1573/p/11510512.html
Copyright © 2011-2022 走看看