直接贴代码,代码是运行在Linux上面的,通过 g++ epoll.cpp编译

#include <sys/socket.h>
#include <sys/epoll.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h> #define MAX_CONN 1024
#define BUF_SIZE 1024 int main()
{
int serv_fd;
char buf[BUF_SIZE];
sockaddr_in serv_addr,cli_addr;
int eph;
socklen_t lt;
struct epoll_event ev,events[MAX_CONN];
serv_fd = socket(AF_INET,SOCK_STREAM,0); eph = epoll_create(MAX_CONN); // 创建 epoll 句柄
if (eph < 0)
{
perror("创建epoll错误");
return -1;
} // 把对监听套接字serv_fd的可读事件加入到监听列表
ev.events = EPOLLIN|EPOLLET;
ev.data.fd = serv_fd;
epoll_ctl(eph,EPOLL_CTL_ADD,serv_fd,&ev); bzero(&serv_addr, sizeof(serv_addr)); // 类似于 memset() 清空一块内存
inet_aton("0.0.0.0",&(serv_addr.sin_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(7007); // 不能使用 htonl函数,执行不会 出错,但是也不会监听 if(bind(serv_fd,(sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
{
perror("绑定错误");
return -1;
} listen(serv_fd,50); for(;;)
{
// 这里会阻塞,但是第三个参数指定500ms之后超时返回
// 没有事件发生,返回0
int n = epoll_wait(eph,events,MAX_CONN,500); for(int i=0;i<n;i++)
{
if(events[i].data.fd == serv_fd) // 如果是用于监听的套接字有事件发生,那就是有新连接到达了
{
int cli_fd = accept(serv_fd,(sockaddr*)&cli_addr,&lt); // 接收连接
if(cli_fd<0){perror("连接建立错误");continue;}
printf("来自 %s 的连接\n",inet_ntoa(cli_addr.sin_addr)); // 以下三行用于将新连接的套接字添加到监听列表
ev.data.fd = cli_fd;
ev.events = EPOLLIN | EPOLLET; // 设置监听这个套接字的可读事件,并且指定是 ET 模式
epoll_ctl(eph,EPOLL_CTL_ADD,cli_fd,&ev);
}else if(events[i].events & EPOLLIN) // 发现套接字可读
{
int fd = events[i].data.fd;
int n = read(fd,buf,BUF_SIZE);
if(n < 0) // 接收失败,将套接字移除监听列表
{ // 断开连接
ev.events = EPOLLIN;
ev.data.fd = fd;
epoll_ctl(eph,EPOLL_CTL_DEL,fd,&ev);
printf("断开连接\n");
continue;
}
buf[n] = '\0';
printf("接收数据: %s\n",buf); write(fd,buf,n); // 直接写入 发回
}
else if(events[i].events & EPOLLOUT)
{// 要注意的是,上面调用write不会触发下面这个事件, 只有满了的缓冲区重新空闲的时候会触发 https://www.zhihu.com/question/22840801
printf("EPOLLOUT\n");
// int fd = events[i].data.fd;
// write(fd,buf,BUF_SIZE);
}
} }
return 0;
}

之后客户端使用 netcat 代替

执行命令 nc 127.0.0.1 7007

就能连接上服务端,无论发什么都会发回来

[C++] epoll编写的echo服务端的更多相关文章

  1. 使用Thrift RPC编写程序(服务端和客户端)

    1. Thrift类介绍 Thrift代码包(位于thrift-0.6.1/lib/cpp/src)有以下几个目录: concurrency:并发和时钟管理方面的库processor:Processo ...

  2. VB6+Winsock编写的websocket服务端

    早就写好了,看这方面资料比较少,索性贴出来.只是一个DEMO中的,没有做优化,代码比较草.由于没地方上传附件,所以只把一些主要的代码贴出来. 这只是服务端,不过客户端可以反推出来,其实了解了webso ...

  3. RO05 - 如何编写RemObjects SDK服务端 (Delphi Version)

    转载:http://blog.csdn.net/henreash/article/details/2261134 本文档向你展示如何使用RemObjects(Delphi版)创建第一个服务.读了本文档 ...

  4. C#编写Windows服务程序 (服务端),client使用 消息队列 实现淘宝 订单全链路效果

    需求: 针对 淘宝提出的 订单全链路 产品接入 .http://open.taobao.com/doc/detail.htm?id=102423&qq-pf-to=pcqq.group oms ...

  5. zabbix服务端接收的数据类型,便于编写脚本向服务端提交数据

    1.数据类型1:zabbix_agent执行脚本提交字典 UserParameter=tcp_port_listen,/usr/local/zabbix/share/script/get_game_p ...

  6. php的异步非阻塞swoole模块使用(一)实现简易tcp服务器--服务端

    绑定tcp服务器的地址 $swserver = new swoole_server("127.0.0.1",9501); 设置tcp服务器装机容量(太危言耸听了-其实就是设置属性) ...

  7. 使用axis开发web service服务端

    一.axis环境搭建 1.安装环境 JDK.Tomcat或Resin.eclipse等. 2.到 http://www.apache.org/dyn/closer.cgi/ws/axis/1_4下载A ...

  8. 03-案例——多任务版TCP服务端程序开发

    案例——多任务版TCP服务端程序开发   1. 需求     目前我们开发的TCP服务端程序只能服务于一个客户端,如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢?完成多任务,可以使用线程 ...

  9. 警察与小偷的实现之中的一个client与服务端通信

    来源于ISCC 2012 破解关第四题 目的是通过逆向police.实现一个thief,可以与police进行通信 实际上就是一个RSA加密通信的样例,我们通过自己编写client和服务端来实现上面的 ...

  10. 在python中编写socket服务端模块(二):使用poll或epoll

    在linux上编写socket服务端程序一般可以用select.poll.epoll三种方式,本文主要介绍使用poll和epoll编写socket服务端模块. 使用poll方式的服务器端程序代码: i ...

随机推荐

  1. css水平居中的5种几种方式

    元素水平居中的第一种方式 子元素不需要宽度也可以 <div class="box"> <div class="son"> 我是内容 &l ...

  2. element-ui中Select 选择器去除点击时的淡蓝色边框

    <el-select class="my-el-select" v-model="tenantCont" placeholder="请输入机构标 ...

  3. NetCore高级系列文章01---创建项目及配置文件

    .NET Core是适用于 Windows.Linux 和 macOS 的免费.开源托管的计算机软件框架,作为.NET开发人员,全面拥抱.NetCore将成为趋势. 本系列文章将分为两大部分讲解.Ne ...

  4. GIT专业术语教程-转载

    目录 一.版本控制概要 1.1.什么是版本控制 1.2.常用术语 1.3.常见的版本控制器 1.4.版本控制分类 1.4.1.本地版本控制 1.4.2.集中版本控制 1.4.3.分布式版本控制 1.5 ...

  5. TienChin-课程管理-展示课程列表

    配置按钮权限 博主这里就不贴SQL了,自行手动添加一下吧. 更改表结构 ALTER TABLE `tienchin_course` MODIFY COLUMN `info` varchar(255) ...

  6. 关于飞桨UIE等模型预测推理时间很久的问题分析以及解决,蒸馏剪枝部署问题解决

    1.关于飞桨UIE等模型预测推理时间很久的问题分析以及解决 1.1.原因分析 用uie做实体识别,Taskflow预测的时间与schema内的实体类别数量成正比,schema里面有多少个实体类别 实体 ...

  7. 2.1 C/C++ 使用数组与指针

    C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...

  8. Swift中常见的String用法,Array高阶使用,Set集合操作

    String字符串常见用法 生成字符串 创建字符串 let greeting = "Hello, world!" let name = String("John" ...

  9. CF455D Serega and Fun 题解

    题目链接:CF 或者洛谷 本题是可以用平衡树去做的,具体的为每个 \(k\) 开一棵平衡树去维护相对位置,而这种移动操作用平衡树维护又是很容易做到的,这种做法是双 \(log\).在 \(1e5\) ...

  10. 17.1 使用内存映射文件--《Windows核心编程》

    Windows 提供了以下三种机制来对内存进行操控虚拟内存:最适合用来管理大量对象数组或者大型数据结构内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间的共享数据 ...