[c语言 ] 用libev 写个echo服务器
放假了.同学都回家了,我是更情愿留久点在学校,一来学校安静,二来免得火车太挤. 这临走前的几天,放下了erlang,写了一下c. 其实只是对比下erlang 写socket服务器,和c写socket服务器的异同.
说一下libev: 点击打开链接
Libev是一个event loop:向libev注册感兴趣的events,比如Socket可读事件,libev会对所注册的事件的源进行管理,并在事件发生时触发相应的程序。 对比另外一个更加出名的libevent,这个更加先进. 小巧轻量. 源码解读就不献丑了,一堆堆宏.我功力不够去深层切入libev.官网有文档,弄成pdf了,可以下载: http://d.yun.io/Y9ziuo
说一下环境: ubuntu 11.10 ,gcc4.4.6 ,libev 4.11, code:block(vim,emacs党...莫要黑,我用CB好久了,莫要离间!!!)
官方文档是有个键盘输入的demo,网上也有几个用libev写echo sever的,感觉都写得很不错,很全面. 我还是参考他们写个简单,简陋的试一下吧.
main.c 只有一个文件..呵呵
- #include <stdio.h>
- #include <netinet/in.h>
- #include <ev.h>
- #define PORT 9999
- #define BUFFER_SIZE 1024
- void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents);
- void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents);
- int main()
- {
- struct ev_loop *loop = ev_default_loop(0);
- int sd;
- struct sockaddr_in addr;
- int addr_len = sizeof(addr);
- struct ev_io socket_accept;
- // 创建socket的写法,这里简单处理,用INADDR_ANY ,匹配任何客户端请求.这里写法都一样,没什么特别的,直接copy都可以用
- if( (sd = socket(PF_INET, SOCK_STREAM, 0)) < 0 )
- {
- printf("socket error");
- return -1;
- }
- bzero(&addr, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_port = htons(PORT);
- addr.sin_addr.s_addr = INADDR_ANY;
- if (bind(sd, (struct sockaddr*) &addr, sizeof(addr)) != 0)
- {
- printf("bind error");
- }
- if (listen(sd, 2) < 0)
- {
- printf("listen error");
- return -1;
- }
- // 初始化,这里监听了io事件,写法参考官方文档的
- ev_io_init(&socket_accept, accept_cb, sd, EV_READ);
- ev_io_start(loop, &socket_accept);
- while (1)
- {
- ev_loop(loop, 0);
- }
- return 0;
- }
- //accept事件 的回调块
- void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
- {
- struct sockaddr_in client_addr;
- socklen_t client_len = sizeof(client_addr);
- int client_sd;
- //分派客户端的ev io结构
- struct ev_io *w_client = (struct ev_io*) malloc (sizeof(struct ev_io));
- //libev的错误处理
- if(EV_ERROR & revents)
- {
- printf("error event in accept");
- return;
- }
- //accept,普通写法
- client_sd = accept(watcher->fd, (struct sockaddr *)&client_addr, &client_len);
- if (client_sd < 0)
- {
- printf("accept error");
- return;
- }
- printf("someone connected.\n");
- //开始监听读事件了,有客户端信息就会被监听到
- ev_io_init(w_client, read_cb, client_sd, EV_READ);
- ev_io_start(loop, w_client);
- }
- //read 数据事件的回调快
- void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents){
- char buffer[BUFFER_SIZE];
- ssize_t read;
- if(EV_ERROR & revents)
- {
- printf("error event in read");
- return;
- }
- //recv普通socket写法
- read = recv(watcher->fd, buffer, BUFFER_SIZE, 0);
- if(read < 0)
- {
- printf("read error");
- return;
- }
- //断开链接的处理,停掉evnet就可以,同时记得释放客户端的结构体!
- if(read == 0)
- {
- printf("someone disconnected.\n");
- ev_io_stop(loop,watcher);
- free(watcher);
- return;
- }
- else
- {
- printf("get the message:%s\n",buffer);
- }
- //原信息返回,也可以自己写信息,都一样.最后记得置零
- send(watcher->fd, buffer, read, 0);
- bzero(buffer, read);
- }
编译后,运行. 然后打开teminal , telnet 127.0.0.1 9999 就可以发送信息了.
入手c的网络编程,将来,对比下erlang的底层网络通讯是怎么弄的
~~by dp
[c语言 ] 用libev 写个echo服务器相关推荐
- 介绍 Echoo: go 语言编写的 echo 服务器
原文地址 简介 最近由于要配置 nginx 服务器,里面有个代理转发(proxy_pass)的功能,能够将当前服务器接收到的请求转发给其他服务器来处理. 但是在配置当中,我发现我无法确认我的 prox ...
- 如何用C语言写一个web服务器的基础功能
我们都知道,学一门语言,只是单独看了就不写的话是很容易出现眼高手低的,所以,今天摩杜云要给大家分享的内容,就是如何用C语言写一个web服务器的基础功能,希望大家看完有所收获. 服务器架构 目标架构 以 ...
- echo服务器(回显服务器)
转载:https://blog.csdn.net/lanyan822/article/details/7679733 写在文章前: 这学习linux编程,也有一段时间了.虽然是一个人看书,琢磨.也想把 ...
- 【slighttpd】基于lighttpd架构的Server项目实战(4)—简单的echo服务器
转载地址:https://blog.csdn.net/jiange_zh/article/details/50636536 在这一部分,我们将对上一篇中的master-worker进行拓展,成为一个简 ...
- api怎么写_使用Node.js原生API写一个web服务器
Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...
- C/C++编程:如何写一个Web服务器
github https://github.com/zyearn/zaver 教科书上的server 学网络编程,第一个例子可能会是TCP echo服务器.大概思路是server会listen在某个端 ...
- Grizzly开发Echo服务器实战
Grizzly开发Echo服务器实战 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 用Java编写可伸缩的服务器应用是有难度的,用Java NIO开发. ...
- 基于poll实现的echo服务器
/*poll实现的echo服务器.Author:thinkmay*/#include <stdio.h>#include <stdlib.h>#include <stri ...
- socket 编程入门教程(四)TCP应用:1、构建echo服务器
2019独角兽企业重金招聘Python工程师标准>>> 现在,我们用前面所构建的socket类,重新设计第一章中echo的服务器,然后设计客户端程序. echo服务器的工作原理很简单 ...
最新文章
- linux内核网络协议栈--接收流程及函数(九)
- 通信人,请不要吝啬举手之劳
- js 原型以及原型链
- 蔚来、威马抢装的英伟达Orin,正成为高端智能车标配
- 不戴眼镜听不清?Google用视觉信号分离语音 | 附论文
- iOS开发Assertion failure in -[AFJSONRequestSerializer requestWithMethod:URLString:parameters:error:]
- oracle数据库写文件,Oracle对操作系统文件的读写操作
- sql条件查询表数据条数
- 线性规划,大M法,两阶段法
- 当我们谈注册中心时我们谈什么
- Android解析SRT字幕文件
- java dns缓存清理_jvm dns缓存问题解决方式
- 产业分析:视频云服务行业
- 个别化教育计划IEP模板
- ARFoundation从零开始3-创建ARFoundation项目
- VC6.0补丁Vs6sp6安装方法
- Opcua学习笔记1 opc介绍
- linux 常用命令——MySql 5.7添加用户、删除用户与授权
- 以下为一个有理数类,一个有理数由分子和分母组成,目前定义了一个输出函数 十七、编写一个加法函数,可以接收另一个有理数,与自身的值相加 十八、编写一个乘法函数,同理接收另一个有理数,与自身的值相乘
- 【推荐实践】大规模异构图召回在美团到店推荐广告的应用
热门文章
- iPhone7p与iPhoneX布局出现右边白边问题
- CSS学习04之层次选择器
- mybatis学习5复杂查询之多对一的处理
- python中的input函数怎么用_python input()函数怎么用,_Python_ 少侠科技
- android点击事件的优先级,android中进程的优先级
- c++ 出现1.#IND、1.#INF
- 小白 初步识别读取距离
- TCP通讯处理粘包详解
- 数据库学习实践(四、五)--分页浏览、查询数据
- Thinking in java基础之集合框架