[C++] epoll编写的echo服务端
直接贴代码,代码是运行在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,<); // 接收连接
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服务端的更多相关文章
- 使用Thrift RPC编写程序(服务端和客户端)
1. Thrift类介绍 Thrift代码包(位于thrift-0.6.1/lib/cpp/src)有以下几个目录: concurrency:并发和时钟管理方面的库processor:Processo ...
- VB6+Winsock编写的websocket服务端
早就写好了,看这方面资料比较少,索性贴出来.只是一个DEMO中的,没有做优化,代码比较草.由于没地方上传附件,所以只把一些主要的代码贴出来. 这只是服务端,不过客户端可以反推出来,其实了解了webso ...
- RO05 - 如何编写RemObjects SDK服务端 (Delphi Version)
转载:http://blog.csdn.net/henreash/article/details/2261134 本文档向你展示如何使用RemObjects(Delphi版)创建第一个服务.读了本文档 ...
- C#编写Windows服务程序 (服务端),client使用 消息队列 实现淘宝 订单全链路效果
需求: 针对 淘宝提出的 订单全链路 产品接入 .http://open.taobao.com/doc/detail.htm?id=102423&qq-pf-to=pcqq.group oms ...
- zabbix服务端接收的数据类型,便于编写脚本向服务端提交数据
1.数据类型1:zabbix_agent执行脚本提交字典 UserParameter=tcp_port_listen,/usr/local/zabbix/share/script/get_game_p ...
- php的异步非阻塞swoole模块使用(一)实现简易tcp服务器--服务端
绑定tcp服务器的地址 $swserver = new swoole_server("127.0.0.1",9501); 设置tcp服务器装机容量(太危言耸听了-其实就是设置属性) ...
- 使用axis开发web service服务端
一.axis环境搭建 1.安装环境 JDK.Tomcat或Resin.eclipse等. 2.到 http://www.apache.org/dyn/closer.cgi/ws/axis/1_4下载A ...
- 03-案例——多任务版TCP服务端程序开发
案例——多任务版TCP服务端程序开发 1. 需求 目前我们开发的TCP服务端程序只能服务于一个客户端,如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢?完成多任务,可以使用线程 ...
- 警察与小偷的实现之中的一个client与服务端通信
来源于ISCC 2012 破解关第四题 目的是通过逆向police.实现一个thief,可以与police进行通信 实际上就是一个RSA加密通信的样例,我们通过自己编写client和服务端来实现上面的 ...
- 在python中编写socket服务端模块(二):使用poll或epoll
在linux上编写socket服务端程序一般可以用select.poll.epoll三种方式,本文主要介绍使用poll和epoll编写socket服务端模块. 使用poll方式的服务器端程序代码: i ...
随机推荐
- Typescript基本数据类型的讲解
1. typescript 的 7 种数据类型 typescript 的原始数据类型 string number boolean null underfined enum(枚举) symbol 这 7 ...
- Unity的asm笔记
使用asm的好处 减少修改C#后unity编译dll的时间,对于项目中的C#代码越多效果越明显,比如我们的一个3dmmo项目是纯C#开发,每次修改C#后编译时间就要26s以上 在Unity2018.2 ...
- vue 动态路由刷新页面404
1.如果你的静态路由最后有如下代码: // 404 page must be placed at the end !!! { path: "*", redirect: " ...
- C/C++ Qt 基本文件读写方法
Qt文件操作有两种方式,第一种使用QFile类的IODevice读写功能直接读写,第二种是利用 QFile和QTextStream结合起来,用流的方式进行文件读写. 第一种,利用QFile中的相关函数 ...
- 华为云DTSE助力车卫士架构升级,探索智能出行行业数字化新路径
本文分享自华为云社区<华为云DTSE助力车卫士技术架构升级,探索智能出行行业数字化新路径>,作者:HuaweiCloudDeveloper. 毫无疑问,在双碳背景以及先进技术的加持下,智能 ...
- 试用Proxmox VE 8.0搭建云桌面系统
6月22日发布了其服务器虚拟化管理平台 Proxmox 虚拟环境的稳定版 0.12.这个主要版本基于最新的Debian 7("书虫"),并为Proxmox VE 4.8或旧版本的用 ...
- CH59X/CH58X/CH57X sleep模式下串口唤醒收发数据
整体程序逻辑: 下方的具体程序及使用是基于CH592进行的 SLEEP模式睡眠唤醒是由协议栈管理的,还在睡眠时,无法接收到数据. 已经通过使能HAL_SLEEP开启睡眠.如果需要在睡眠时实时接收串口传 ...
- 小知识:Linux如何删除大量小文件
环境:RHEL 6.5 + Oracle 11.2.0.4 需求:使用df -i巡检发现Inodes使用率过高,需要清理删除文件来解决.如果Inodes满,该目录将不能写,即使df -h查看还有剩余空 ...
- 【OpenVINO™】在 MacOS 上使用 OpenVINO™ C# API 部署 Yolov5
在 MacOS 上使用 OpenVINO C# API 部署 Yolov5 项目介绍 YOLOv5 是革命性的 "单阶段"对象检测模型的第五次迭代,旨在实时提供高速.高精度的结果, ...
- UVA1108 Mining Your Own Business 题解
题目传送门 题意 在一个无向图上选择尽量少的点涂黑,使得删除任意一个点后,每个连通分量里都至少有一个黑点(多组数据). 正文 观察题意,发现这是个 Tarjan 求点双连通分量的板子. 考虑在求点双连 ...