直接贴代码,代码是运行在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. 【发现一个问题】使用 fastcgo 导致额外的 `runtime._System` 调用的消耗

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 为了避免 cgo 调用浪费太多资源,因此使用了 fastc ...

  2. 从零开始配置vim(23)——lsp基础配置

    上一章,我们初步认识了lsp,并且对 nvim-treesitter插件进行了配置,为编辑器提供了代码着色.自动格式化以及增量选中功能.算是初步体验了 lsp的相关功能.从这篇开始我们通过lsp的功能 ...

  3. Keepalive-Haproxy高可用介绍

    假设我们现在开发了一个应用应用的端口号为 8080,这个应用我们想让它去实现一个负载均衡的访问,就是说我们有两台服务器都部署了我们的 8080 应用,我们想让它一会访问 ip 为: 192.168.0 ...

  4. 文档级关系抽取:基于结构先验产生注意力偏差SSAN模型

    文档级关系抽取:基于结构先验产生注意力偏差SSAN模型 Entity Structure Within and Throughout: Modeling Mention Dependencies fo ...

  5. 1.1 Windows驱动开发:配置驱动开发环境

    在进行驱动开发之前,您需要先安装适当的开发环境和工具.首先,您需要安装Windows驱动开发工具包(WDK),这是一组驱动开发所需的工具.库.示例和文档.然后,您需要安装Visual Studio开发 ...

  6. Redis 数据库配置与应用

    Redis 是一个key-value存储系统.Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. ...

  7. 英特尔发布酷睿Ultra移动处理器:Intel 4制程工艺、AI性能飙升

    英特尔今日发布了第一代酷睿Ultra移动处理器,是首款基于Intel 4制程工艺打造的处理器. 据了解,英特尔酷睿Ultra采用了英特尔首个用于客户端的片上AI加速器"神经网络处理单元(NP ...

  8. CF1000F One Occurrence题解

    题目链接:CF 或者 洛谷 感觉很经典的题,而且给的 \(5e5\),虽然莫队之类的很好想,但完全没必要去考虑这类算法,这种数据范围常数又大又开盲盒.很显然的具有单 \(log\) 的算法. 回忆下经 ...

  9. Data Encryption Standard算法:历经考验的经典加密方案

    在当今数字化时代,数据安全是一个至关重要的问题.为了保护敏感数据的机密性和完整性,加密算法成为了数据保护的关键技术.其中,DES(Data Encryption Standard)算法作为一种经典的对 ...

  10. <semaphore.h> 和 <sys/sem.h> 的区别

    <sys/sem.h>为 XSI(最初是 Unix System V)信号量提供接口. 这些不是基本 POSIX 标准的一部分(它们在 XSI 选项中,主要是为了传统的 Unix 兼容性) ...