用 select 实现处理多连接的异步通讯服务器

因为对于任何句柄 ( file descriptor ) select 函数都能检测出其状态变化,对于用于 listen 的 socket
也是一样。

只要把用于 listen 的 socket 加入 ( FD_SET ) 到 select 检测的集合里,当有连接到来时 select 就能判断到。因为
select 函数能处理的是句柄集合,所以加入这样一个 socket 并不与 select 判断其它 socket 的状态有任何冲突。

  • 实现片段代码:

#define MAX_NUM_ONLINE_SOCKET 100

int lsn_sock_fd;

int client_sock_fd[MAX_NUM_ONLINE_SOCKET];

fd_set rdfds;

int maxfds;

int tmp_fd;

struct time tv;

int retval;

int i;

maxfds = -1;

for(i = 0; i < MAX_NUM_ONLINE_SOCKET; i++) client_sock_fd[i] = -1;

lsn_sock_fd = socket(AF_INET, SOCK_STREAM, 0);

/* 设置监听的地址和端口 */

/* 调用 bind 把地址信息与 socket 绑定到一起 */

listen(lsn_sock_fd, 2);

while(1) {

maxfds = 0;

FD_ZERO(&rdfds);

if(lsn_sock_fd > 0) {

FD_SET(lsn_sock_fd, &rdfds);
/* 在这里把用于 listen 的 socket 加入到 select 判断的句柄集合里来 */

if( lsn_sock_fd > maxfds)
maxfds = lsn_sock_fd;

}
    for(i = 0; i <
MAX_NUM_ONLINE_SOCKET; i++) {

if(client_sock_fd[i] > 0) {

FD_SET(client_sock_fd[i],
&rdfds); /* 把所有在线客户端连接加入到 select 检测的集合中来 */

if( client_sock_fd[i] > maxfds) maxfds =
client_sock_fd[i];

}

}

tv.tv_sec = 1;

tv.tv_usec = 0;

if(maxfds < 1) continue;

retval = select(maxfds + 1, &rfds, NULL, NULL,
&tv);
    if(retval < 0) {

printf("select
出错,错误编号:%d,错误信息:%s\n", errno, strerror(errno));

break;

}

else if(!retval) continue; /* listen 的 socket
上没有任何连接到来,在线的所有连接上也没有任何一个上有数据到来 */

if(FD_ISSET(lsn_sock_fd, &rdfds)) { /* 说明 listen 的
socket 上有新的连接到来了 */

tmp_fd = accept(lsn_sock_fd,
......);

for(i = 0; i <
MAX_NUM_ONLINE_SOCKET; i++) {

if(client_sock_fd[i] < 0) {

client_sock_fd[i] = tmp_fd;

break;

}

}

if(i ==
MAX_NUM_ONLINE_SOCKET) {

printf("连接太多了,我最多只能接受%d个连接同时在线\n", MAX_NUM_ONLINE_SOCKET);

close(tmp_fd);

}
   
}
    for(i = 0; i < MAX_NUM_ONLINE_SOCKET; i++) {

if(FD_ISSET(client_sock_fd[i],
&rdfds)) { /* 说明第 i 个客户端连接上有数据到来了 */

recv(client_sock_fd[i],
......);
            
/* 对这个连接进行其它操作
*/
            
send(client_sock_fd[i], ......);

/*
如果这个连接处理完毕了就要 close 它,并执行 client_sock_fd[i] = -1 ;
*/
        }

}

}

From:http://hi.baidu.com/beibeiboo/item/3b6e0ecb7e6d0f50ac00ef7a

用 select 实现处理多连接的异步通讯服务器,布布扣,bubuko.com

时间: 2024-11-03 01:25:57

用 select 实现处理多连接的异步通讯服务器的相关文章

iOS网络编程--NSConnection的同步连接与异步连接

1 // 2 // ZFViewController.m 3 // 0628-表单验证 4 // 5 // Created by zfan on 14-6-28. 6 // Copyright (c) 2014年 zfan. All rights reserved. 7 // 8 9 #import "ZFViewController.h" 10 #import "MBProgressHUD+MJ.h" 11 12 @interface ZFViewControll

socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较

1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个异步过程调用发出后,调

转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的.下面记录下分别基于Select/Poll/Epoll的echo server实现.Python Select Server,可监控事件数量有限制: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

网络请求数据 get请求方式 &nbsp; post请求 协议异步连接服务器 block异步连接服务器

网络请求三部 创建一个请求(添加接口,对接口进行解码,) 设定请求方式(将接口转为NSURL,设置请求[请求地址, 缓存策略, 超时时间],设置请求方式) 连接服务器([同步连接,异步连接]代理连接,block连接) #import "MainViewController.h" @interface MainViewController () @property (retain, nonatomic) IBOutlet UIImageView *ImageWiew; //get请求方法

Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表,以及同步和异步执行模式)

系列文章导航 Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表) Adobe AIR中使用Flex连接Sqlite数据库(2)(添加,删除,修改以及语句参数) Adobe AIR中使用Flex连接Sqlite数据库(3)(查询) Adobe AIR中使用Flex连接Sqlite数据库(4)(事务) Flex,Fms3相关文章索引 Fms3和Flex打造在线多人视频会议和视频聊天(附原代码) 免费美女视频聊天,多人视频会议功能加强版本(Fms3和Flex开发(附源码))

Python Select 解析

首先列一下,sellect.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组(在linux中一切事物皆文件,块设备,socket连接等.),当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位(变成ready),使得进程可以获得这些文件描述符从而进行后续的读写操作(select会不断监视网络接口的某个目录下有多少文件描述符变成ready状态[在网络接口中,过来一个连接就会

IO多路复用之select

基本概念 IO多路复用是指内核(线性扫描)一旦发现进程指定的一个或者多个IO条件准备就绪,它就通知该进程,执行定义的操作. 适用场景 1.当客户处理多个描述符时(一般是交互式输入和网络套接字),必须使用I/O复用. 2.当一个客户同时处理多个套接字时,而这种情况是可能的,但很少出现. 3.如果一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般也要用到I/O复用. 4.如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用. 5.如果一个服务器要处理多个服务或多个协议,一般

使用ab.exe监测100个并发/100次请求情况下同步/异步访问数据库的性能差异

ab.exe介绍 ab.exe是apache server的一个组件,用于监测并发请求,并显示监测数据 具体使用及下载地址请参考:http://www.cnblogs.com/gossip/p/4398784.html 本文的目的 通过webapi接口模拟100个并发请求下,同步和异步访问数据库的性能差异 创建数据库及数据 --创建表结构 CREATE TABLE dbo.[Cars] ( Id INT IDENTITY(1000,1) NOT NULL, Model NVARCHAR(50) 

socket阻塞与非阻塞,同步与异步、I/O模型

socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对