一个epoll事件实现的高并发服务/客户端(C语言实现,服务端存储基于hashtable)

  代码路径:https://github.com/prophetss/epoll-event

  之前实现了一个简单高效的hashtable(点这里),之后一直想利用它再延伸一些功能,后来偶然看到一个hashtable与epoll事件的结合感觉效率很高所以自己尝试着实现了下。大体思想是将epoll接到的每一个服务请求存储到hashtable里来管理,每一个请求都可以设置独立的回调函数。具体可以先看代码,注释已经写得很详细。代码实现了一个简单实例,由于条件有限,client端我是fork了大量子进程来模仿高并发请求。性能测试我这几天有时间再搞下,大概试了下1s几十万次请求应该是可以的。暂时先写到这里,下面先贴一个client的源码充下大小..

  1 #include <unistd.h>
  2 #include <sys/mman.h>
  3 #include <netinet/in.h>
  4 #include <semaphore.h>
  5 #include <sys/types.h>
  6 #include <sys/socket.h>
  7 #include <arpa/inet.h>
  8 #include <fcntl.h>
  9 #include <wait.h>
 10 #include <string.h>
 11 #include <netdb.h>
 12 #include <stdlib.h>
 13 #include "error.h"
 14
 15
 16 /*进程共享文件用于统计创建进程个数*/
 17 #define PFILE_NAME    "count"
 18
 19
 20 struct shared {
 21     sem_t mutex;    /*信号量用于加锁*/
 22     int count;        /*进程个数*/
 23 } shared;
 24
 25
 26 void request(const char *server_ip, int server_port)
 27 {
 28     struct sockaddr_in client_addr;
 29     bzero(&client_addr, sizeof(client_addr));
 30     client_addr.sin_family = AF_INET;
 31     client_addr.sin_addr.s_addr = INADDR_ANY;
 32     client_addr.sin_port = htons(0);
 33
 34     int client_socket = socket(AF_INET, SOCK_STREAM, 0);
 35     if(client_socket < 0) sys_exit_throw("create client socket fail");
 36
 37     struct sockaddr_in server_addr;
 38     bzero((char *)&server_addr, sizeof(server_addr));
 39
 40     server_addr.sin_family = AF_INET;
 41
 42     struct hostent *server = gethostbyname(server_ip);
 43     if(!server) sys_exit_throw("fail to get host name");
 44
 45     bcopy((char *)server->h_addr, (char *)&server_addr.sin_addr.s_addr, server->h_length);
 46
 47     server_addr.sin_port = htons(server_port);
 48     socklen_t server_addr_len = sizeof(server_addr);
 49
 50     if(connect(client_socket, (struct sockaddr*) &server_addr, server_addr_len) == -1 ) {
 51         sys_exit_throw("connent to server fail");
 52     }
 53
 54     int pid = getpid();
 55
 56     char content[64] = {0};
 57     sprintf(content, "%s, pid:%d", "i am client!", pid);
 58
 59     send(client_socket, content, strlen(content), 0);
 60
 61     close(client_socket);
 62 }
 63
 64 /*
 65   参数1为serverip,参数2为server端口号
 66 */
 67 int main(int argc,char *argv[])
 68 {
 69     if(argc != 3) exit_throw("parameter error!\n");
 70
 71     char *server_ip = argv[1];
 72     int server_port = atoi(argv[2]);
 73
 74     struct shared *psh;
 75
 76     /*创建共享文件*/
 77     int fd = open(PFILE_NAME, O_RDWR | O_CREAT, 0666);
 78     /*初始化*/
 79     write(fd, &shared, sizeof(struct shared));
 80     /*映射内存*/
 81     psh = mmap(NULL, sizeof(struct shared), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
 82     close(fd);
 83
 84     sem_init(&psh->mutex, 1, 1);
 85
 86     /*初始进程+1*/
 87     psh->count++;
 88
 89     int i, status;
 90     for (i = 0; i < 10; i++) {
 91         pid_t fpid = fork();
 92         if (0 == fpid) {
 93             sem_wait(&psh->mutex);
 94             psh->count++;
 95             printf("%d processes have created!\n", psh->count);
 96             sem_post(&psh->mutex);
 97             request(server_ip, server_port);
 98         }
 99         else if (fpid > 0) {
100             request(server_ip, server_port);
101             wait(&status);
102         }
103         else
104             sys_exit_throw("fork error!");
105     }
106
107     return 0;
108 }

原文地址:https://www.cnblogs.com/prophet-ss/p/9180977.html

时间: 2024-10-26 01:11:04

一个epoll事件实现的高并发服务/客户端(C语言实现,服务端存储基于hashtable)的相关文章

用一个示例讲解我是如何处理高并发的

去年做了一个远程升级的服务.客户端连接此服务可以下载更新程序.简单点说就是个TCP sever.基于C++. 运行环境是centOS 6.5. 刚开始客户端数量少而且访问不频繁,所以没太关注并发的问题.当时用工具测试大概只能支持的40次/秒的并发访问,而且已经有数据串包的情况出现了.最近有空做了不少的优化并记录了笔记备忘. 下面给出的代码都不是完整的项目源码,我只是截取了关键部分用于说明主题 我选择的测试工具是一个小的tcp客户端工具,可以比价快捷的进行多客户端连接的测试. 线程安全的单例模式

Linux中epoll+线程池实现高并发

服务器并发模型通常可分为单线程和多线程模型,这里的线程通常是指"I/O线程",即负责I/O操作,协调分配任务的"管理线程",而实际的请求和任务通常交由所谓"工作者线程"处理.通常多线程模型下,每个线程既是I/O线程又是工作者线程.所以这里讨论的是,单I/O线程+多工作者线程的模型,这也是最常用的一种服务器并发模型.我所在的项目中的server代码中,这种模型随处可见.它还有个名字,叫"半同步/半异步"模型,同时,这种模型也是生

Java高并发高性能分布式框架从无到有微服务架构设计

微服务架构模式(Microservice Architect Pattern).近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重点关注 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API).每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境.类生产环境等.另外,应尽量避免统一的.集中式的服务管理

