这两天写了这么一段代码,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系统编程使用频率很多,它可以监测文件描述符的读写事件,也可以实现小并发服务器。

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

select函数使用的更多相关文章

  1. (十二)select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型:int select(int maxfd,fd_set *rdset ...

  2. select 函数1

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accept.recv或recvfrom这样的阻塞程序( ...

  3. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    http://hi.baidu.com/%B1%D5%C4%BF%B3%C9%B7%F0/blog/item/e7284ef16bcec3c70a46e05e.html select函数用于在非阻塞中 ...

  4. PHP Socket实现websocket(四)Select函数

    int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); /* ...

  5. IO复用与select函数

    socket select函数的详细讲解 select函数详细用法解析      http://blog.chinaunix.net/uid-21411227-id-1826874.html linu ...

  6. I/O多路复用——select函数与poll函数

    1 区别 同:(1)机制类似,本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理.(2)包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就 ...

  7. select函数

    select函数: http://baike.baidu.com/view/3421856.htm select函数   目录 概况 操作程序 宏解释 socket读写 概况 select()的机制中 ...

  8. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)

    select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型, 原型: int select(int maxfd,fd_set *rds ...

  9. 阻塞、非阻塞的概念和select函数的阻塞功能

    其它文档: http://www.cnitblog.com/zouzheng/archive/2010/11/25/71711.html (1)阻塞block     所谓阻塞方式block,顾名思义 ...

  10. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET (转)

    select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型: #include <sys/time.h>       ...

随机推荐

  1. 自定义alert 确定、取消功能

    以删除为例,首先新建html <table border="1" cellpadding="0" cellspacing="0" id ...

  2. NX二次开发-time.h获取计算机本地时间

    NX9+VS2012 #include <stdio.h> #include <time.h> char *wday[] = { "Sun", " ...

  3. 【latex】latex基础

    文档边距.间距调整 边距调整 \usepackage{geometry} %设置页边距的宏包 \geometry{left=3.0cm,right=2.5cm,top=2.5cm,bottom=2.5 ...

  4. js函数中的apply()、call()、bind()方法

    ECMAScript中的函数是对象,因此函数也有属性和方法.每个函数都包含两个属性:length和prototype,且每个函数包含两个非继承而来的方法apply()和call().这两个方法的用途都 ...

  5. hibernate 一对多查询 对多的一方进行分页

    //查询用户留言@Overridepublic List<LeaveWords> getLeaveWords(String userName) {Session session = nul ...

  6. mysql数据库中的索引介绍与优化(转)

    一.什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表 ...

  7. 利用zk客户端删除solr shard

    进入zk客户端 ./bin/zkCli.sh -server ip:2181 显示所有的内容: ls / 删除数据: rmr /filename path

  8. maven javaProject打包发布成服务

    1,现在pom.xml中添加打包所需要的jar包. <plugins> <plugin> <groupId>org.apache.maven.plugins< ...

  9. Spark RDD基本操作

  10. log-slave-updates参数

    从库做为其他从库的主库时 log-slave-updates参数是必须要添加的,因为从库要作为其他从库的主库,必须添加该参数.该参数就是为了让从库从主库复制数据时可以写入到binlog日志,为什么要用 ...