#include "../wrap/wrap.h"
#include <sys/epoll.h>
#define SIZE 1024
#define FUCK printf("close or free me\n")
#define PORT 8000
#define IP "192.168.68.152"
#define MAX_EVENTS 10
// epoll监听socket int main()
{
// 创建监听套接字
int listen_fd = Socket(AF_INET, SOCK_STREAM, 0); //绑定ip和端口
struct sockaddr_in addr;
socklen_t len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
inet_pton(AF_INET, IP, (void*)&addr.sin_addr.s_addr);
Bind(listen_fd, (struct sockaddr*)&addr, len); // 监听
Listen(listen_fd, 128); //epoll 监视监听套接字,刚开始只有listen_fd
int epfd = epoll_create(1);
struct epoll_event event;
event.events = EPOLLIN;
event.data.fd = listen_fd;
epoll_ctl(epfd, EPOLL_CTL_ADD, listen_fd, &event); while (1)
{
// 接收变化套接字的数组
struct epoll_event events[MAX_EVENTS];
int n = epoll_wait(epfd, events, MAX_EVENTS, 0);
printf("有%d个访问\n", n);
getchar(); if(n < 0)
{
perror("epoll_wait");
return 1;
} // 遍历所有变化的套接字
for(int i = 0; i < n; ++i)
{
int fd = (events + i)->data.fd;
uint32_t need_read = (events + i)->events & EPOLLIN;
// 监听套接字有新连接
if(fd == listen_fd && need_read)
{
struct sockaddr_in client_addr;
int client_fd = Accept(fd, (struct sockaddr*)&client_addr, &len);
char _ip[16] = "";
printf("%s已连接\n",inet_ntop(AF_INET, &client_addr.sin_addr.s_addr, _ip, 16));
struct epoll_event event;
event.events = EPOLLIN;
event.data.fd = client_fd;
epoll_ctl(epfd, EPOLL_CTL_ADD, client_fd, &event);
}
else if(need_read)// 有套接字需要读
{
char buf[SIZE] = "";
int n = read(fd, buf, SIZE); if(n < 0)
{
Close(fd);
epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL);
perror("read");
return 1;
}
else if(0 == n) // 套接字关闭
{
Close(fd);
epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL);
}
else
{
printf("%s\n", buf);
Write(fd, buf, n);
}
}
}
}
Close(listen_fd);
epoll_ctl(epfd, EPOLL_CTL_DEL, listen_fd, NULL);
Close(epfd);
epoll_ctl(epfd, EPOLL_CTL_DEL, epfd, NULL);
return 0;
}

epoll实现的简单服务器的更多相关文章

  1. Linux 用epoll实现的简单http服务器

    Linux 用epoll实现的简单http服务器 main.c #include <stdio.h> #include <sys/types.h> #include <s ...

  2. Node安装及搭建简单服务器

    注:本文安装系统为mac,windows及其他系统下载对应安装包 ,mac下载后的安装包为apk文件,windows为msi文件. 安装 1.在网上下载node安装包,官方网站2.双击下载文件,按步骤 ...

  3. Node.js初探之实现能向前台返回东西的简单服务器

    nodejs nodejs文件就是一个简单的js文件. 在shell中运行 Step 1. 打开终端,进入这个js文件所在目#录 Step 2. 用 'node 文件名.js' 命令运行它即可. 用n ...

  4. 【netty】(2)---搭建一个简单服务器

    netty(2)---搭建一个简单服务器 说明:本篇博客是基于学习慕课网有关视频教学.效果:当用户访问:localhost:8088 后 服务器返回 "hello netty"; ...

  5. Java新AIO/NIO2:AsynchronousServerSocketChannel和AsynchronousSocketChannel简单服务器-客户端

    Java新AIO/NIO2:AsynchronousServerSocketChannel和AsynchronousSocketChannel简单服务器-客户端用AsynchronousServerS ...

  6. Socket创建简单服务器和客户端程序

    使用Socket编程创建简单服务器和客户端 要知道的 Socket-AddressFamily, SocketType, ProtocolType https://blog.csdn.net/weix ...

  7. Linux + C + Epoll实现高并发服务器(线程池 + 数据库连接池)(转)

    转自:http://blog.csdn.net/wuyuxing24/article/details/48758927 一, 背景 先说下我要实现的功能,server端一直在linux平台下面跑,当客 ...

  8. 一步一步创建聊天程序2-利用epoll来创建简单的聊天室

    如图,这个是看视频时,最后的作业,除了客户端未使用select实现外,其它的要求都有简单实现. 服务端代码如下: #include <stdio.h> #include <strin ...

  9. epoll 实现回射服务器

    epoll是I/O复用模型中相对epoll和select更高效的实现对套接字管理的函数. epoll有两种模式 LT 和 ET 二者的差异在于 level-trigger 模式下只要某个 socket ...

  10. web服务-3、epoll高效率实现并发服务器

    知识点: 之前写的四种方法实现并发服务效率都还是低,早期的服务器采用的是select和poll方式,select这种方式的特点是轮询所有套接字去一个个看有没有事件发生,但是装套接字的列表长度是有限制的 ...

随机推荐

  1. PicGo + Gitee 实现 Markdown 图床

    最近再研究图床,注册的阿里云域名备案还在审批,所以七牛云图床暂时没用,所以试下用PicGo+ Gitee PicGo - 基于 electron-vue 开发的图床工具 PicGo目前支持了微博图床, ...

  2. idea报错 Error running GctlBrpApplication. Command line is too long. Shorten the command line and rerun.解决方案

    idea新导入项目有时候会出现以下报错,解决方法如下: 一:报错截图,报错原因是命令行太长,让缩短命令长度再运行. 二:解决方法如下:在剪头标记位置加入代码: <property name=&q ...

  3. CentOS7的udev的绑定规则

    客户一套RAC环境是华为的存储,共享盘是/dev/sd*,咋一看还怀疑是没有进行多路径配置,实际和主机工程师是已经配置好的,我们使用upadmin show vlun命令可以查看到: [root@xx ...

  4. Apache Hudi 设计与架构解读

    1. 简介 Apache Hudi(简称:Hudi)允许您在现有的hadoop兼容存储之上存储大量数据,同时提供两种原语,使得除了经典的批处理之外,还可以在数据湖上进行流处理. 这两种原语分别是: 1 ...

  5. ASCII编码的诞生:解决字符标准化与跨平台通信的需求

    在计算机的发展过程中,字符的表示和传输一直是一个重要的问题.为了实现字符的标准化和跨平台通信,ASCII(American Standard Code for Information Intercha ...

  6. 【Unity3D】选中物体消融特效

    1 消融特效原理 ​ 消融特效 中基于 Shader Graph 实现了消融特效,本文将基于 Shader 实现消融特效. ​ 当前实现消融特效的方法主要有 Alpha 测试消融.clip(或 dis ...

  7. Hooks与普通函数的区别

    Hooks与普通函数的区别 在这里的Hooks具体指的是自定义Hooks,自定义的Hooks与我们定义的普通函数类似,都可以封装逻辑,以实现逻辑的复用.Hooks实际上是一种特殊的函数,而由于Hook ...

  8. VueRouter导航守卫

    VueRouter导航守卫 vue-router提供的导航守卫主要用来通过跳转或取消的方式守卫导航,简单来说导航守卫就是路由跳转过程中的一些钩子函数,路由跳转是一个大的过程,这个大的过程分为跳转前中后 ...

  9. oracle FGAC(细粒度访问控制)介绍

    在ORACLE中,RLS有时也叫做虚拟私有数据库(VPD)或者细粒度访问控制(FGAC). RLS由8i引进,利用这一特性我们可以对表定义安全策略(并且指明对表的操作类型),实现对用户可以看到或者修改 ...

  10. win32 - wsprintf和wvsprintf

    前者很常用, 经常被用来转换为字符串或者拼接字符串. 例子: #include <Windows.h> #include <stdio.h> int main() { int ...