分布式架构、高可扩展、高性能、高并发、性能优化,微服务

微服务专题 你还不知道微服务?怎么加(zhuang)薪(bi) SpringBoot 与微服务的区别于联系 快速构建SpringBoot工程 SpringBoot核心组件剖析 快速集成mybatis实战 快速集成Dubbo及案例实战 构建集成 redis及案例实战 构建Swagger插件实现API 管理及接口测试体系 SpringCloud Zuul路由网关详解源码探析 Ribbon客户端负载均衡原理 Feign声明式服务调用方式 Eureka注册中心构件 Config配置服务中心 svn.gi

socketAPI:一个最简单的服务器和对应的客户端C语言的实现

基于linux,该实例实现了服务端传了一个hello world给客户端.socket()创建socketbind()绑定socket到IP地址和端口listen()服务器监听客户端的连接connect()客户端连接到服务器accept()应用程序接受完成3次握手的客户端连接send() recv() write() read()机器间相互发送数据close() 关闭socketgethostbyname()   gethostbyaddr() V4专有select() poll() 处理多个连

高并发的epoll+线程池,业务在线程池内

我们知道,服务器并发模型通常可分为单线程和多线程模型,这里的线程通常是指"I/O线程",即负责I/O操作,协调分配任务的"管理线程",而实际的请求和任务通常交由所谓"工作者线程"处理.通常多线程模型下,每个线程既是I/O线程又是工作者线程.所以这里讨论的是,单I/O线程+多工作者线程的模型,这也是最常用的一种服务器并发模型.我所在的项目中的server代码中,这种模型随处可见.它还有个名字,叫"半同步/半异步"模型,同时,这种

面试最让你手足无措的一个问题:你的系统如何支撑高并发?

这篇文章,我们聊聊大量同学问我的一个问题,面试的时候被问到一个让人特别手足无措的问题:你的系统如何支撑高并发? 大多数同学被问到这个问题压根儿没什么思路去回答,不知道从什么地方说起,其实本质就是没经历过一些真正有高并发系统的锤炼罢了. 因为没有过相关的项目经历,所以就没法从真实的自身体会和经验中提炼出一套回答,然后系统的阐述出来自己复杂过的系统如何支撑高并发的. 所以,这篇文章就从这个角度切入来简单说说这个问题,用一个最简单的思路来回答,大致如何应对. 当然这里首先说清楚一个前提:高并发系统各不

高并发服务器开发与配置

一.4大具有代表性的并发模型及其优缺点        4大具有代表性的并发模型:Apache模型(Process Per Connection,简称PPC),TPC(Thread PerConnection)模型,select模型和poll模型.Epoll模型.        Apache(PPC)模型和TPC模型是最容易理解的,Apache模型在并发上是通过多进程实现的,而TPC模型是通过多线程实现的,但是这2种方式在大量进程/线程切换时会造成大量的开销.        select模型是通过

【转】大话程序猿眼里的高并发

原文: http://blog.thankbabe.com/2016/04/01/high-concurrency/ 大话程序猿眼里的高并发 2016-04-01 YYQ 高并发 高并发  负载均衡  并发  锁  事务  集群 高并发是指在同一个时间点,有很多用户同时的访问URL地址,比如:淘宝的双11,双12,就会产生高并发,如贴吧的爆吧,就是恶意的高并发请求,也就是DDOS攻击,再屌丝点的说法就像玩撸啊撸被ADC暴击了一样,那伤害你懂得(如果你看懂了,这个说法说明是正在奔向人生巅峰的屌丝.