http://www.cnblogs.com/nufangrensheng/p/3590002.html中的select改用poll。

int
main(int argc, char **argv)
{
int i, maxi, listenfd, connfd, sockfd;
int nready;
ssize_t n;
char buf[4096];
socklen_t clilen;
struct pollfd client[OPEN_MAX];
struct sockaddr_in cliaddr, servaddr; listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(9877); bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); listen(listenfd, 5); client[0].fd = listenfd;
client[0].events = POLLRDNORM; for(i = 0; i < OPEN_MAX; i++)
client[i].fd = -1; /* -1 indicates available entry */
maxi = 0; /* max index into client[] array */ for(;;)
{
nready = poll(client, maxi+1; INFTIM); if(client[0].revents & POLLRDNORM) /* new client connection */
{
clilen = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockadr *)&cliaddr, &clilen); for(i = 1; i < OPEN_MAX;i++)
{
if(client[i].fd < 0)
{
client[i].fd = connfd; /* save descriptor */
break;
}
} if(i == OPEN_MAX)
{
printf("too many clients\n");
exit(1);
}
client[i].events = POLLRDNORM;
if(i > maxi)
maxi = i; if(--nready <= 0)
continue; /* no more readable descriptors */
} for(i = 1; i <= maxi; i++) /* check all clients for data */
{
if((sockfd = client[i].fd) < 0)
continue;
if(client[i].revents & (POLLRDNORM | POLLERR))
{
if((n = read(sockfd, buf, 4096)) < 0)
{
if(errno == ECONNRESET)
{
/* connection reset by client */
close(sockfd);
client[i].fd = -1;
}
else
{
perror("read");
exit(1);
}
}
esle if(n == 0)
{
/* connection closed by client */
close(sockfd);
client[i].fd = -1;
}
else
{
writen(sockfd, buf, n);
}
if(--nready <= 0)
break; /* no more readable descriptors */
}
}
}
}

使用poll处理任意数目个客户的单进程程序的更多相关文章

  1. 使用select处理任意数目个客户的单进程程序

    改写http://www.cnblogs.com/nufangrensheng/p/3587962.html中的TCP回射服务器程序,把它重写成使用select来处理任意数目个客户的单进程程序,而不是 ...

  2. Electron - 创建跨平台的桌面客户的应用程序

    Electron 框架的前身是 Atom Shell,可以让你写使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序.它是基于io.js 和 Chromium 开源项目,并用于在 ...

  3. 01_Weblogic课程之概念篇:代理服务器,web服务器,应用程序服务器,JNDI概念,JTA概念,Java消息服务,Java验证和授权(JAAS),Java管理扩展,Web客户机,客户机应用程序

     1 什么是服务器 Weblogic中服务器分为两种,一种是受管服务器,另外一种是管理服务器. Weblogic课程(Weblogic是Oracle公司的,最开始的是BEA公司的) 一 系统管理 ...

  4. 把任意的EXE嵌入到自己程序中

    把任意的EXE嵌入到自己程序中 taoyuan19822008-08-24上传   Delphi把任意的EXE嵌入到自己程序中的程序 资源积分:0分 下载次数:327 资源类型:其他 资源大小:175 ...

  5. 两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。

    一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈:不为空就直接出栈: 二.代 ...

  6. 用java套接字创建HTTP客户与服务器程序

    最近再学习java的web编程,发现用java创建一个小的服务器和客户端是如此的简单,引用经典图书<Tomcat与Java Web开发技术详解(第二版)>(孙卫琴) 根据书中案例敲代码自己 ...

  7. 【Unix网络编程】 chapter5 TCP客户,服务器程序实例

    chapter5 5.1 概述 5.2 TCP回射服务器程序:main函数 int main(int argc, char **argv) { int listenfd,connfd; pid_t c ...

  8. 用Python套接字创建HTTP客户与服务器程序

    最近在学习python,网络编程中,python寥寥几句,就可以创建一个服务端和客户端程序: 服务端: import sockets = socket.socket()host = socket.ge ...

  9. 【c++】用c++编写的求任意区间的素数的小程序

    #include using namespace std; int main() { cout<<"*************************************** ...

随机推荐

  1. 小数据池,bytes

    '''python2 python3 '''#python2#print() print 'abc'#range() xrange() 生成器# raw_input() #python3#print( ...

  2. 又见Python<2>:如何安装第三方库(Windows)

    使用python进行数据分析或者数据处理时,往往需要使用一些库,而使用库之前必须安装它.Anaconda内置了很多常用的第三方库,可以满足绝大部分需求,比如numpy.pandas.matplotli ...

  3. BZOJ1017 魔兽地图DotR (树上背包)

    一道背包的神题,用到了树上dp和背包dp,这个题的特殊性在于儿子对于父亲节点是有影响的,所以用f[i][j][k]表示第i号装备,其中用j个来合成上层装备,花费k元所能获得最大的力量值. 然后对于每一 ...

  4. [BJOI2017]魔法咒语 --- AC自动机 + 矩阵优化

    bzoj 4860   LOJ2180   洛谷P3175 [BJOI2017]魔法咒语 题目描述: Chandra 是一个魔法天才. 从一岁时接受火之教会洗礼之后,Chandra 就显示出对火元素无 ...

  5. 【刷水-贪心】BZOJ1629-[Usaco2007 Demo]Cow Acrobats

    [题目大意] 有n个头牛,给出体重和力量.每个牛的危险值等于它上面的牛的体重总和减去它的力量值,求所有方案中危险值最大值的最小值. [思路] 贪心.一开始脑补的贪心是体重大的先放下面,体重相同的根据力 ...

  6. NOIP200606金明的预算方案

    试题描述: 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”. ...

  7. 【原创】LogCat信息演示Activity生命周期

    界面如下:注意:这是在手机.竖屏状态下! (一)1个Activity     /**     * 7个方法     * 测试1个Activity的生命周期     *      * LogCat:   ...

  8. ruby 状态转移

    0. 引言       昨天遇到一个问题,就是关于对象状态转移的问题,我姑且这样命名吧.简要描述一下就是:对于一个人,他有进食,帮助他人,恋爱等功能,但是这些功能是有先后顺序的,对于刚出生的人,他要先 ...

  9. Create a DAC from a microcontroller's ADC

    Few microcontrollers include a DAC. Although you can easily find an inexpensive DAC to control from ...

  10. opencv CxImage 互转 (Mat)

    //to Mat CxImage img; img.Load("C:\\f.jpg"); uint8_t* buf=NULL; int32_t len=0; bool rs =im ...