放假了.同学都回家了,我是更情愿留久点在学校,一来学校安静,二来免得火车太挤.  这临走前的几天,放下了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 只有一个文件..呵呵

[cpp] view plain copy
  1. #include <stdio.h>
  2. #include <netinet/in.h>
  3. #include <ev.h>
  4. #define PORT 9999
  5. #define BUFFER_SIZE 1024
  6. void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents);
  7. void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents);
  8. int main()
  9. {
  10. struct ev_loop *loop = ev_default_loop(0);
  11. int sd;
  12. struct sockaddr_in addr;
  13. int addr_len = sizeof(addr);
  14. struct ev_io socket_accept;
  15. // 创建socket的写法,这里简单处理,用INADDR_ANY ,匹配任何客户端请求.这里写法都一样,没什么特别的,直接copy都可以用
  16. if( (sd = socket(PF_INET, SOCK_STREAM, 0)) < 0 )
  17. {
  18. printf("socket error");
  19. return -1;
  20. }
  21. bzero(&addr, sizeof(addr));
  22. addr.sin_family = AF_INET;
  23. addr.sin_port = htons(PORT);
  24. addr.sin_addr.s_addr = INADDR_ANY;
  25. if (bind(sd, (struct sockaddr*) &addr, sizeof(addr)) != 0)
  26. {
  27. printf("bind error");
  28. }
  29. if (listen(sd, 2) < 0)
  30. {
  31. printf("listen error");
  32. return -1;
  33. }
  34. // 初始化,这里监听了io事件,写法参考官方文档的
  35. ev_io_init(&socket_accept, accept_cb, sd, EV_READ);
  36. ev_io_start(loop, &socket_accept);
  37. while (1)
  38. {
  39. ev_loop(loop, 0);
  40. }
  41. return 0;
  42. }
  43. //accept事件 的回调块
  44. void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
  45. {
  46. struct sockaddr_in client_addr;
  47. socklen_t client_len = sizeof(client_addr);
  48. int client_sd;
  49. //分派客户端的ev io结构
  50. struct ev_io *w_client = (struct ev_io*) malloc (sizeof(struct ev_io));
  51. //libev的错误处理
  52. if(EV_ERROR & revents)
  53. {
  54. printf("error event in accept");
  55. return;
  56. }
  57. //accept,普通写法
  58. client_sd = accept(watcher->fd, (struct sockaddr *)&client_addr, &client_len);
  59. if (client_sd < 0)
  60. {
  61. printf("accept error");
  62. return;
  63. }
  64. printf("someone connected.\n");
  65. //开始监听读事件了,有客户端信息就会被监听到
  66. ev_io_init(w_client, read_cb, client_sd, EV_READ);
  67. ev_io_start(loop, w_client);
  68. }
  69. //read 数据事件的回调快
  70. void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents){
  71. char buffer[BUFFER_SIZE];
  72. ssize_t read;
  73. if(EV_ERROR & revents)
  74. {
  75. printf("error event in read");
  76. return;
  77. }
  78. //recv普通socket写法
  79. read = recv(watcher->fd, buffer, BUFFER_SIZE, 0);
  80. if(read < 0)
  81. {
  82. printf("read error");
  83. return;
  84. }
  85. //断开链接的处理,停掉evnet就可以,同时记得释放客户端的结构体!
  86. if(read == 0)
  87. {
  88. printf("someone disconnected.\n");
  89. ev_io_stop(loop,watcher);
  90. free(watcher);
  91. return;
  92. }
  93. else
  94. {
  95. printf("get the message:%s\n",buffer);
  96. }
  97. //原信息返回,也可以自己写信息,都一样.最后记得置零
  98. send(watcher->fd, buffer, read, 0);
  99. bzero(buffer, read);
  100. }

编译后,运行. 然后打开teminal ,   telnet 127.0.0.1 9999  就可以发送信息了.

入手c的网络编程,将来,对比下erlang的底层网络通讯是怎么弄的

~~by dp

