[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 ...
随机推荐
- 【发现一个问题】使用 fastcgo 导致额外的 `runtime._System` 调用的消耗
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 为了避免 cgo 调用浪费太多资源,因此使用了 fastc ...
- 从零开始配置vim(23)——lsp基础配置
上一章,我们初步认识了lsp,并且对 nvim-treesitter插件进行了配置,为编辑器提供了代码着色.自动格式化以及增量选中功能.算是初步体验了 lsp的相关功能.从这篇开始我们通过lsp的功能 ...
- Keepalive-Haproxy高可用介绍
假设我们现在开发了一个应用应用的端口号为 8080,这个应用我们想让它去实现一个负载均衡的访问,就是说我们有两台服务器都部署了我们的 8080 应用,我们想让它一会访问 ip 为: 192.168.0 ...
- 文档级关系抽取:基于结构先验产生注意力偏差SSAN模型
文档级关系抽取:基于结构先验产生注意力偏差SSAN模型 Entity Structure Within and Throughout: Modeling Mention Dependencies fo ...
- 1.1 Windows驱动开发:配置驱动开发环境
在进行驱动开发之前,您需要先安装适当的开发环境和工具.首先,您需要安装Windows驱动开发工具包(WDK),这是一组驱动开发所需的工具.库.示例和文档.然后,您需要安装Visual Studio开发 ...
- Redis 数据库配置与应用
Redis 是一个key-value存储系统.Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. ...
- 英特尔发布酷睿Ultra移动处理器:Intel 4制程工艺、AI性能飙升
英特尔今日发布了第一代酷睿Ultra移动处理器,是首款基于Intel 4制程工艺打造的处理器. 据了解,英特尔酷睿Ultra采用了英特尔首个用于客户端的片上AI加速器"神经网络处理单元(NP ...
- CF1000F One Occurrence题解
题目链接:CF 或者 洛谷 感觉很经典的题,而且给的 \(5e5\),虽然莫队之类的很好想,但完全没必要去考虑这类算法,这种数据范围常数又大又开盲盒.很显然的具有单 \(log\) 的算法. 回忆下经 ...
- Data Encryption Standard算法:历经考验的经典加密方案
在当今数字化时代,数据安全是一个至关重要的问题.为了保护敏感数据的机密性和完整性,加密算法成为了数据保护的关键技术.其中,DES(Data Encryption Standard)算法作为一种经典的对 ...
- <semaphore.h> 和 <sys/sem.h> 的区别
<sys/sem.h>为 XSI(最初是 Unix System V)信号量提供接口. 这些不是基本 POSIX 标准的一部分(它们在 XSI 选项中,主要是为了传统的 Unix 兼容性) ...