linux epoll 简单demo

一个简单的epoll demo ,同时接受多个客户端连接,并把接收到的字符串转化为大写字母返回给客户端

 1 #include<stdio.h>
 2 #include<arpa/inet.h>
 3 #include<sys/epoll.h>
 4 #include<unistd.h>
 5 #include<ctype.h>
 6 #define MAXLEN 1024
 7 #define SERV_PORT 8000
 8 #define MAX_OPEN_FD 1024
 9
10 int main(int argc,char *argv[])
11 {
12     int  listenfd,connfd,efd,ret;
13     char buf[MAXLEN];
14     struct sockaddr_in cliaddr,servaddr;
15     socklen_t clilen = sizeof(cliaddr);
16     struct epoll_event tep,ep[MAX_OPEN_FD];
17
18     listenfd = socket(AF_INET,SOCK_STREAM,0);
19
20     servaddr.sin_family = AF_INET;
21     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
22     servaddr.sin_port = htons(SERV_PORT);
23     bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
24     listen(listenfd,20);
25     // 创建一个epoll fd
26     efd = epoll_create(MAX_OPEN_FD);
27     tep.events = EPOLLIN;tep.data.fd = listenfd;
28     // 把监听socket 先添加到efd中
29     ret = epoll_ctl(efd,EPOLL_CTL_ADD,listenfd,&tep);
30     // 循环等待
31     for (;;)
32     {
33         // 返回已就绪的epoll_event,-1表示阻塞,没有就绪的epoll_event,将一直等待
34         size_t nready = epoll_wait(efd,ep,MAX_OPEN_FD,-1);
35         for (int i = 0; i < nready; ++i)
36         {
37             // 如果是新的连接,需要把新的socket添加到efd中
38             if (ep[i].data.fd == listenfd )
39             {
40                 connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&clilen);
41                 tep.events = EPOLLIN;
42                 tep.data.fd = connfd;
43                 ret = epoll_ctl(efd,EPOLL_CTL_ADD,connfd,&tep);
44             }
45             // 否则,读取数据
46             else
47             {
48                 connfd = ep[i].data.fd;
49                 int bytes = read(connfd,buf,MAXLEN);
50                 // 客户端关闭连接
51                 if (bytes == 0){
52                     ret =epoll_ctl(efd,EPOLL_CTL_DEL,connfd,NULL);
53                     close(connfd);
54                     printf("client[%d] closed\n", i);
55                 }
56                 else
57                 {
58                     for (int j = 0; j < bytes; ++j)
59                     {
60                         buf[j] = toupper(buf[j]);
61                     }
62                     // 向客户端发送数据
63                     write(connfd,buf,bytes);
64                 }
65             }
66         }
67     }
68     return 0;
69 }
时间: 2024-08-06 19:46:40

linux epoll 简单demo的相关文章

Linux Epoll介绍和程序实例

1. Epoll是何方神圣? Epoll但是当前在Linux下开发大规模并发网络程序的热门人选,Epoll 在Linux2.6内核中正式引入,和select类似,事实上都I/O多路复用技术而已,并没有什么神奇的. 事实上在Linux下设计并发网络程序,向来不缺少方法,比方典型的Apache模型(Process Per Connection,简称PPC),TPC(Thread PerConnection)模型,以及select模型和poll模型,那为何还要再引入Epoll这个东东呢?那还是有得说说

Windows完成端口与Linux epoll技术简介

收藏自:http://www.cnblogs.com/cr0-3/archive/2011/09/09/2172280.html WINDOWS完成端口编程1.基本概念2.WINDOWS完成端口的特点3.完成端口(Completion Ports )相关数据结构和创建4.完成端口线程的工作原理5.Windows完成端口的实例代码Linux的EPoll模型1.为什么select落后2.内核中提高I/O性能的新方法epoll3.epoll的优点4.epoll的工作模式 5.epoll的使用方法6.L

Linux epoll模型

定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.因为它会复用文件描述符集合来传递结果而不是迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一个原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了.epoll除了提供select\poll那种IO事

LINUX&mdash;SED简单使用

SED简介 sed 全名叫 stream editor,流编辑器,用程序的方式来编辑文本. SED使用 替换参数s #使用yours替换my,g表示替换改行所有匹配项 sed "s/my/yours/g" demo.txt #指定行替换 sed "3s/my/yours/g" demo.txt #指定多行替换 sed "3,6s/my/yours/g" demo.txt #只替换每行第二个 sed "s/my/yours/2"

Ext简单demo示例

1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <titl

linux tcp server demo

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 #include <sys/types.h>  #include <sys/socket.h>  #include <string.h>  #include <netin

Linux shell ${}简单用法

转自:Linux shell ${}简单用法 为了完整起见,我这里再用一些例子加以说明 ${ } 的一些特异功能:假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt我们可以用 ${ } 分别替换获得不同的值:${file#*/}:拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt${file##*/}:拿掉最后一条 / 及其左边的字符串:my.file.txt${file#*.}:拿掉第一个 . 及其左边的字符串:fil

Unity3d 背景、音效 播放 简单demo

仅实现功能,AudioListener在MainCamera中 using UnityEngine; using System.Collections; using System.Collections.Generic; public class MusicManger : MonoBehaviour { AudioSource _backMusicSource = null; AudioSource _SoundSource = null; //public string musicName

Android SQLite最简单demo实现(增删查改)

本来不太想写这篇博客的,但是看到网上的关于android数据库操作的博文都讲得很详细,对于像我这样的新手入门了解SQLite的基本操作有一定难度,所以我参考了网上的一些博客文章,并自己亲自摸索了一遍,希望写出这么一篇博文来记录SQLite的最基本操作,同时也希望能够对android的新手们有些帮助. 参考博客:http://www.20864.com/201247/274.html 这里只是一个示范性的demo,并没实现什么具体功能,只实现了对数据库的增删查改操作. 以下是实现demo的步骤: