/*************************************************************************

> File Name: epoll_serve.c

> Author: xuhcen_allen

> Mail: xuchen_allen@163.com

> Created Time: 2019年02月14日 星期四 09时08分16秒

************************************************************************/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define PORT 8080

int main()

{

struct sockaddr_in serv_addr,cli_addr;

socklen_t serv_len = sizeof(serv_addr);

socklen_t cli_len = sizeof(cli_addr);

//创建监听套接字:

int lfd = socket(AF_INET,SOCK_STREAM,0);

memset(&serv_addr,0,serv_len);

serv_addr.sin_family=AF_INET;

serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

serv_addr.sin_port=htons(PORT);

//绑定IP和端口:

bind(lfd,(struct sockaddr*)&serv_addr,serv_len);

//设置同时监听最大个数:

listen(lfd,36);

printf("Waiting for connecting...\n");

//创建epoll根结点:

int epfd = epoll_create(1000);//epoll_creat中的参数现在意义不大;

//初始化epoll树:

struct epoll_event ev;//创建一个事件:

ev.events = EPOLLIN;

ev.data.fd = lfd;

epoll_ctl(epfd,EPOLL_CTL_ADD,lfd,&ev);//将事件挂在树上,相当于初始化epoll树;

struct epoll_event all[2000];//用数组储存这些事件,方便挂树,查询;

while(1){

//使用epoll通知内核fd 文件IO检测;

int ret = epoll_wait(epfd,all,sizeof(all)/sizeof(all[0]),-1);//将检测到的epfd放到事件数组all中;

//返回值是数组中准备就绪的事件数;

//遍历all数组中的前ret个元素:

for(int i = 0;i

int fd = all[i].data.fd;

//提取出数组元素的fd,判断是否有连接:

if(fd == lfd){//这个if判断是判断用于监听的lfd是否加入到了ret中,如果加入了,就说明有新的连接;

int cfd = accept(lfd,(struct sockaddr*)&cli_addr,&cli_len);

if(cfd<0){

perror("accept error");

exit(1);

}

//将新得到的cfd挂到树上:

struct epoll_event temp;

temp.events = EPOLLIN;

temp.data.fd = cfd;

epoll_ctl(epfd,EPOLL_CTL_ADD,cfd,&temp);

//打印客户端信息:

char ip[64];

printf("New Client IP:%s ,\t Port:%d\n",inet_ntop(AF_INET,&cli_addr.sin_addr.s_addr,ip,sizeof(ip)) ,ntohs(cli_addr.sin_port));

}

else{

//处理已经连接的客户端发送过来的数据:

if(!all[i].events & EPOLLIN){

continue ;

}

//读数据:

char buf[1024];

int len = recv(fd,buf,sizeof(buf),0);

if(len<0){

perror("recv fail");

exit(1);

}

else if(len==0){

printf(" client disconnecting...\n ");

close(fd);

//fd从epoll树中取下来:

epoll_ctl(epfd,EPOLL_CTL_DEL,fd,NULL);

}

else{

printf( "recv success:\n");

write(STDOUT_FILENO,buf,len);

}

}

}

}

close(lfd);

return 0;

}

