epoll demo

#include <stdio.h>

#include <sys/types.h> 

#include <sys/socket.h> 

#include <netinet/in.h> 

#include <arpa/inet.h>

#include <stdlib.h>

#include <string.h>

#include <sys/epoll.h>

#define BUFFER_SIZE 40

#define MAX_EVENTS 10

int main(int argc, char * argv[]) 

{

    int server_sockfd;// 服务器端套接字 

    int connect_fd;// 客户端套接字 

    int len; 

    struct sockaddr_in my_addr;  // 服务器网络地址结构体 

    struct sockaddr_in remote_addr; // 客户端网络地址结构体 

    int sin_size; 

    char buf[BUFFER_SIZE];

    char sendbuf[BUFFER_SIZE];  // 数据传送的缓冲区 

    memset(&my_addr,0,sizeof(my_addr)); // 数据初始化--清零 

    my_addr.sin_family=AF_INET; // 设置为IP通信 

    my_addr.sin_addr.s_addr=INADDR_ANY;// 服务器IP地址--允许连接到所有本地地址上 

    my_addr.sin_port=htons(9998); // 服务器端口号 

    // 创建服务器端套接字--IPv4协议,面向连接通信,TCP协议

    if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0) 

    {   

        perror("socket"); 

        return 1; 

    } 

    // 将套接字绑定到服务器的网络地址上

    if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0) 

    { 

        perror("bind"); 

        return 1; 

    } 

    // 监听连接请求--监听队列长度为5

    listen(server_sockfd,5); 

    sin_size=sizeof(struct sockaddr_in);

    int epoll_fd;

    epoll_fd=epoll_create(MAX_EVENTS);//创建一个epoll句柄

    if(epoll_fd==-1)

    {

        perror("epoll_create failed");

        exit(EXIT_FAILURE);

    }

    struct epoll_event ev;  // epoll事件结构体 内涵两个数据events与data

    struct epoll_event events[MAX_EVENTS];// 事件监听队列

    ev.events=EPOLLIN;

    ev.data.fd=server_sockfd;//结构体内嵌联合体

    // 向epoll注册server_sockfd监听事件,加入到epoll的监听队列中

    if(epoll_ctl(epoll_fd,EPOLL_CTL_ADD,server_sockfd,&ev)==-1)

    {

        perror("epll_ctl:server_sockfd register failed");

        exit(EXIT_FAILURE);

    }

    int nfds;// epoll监听事件发生的个数

    // 循环接受客户端请求   

    while(1)

    {

        // 等待事件发生

        nfds=epoll_wait(epoll_fd,events,MAX_EVENTS,-1);

        if(nfds==-1)

        {

            perror("start epoll_wait failed");

            exit(EXIT_FAILURE);

        }

        int i;

        for(i=0;i<nfds;i++)

        {

            // 客户端有新的连接请求

            if(events[i].data.fd==server_sockfd)

            {

                // 等待客户端连接请求到达,调用accept函数

                if((connect_fd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)

                { 

                    perror("accept  failed"); 

                    exit(EXIT_FAILURE);

                }

                // 向epoll注册connect_fd监听事件

                ev.events=EPOLLIN;

                ev.data.fd=connect_fd;

                if(epoll_ctl(epoll_fd,EPOLL_CTL_ADD,connect_fd,&ev)==-1)

                {

                    perror("epoll_ctl:connect_fd register failed");

                    exit(EXIT_FAILURE);

                }

                printf("accept client %s\n",inet_ntoa(remote_addr.sin_addr));

            }

            // 客户端有数据发送过来

            else

            {

                len=recv(connect_fd,buf,BUFFER_SIZE,0);

                if(len<0)

                {

                    perror("receive from client failed");

                    exit(EXIT_FAILURE);

                }

                printf("receive from client:%s",buf);

                send(connect_fd,"I have received your message.\n",30,0);

                memset(buf, 0, sizeof(buf)); 

                fgets(sendbuf, 4096, stdin);

                send(connect_fd, sendbuf, strlen(sendbuf),0);

            }

        }

    }

    return 0; 

---------------------

作者:向念博客

来源:CSDN

原文:https://blog.csdn.net/XN6666/article/details/80352057

版权声明:本文为博主原创文章,转载请附上博文链接!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 1、基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和po...
    Daniel521阅读 651评论 0 1
  • 大纲 一.Socket简介 二.BSD Socket编程准备 1.地址 2.端口 3.网络字节序 4.半相关与全相...
    VD2012阅读 2,326评论 0 5
  • 网络编程基础网络编程,首先了解计算机网络体系结构是有必要的,着重掌握TCP、IP协议,理解socket的概念,理解...
    zhile_doing阅读 1,861评论 0 1
  • 下面为Daytime这个服务的源代码例子,同时兼容IPV6和IPV4的地址,最后部分有更多说明。 单播模式下的Se...
    天楚锐齿阅读 5,655评论 0 2
  • 1、Loader Loader 类可以也只可以加载 SWF 文件或图像(JPG,PNG或GIF)文件。 网络协议...
    无赖宵小阅读 789评论 0 0