练习C之SELECT形式的非阻塞IO
呵呵,理解得不深,但毕竟手打全版,且无错。但select.h不知何处找头文件,
粘下来作个记录。
POLL,EPOLL感觉代码类似,只是函数和系统实现不一样,,EPOLL目前最合理的。定位精确,算法复杂度最好。
#include "select.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/time.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/types.h>
typedef struct _CLIENT{
int fd;
struct sockaddr_in addr;
} CLIENT;
#define MYPORT 59000
#define BACKLOG 5
CLIENT client[BACKLOG];
;
#define REVLEN 10
char recvBuf[REVLEN];
void showClient();
int main()
{
int i, ret, sinSize;
;
fd_set readfds, writefds;
int sockListen, sockSvr, sockMax;
struct timeval timeout;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
; i<BACKLOG; i++)
{
client[i].fd = -;
}
printf("accept started\n");
//socket
)) < )
{
printf("socket error\n");
;
}
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(MYPORT);
//bind
)
{
printf("bind error\n");
;
}
//listen
)< )
{
print("listen error\n");
;
}
; i<BACKLOG; i++)
{
client[i].fd = -;
}
//select
)
{
FD_ZERO(&readfds);
FD_SET(sockListen, &readfds);
sockMax = sockListen;
; i<BACKLOG; i++)
{
)
{
FD_SET(client[i].fd, &readfds);
if(sockMax<client[i].fd)
{
sockMax = client[i].fd;
}
}
}
timeout.tv_sec = ;
timeout.tv_usec = ;
ret = , &readfds, NULL, NULL, &timeout);
)
{
printf("select error\n");
break;
}
)
{
printf("timeout...\n");
continue;
}
printf("test111\n");
; i<BACKLOG; i++)
{
&& FD_ISSET(client[i].fd, &readfds))
{
if(recvLen != REVLEN)
{
)
{
ret = recv(client[i].fd, ();
)
{
client[i].fd = -;
recvLen = ;
break;
}
)
{
client[i].fd = -;
recvLen = ;
break;
}
recvLen = recvLen + ret;
if(recvLen < REVLEN)
{
continue;
}
else
{
printf("%s, buf = %s\n", inet_nota(client[i].addr.sin_addr), recvBuf);
recvLen = ;
break;
}
}
}
}
}
if(FD_ISSET(sockListen, &readfds))
{
printf("isset\n");
sockSvr = accept(sockListen, NULL, NULL);
)
{
printf("accept error\n");
}
else
{
currentClient++;
}
; i< BACKLOG; i++)
{
)
{
client[i].fd = sockSvr;
client[i].addr = client_addr;
printf("You got a connection from %s \n", inet_ntoa(client[i].addr.sin_addr));
break;
}
}
}
}
printf("test\n");
;
}
void showClient()
{
int i;
printf("client count = %d\n", currentClient);
; i<BACKLOG; i++)
{
printf("[%d] = %d", i, client[i].fd);
}
printf("\n");
}
练习C之SELECT形式的非阻塞IO的更多相关文章
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程
1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...
- 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...
- linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)
IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...
- 事件驱动模型 IO多路复用 阻塞IO与非阻塞IO select epool
一.事件驱动 1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较.实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的.早期则存在许多非事件驱动的程序,这样的程序,在需要等待 ...
- IO模型,非阻塞IO模型,select实现多路复用
1. IO阻塞模型 IO问题: 输入输出 我要一个用户名用来执行登陆操作,问题用户名需要用户输入,输入需要耗时, 如果输入没有完成,后续逻辑无法继续,所以默认的处理方式就是 等 将当前进程阻塞住,切换 ...
- 理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO
完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同 ...
- Python_阻塞IO、非阻塞IO、IO多路复用
0.承上 进程: 计算机里最小的资源分配单位: 数据隔离, 利用多核,数据不安全. 线程: 计算机中最小的CPU调度单位: 数据共享,GIL锁,数据不安全. 协程: 线程的一部分,是有用户来调度的; ...
- {python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块
python之IO多路复用 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 ...
- python网络编程-同步IO和异步IO,阻塞IO和非阻塞IO
同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. ...
随机推荐
- js 获取url中的查询字符串
function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)( ...
- Java简单算法--求100以内素数
package cn.magicdu.algorithm; /** * 打印素数 * * @author xiaoduc * */ public class Prim { public static ...
- hdoj1285 拓扑排序
题目链接 分析: 很明显,一看就是拓扑排序. 看似简单, 暗藏武器啊. 第一次做的时候一边拓扑排序一边标记他们的深度, 例如题中给的例子 {1 2:2 3:4 3 }.1的深度为1. 2.4的深度为2 ...
- sqlserver中的聚合函数
聚合函数:就是按照一定的规则将多行(Row)数据汇总成一行的函数,对数据进行汇总前,还可以按特定的列(coloumn)将数据进行分组(group by)再汇总,然后按照再次给定的条件进行筛选 一:Co ...
- kettle Add XML 、 XML Join
1.将文件1.文件2组合成xml文件 文件1 f1;f2;f3 1;张三;24 2;李四;25 文件2 张三;语文;78 张三;数学;88 xml文件 <students> <stu ...
- c#重要特性之一委托
委托的构成必须满足的4个条件: 声明委托类型: 必须有一个方法包含了要执行的代码: 必须创建一个委托实例: 必须调用(invoke)委托实例 委托包装的方法需要满足以下条件 方法的签名必须与委托一致, ...
- 【html】【7】基础布局初探
当了解了上面的文章有一定基础后,开始尝试初步基础布局,可能不美观,但是要开始有布局框架思想 基础代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...
- OC1_类与对象
// // main.m // OC1_类与对象 // // Created by zhangxueming on 15/6/9. // Copyright (c) 2015年 zhangxuemin ...
- Redis和Memcache的区别分析 [转]
1. Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别. 2. Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构 ...
- VC窗口最大化方法
一.主框架窗口最大化 一般方法 1.修改App::InitInstance中的 m_pMainWnd->ShowWindow(m_nCmdShow);m_pMainWnd->UpdateW ...