linux并发服务器实例,linux-----网络编程----epoll实现并发服务器相关推荐

  1. Linux多线程、多进程、网络编程常见问题

    Linux多进程.多线程.网络编程常见问题 入门 1.GCC的工作流程? 工作流程: 预处理.编译.汇编.链接 具体流程如下: 2.gcc常用的参数选项 3.Makefile介绍 3.1.Makefi ...

  2. linux下C语言socket网络编程简例

    转自博文:http://blog.csdn.net/kikilizhm/article/details/7858405 在练习写网络编程时,该例给了我帮助,在写服务器时,我把while逻辑位置想法错了 ...

  3. C++socket网络编程大全实战http服务器(支持php)视频课程-夏曹俊-专题视频课程

    C++socket网络编程大全实战http服务器(支持php)视频课程-16782人已学习 课程介绍         C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本 ...

  4. Qt网络编程实战之HTTP服务器-安晓辉-专题视频课程

    Qt网络编程实战之HTTP服务器-30196人已学习 课程介绍         设计了一个实用的HTTP服务器,基于Qt的网络框架实现.先详细介绍Qt的网络.IO.线程..自定义事件.配置文件等类库的 ...

  5. linux服务器开发三(网络编程)

    转载自:http://www.cnblogs.com/zfc2201/archive/2017/05/04/6804990.html 作者:水之原 网络基础 协议的概念 什么是协议 从应用的角度出发, ...

  6. linux服务器开发 3 网络编程

    文章目录 Socket编程 1.套接字 2.网络字节序 3.sockaddr数据结构 4.网络套接字函数 5.半关闭 6.2MSL 6.1 TIME_WAIT状态的存在有两个理由: 6.2 该状态为什 ...

  7. Linux学习——网络编程基础及TCP服务器

    目录 一.网络采用分层的思想: 二.各层典型的协议: 三.网络的封包和拆包: 四.网络编程的预备知识 4.1.SOCKET 4.2 IP地址 4.3 端口号 4.4 字节序 五.TCP编程API TC ...

  8. Linux操作系统下C语言网络编程(全文23475字,包含了Linux系统下所有网络编程的知识点,附程序代码)

    一.简介 如今网络应用随处可见,web.http.email 等这些都是网络应用程序,他们都有着基于相同的基本编程模型,有着相似的整体逻辑结构,并且还有着相同的编程接口.我们需要了解基本的客户端-服务 ...

  9. 【计算机网络】Linux环境中的TCP网络编程

    文章目录 前言 一.TCP Socket API 1. socket 2. bind 3. listen 4. accept 5. connect 二.封装TCPSocket 三.服务端的实现 1. ...

最新文章

  1. 数据中心建设“优劣”在于这几个关键问题
  2. ibatis学习笔记(三)java实体跟表映射.xml文件详解
  3. java中抽象类 接口_java中的抽象类与接口
  4. Linux系统如何在开机时修改root密码
  5. 如何用大数据找到男/女朋友?
  6. SQLServer奇偶数的输出
  7. 教你七招提高.NET网站性能
  8. Objective C运行时(runtime)技术总结,好强大的runtime
  9. Discuz!NT 缓存设计简析
  10. java实现蛇形输出,Java 输入一个正整数,按蛇形打印。
  11. 【2017级面向对象程序设计寒假作业】第4次作业情况
  12. CSS中怎么让DIV水平居中
  13. 在Linux服务器上下载百度云盘中的资料
  14. 重庆兴渝计算机培训中心,重庆兴渝职业中等专业学校招生录取分数线
  15. SAP各模块表清单及逻辑关系介绍
  16. 图形学中常用计算几何总结
  17. java毕业设计_员工绩效考评系统
  18. 苹果账号授权登录APP 服务端验证
  19. 使用urllib发起请求- urlopen发起请求read/decode/getcode/info/geturl-post请求抽屉网
  20. 红帽linux5.4安装教程,红帽企业Linux5.4下ORACLE安装步骤(推荐).pdf

热门文章

  1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
  2. leetcode 684. Redundant Connection | 684. 冗余连接(并查集)
  3. JVM从入门到精通(一):JVM入门级class文件格式
  4. C++ 静态线性表的顺序存储结构(数组实现)
  5. Hibernate中使用未映射为主键的“id”字段进行查询的场景分析
  6. MySQL数据库优化技巧(二)
  7. jQuery——给元素添加父级的方法
  8. 列出连通集 (25 分)【DFS与BFS模板】
  9. vue方法传值到data_Vue 组件传值几种常用方法【总结】
  10. java aio为什么不稳定_烯醇式结构为什么不稳定?