Linux 下select 函数用法(I/O多路复用)

Linux处理多个socket 简单的来说有两种方式。1,每个socket 用一个线程来处理,有多少socket就创建立多少线程。2,在单个线程或主程序中使用 Select 函数,处理多个socket

 

方式1适用于内存大,socket连接数量不多的情况。Linux 系统每创建一个线程就要默认分配8M大小的栈空间。线程过多会很吃内存。但是这种处理方式比较简单,并发性较强。

 

方式2 省内存。基本原理就是把已经建立的socket连接加入到 Select的监控中。select函数会阻塞,如果监控到某些socket 可读或可写,那么select 函数返回正值,接下来recvsend就可以了。

伪代码:

 while(1)

{

  fd_set fdsr;

  FD_ZERO(&fsdr );                //  清空某个列表。

  FD_SET(sockid,  &fdsr);       //  把某个socket 加入到监控中

  ret = select(maxsock + 1, &fdsr,  NULL,  NULL, &tv );   // 阻塞

  if(ret < 0)

  {

    break;  // 退出

  }

  else

  {

    countinue; //  继续下一次循环

  }

  if (FD_ISSET(sockid,   &fdsr))   // 测试某个socket 是否在监控列表中

  {

    ret = recv(fd_A[i], buf, sizeof(buf), 0);

  }

}

参数 maxsock : 监控socket集合的最大值,比如说有4sock分别说 1,2,3,4 那么Maxsock = 4

参数fdsr: socket集合

参数  tv: 函数阻塞时间。

 

posted @ 2018-11-27 14:02  来火天大有  阅读(404)  评论(0编辑  收藏  举报