[c语言 ] 用libev 写个echo服务器相关推荐

  1. 介绍 Echoo: go 语言编写的 echo 服务器

    原文地址 简介 最近由于要配置 nginx 服务器,里面有个代理转发(proxy_pass)的功能,能够将当前服务器接收到的请求转发给其他服务器来处理. 但是在配置当中,我发现我无法确认我的 prox ...

  2. 如何用C语言写一个web服务器的基础功能

    我们都知道,学一门语言,只是单独看了就不写的话是很容易出现眼高手低的,所以,今天摩杜云要给大家分享的内容,就是如何用C语言写一个web服务器的基础功能,希望大家看完有所收获. 服务器架构 目标架构 以 ...

  3. echo服务器(回显服务器)

    转载:https://blog.csdn.net/lanyan822/article/details/7679733 写在文章前: 这学习linux编程,也有一段时间了.虽然是一个人看书,琢磨.也想把 ...

  4. 【slighttpd】基于lighttpd架构的Server项目实战(4)—简单的echo服务器

    转载地址:https://blog.csdn.net/jiange_zh/article/details/50636536 在这一部分,我们将对上一篇中的master-worker进行拓展,成为一个简 ...

  5. api怎么写_使用Node.js原生API写一个web服务器

    Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...

  6. C/C++编程:如何写一个Web服务器

    github https://github.com/zyearn/zaver 教科书上的server 学网络编程,第一个例子可能会是TCP echo服务器.大概思路是server会listen在某个端 ...

  7. Grizzly开发Echo服务器实战

    Grizzly开发Echo服务器实战 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 用Java编写可伸缩的服务器应用是有难度的,用Java NIO开发. ...

  8. 基于poll实现的echo服务器

    /*poll实现的echo服务器.Author:thinkmay*/#include <stdio.h>#include <stdlib.h>#include <stri ...

  9. socket 编程入门教程(四)TCP应用:1、构建echo服务器

    2019独角兽企业重金招聘Python工程师标准>>> 现在,我们用前面所构建的socket类,重新设计第一章中echo的服务器,然后设计客户端程序. echo服务器的工作原理很简单 ...

最新文章

  1. linux内核网络协议栈--接收流程及函数(九)
  2. 通信人,请不要吝啬举手之劳
  3. js 原型以及原型链
  4. 蔚来、威马抢装的英伟达Orin,正成为高端智能车标配
  5. 不戴眼镜听不清?Google用视觉信号分离语音 | 附论文
  6. iOS开发Assertion failure in -[AFJSONRequestSerializer requestWithMethod:URLString:parameters:error:]
  7. oracle数据库写文件,Oracle对操作系统文件的读写操作
  8. sql条件查询表数据条数
  9. 线性规划,大M法,两阶段法
  10. 当我们谈注册中心时我们谈什么
  11. Android解析SRT字幕文件
  12. java dns缓存清理_jvm dns缓存问题解决方式
  13. 产业分析:视频云服务行业
  14. 个别化教育计划IEP模板
  15. ARFoundation从零开始3-创建ARFoundation项目
  16. VC6.0补丁Vs6sp6安装方法
  17. Opcua学习笔记1 opc介绍
  18. linux 常用命令——MySql 5.7添加用户、删除用户与授权
  19. 以下为一个有理数类,一个有理数由分子和分母组成,目前定义了一个输出函数 十七、编写一个加法函数,可以接收另一个有理数,与自身的值相加 十八、编写一个乘法函数,同理接收另一个有理数,与自身的值相乘
  20. 【推荐实践】大规模异构图召回在美团到店推荐广告的应用

热门文章

  1. iPhone7p与iPhoneX布局出现右边白边问题
  2. CSS学习04之层次选择器
  3. mybatis学习5复杂查询之多对一的处理
  4. python中的input函数怎么用_python input()函数怎么用,_Python_ 少侠科技
  5. android点击事件的优先级,android中进程的优先级
  6. c++ 出现1.#IND、1.#INF
  7. 小白 初步识别读取距离
  8. TCP通讯处理粘包详解
  9. 数据库学习实践(四、五)--分页浏览、查询数据
  10. Thinking in java基础之集合框架