看到很多人写c代码、的结构为包的各种元件、例如,使用转载如下epoll样本:

  1. //   
  2. // a simple echo server using epoll in linux  
  3. //   
  4. // 2009-11-05  
  5. // 2013-03-22:改动了几个问题,1是/n格式问题。2是去掉了原代码不小心加上的ET模式;
  6. // 本来仅仅是简单的示意程序。决定还是加上 recv/send时的buffer偏移
  7. // by sparkling  
  8. //   
  9. #include <sys/socket.h>  
  10. #include <sys/epoll.h>  
  11. #include <netinet/in.h>  
  12. #include <arpa/inet.h>  
  13. #include <fcntl.h>  
  14. #include <unistd.h>  
  15. #include <stdio.h>  
  16. #include <errno.h>  
  17. #include <iostream>  
  18. using namespace std;  
  19. #define MAX_EVENTS 500  
  20. struct myevent_s  
  21. {  
  22.     int fd;  
  23.     void (*call_back)(int fd, int events, void *arg);  
  24.     int events;  
  25.     void *arg;  
  26.     int status; // 1: in epoll wait list, 0 not in  
  27.     char buff[128]; // recv data buffer  
  28.     int len, s_offset;  
  29.     long last_active; // last active time  
  30. };  
  31. // set event  
  32. void EventSet(myevent_s *ev, int fd, void (*call_back)(int, int, void*), void *arg)  
  33. {  
  34.     ev->fd = fd;  
  35.     ev->call_back = call_back;  
  36.     ev->events = 0;  
  37.     ev->arg = arg;  
  38.     ev->status = 0;
  39.     bzero(ev->buff, sizeof(ev->buff));
  40.     ev->s_offset = 0;  
  41.     ev->len = 0;
  42.     ev->last_active = time(NULL);  
  43. }  
  44. // add/mod an event to epoll  
  45. void EventAdd(int epollFd, int events, myevent_s *ev)  
  46. {  
  47.     struct epoll_event epv = {0, {0}};  
  48.     int op;  
  49.     epv.data.ptr = ev;  
  50.     epv.events = ev->events = events;  
  51.     if(ev->status == 1){  
  52.         op = EPOLL_CTL_MOD;  
  53.     }  
  54.     else{  
  55.         op = EPOLL_CTL_ADD;  
  56.         ev->status = 1;  
  57.     }  
  58.     if(epoll_ctl(epollFd, op, ev->fd, &epv) < 0)  
  59.         printf("Event Add failed[fd=%d], evnets[%d]\n", ev->fd, events);  
  60.     else  
  61.         printf("Event Add OK[fd=%d], op=%d, evnets[%0X]\n", ev->fd, op, events);  
  62. }  
  63. // delete an event from epoll  
  64. void EventDel(int epollFd, myevent_s *ev)  
  65. {  
  66.     struct epoll_event epv = {0, {0}};  
  67.     if(ev->status != 1) return;  
  68.     epv.data.ptr = ev;  
  69.     ev->status = 0;
  70.     epoll_ctl(epollFd, EPOLL_CTL_DEL, ev->fd, &epv);  
  71. }  
  72. int g_epollFd;  
  73. myevent_s g_Events[MAX_EVENTS+1]; // g_Events[MAX_EVENTS] is used by listen fd  
  74. void RecvData(int fd, int events, void *arg);  
  75. void SendData(int fd, int events, void *arg);  
  76. // accept new connections from clients  
  77. void AcceptConn(int fd, int events, void *arg)  
  78. {  
  79.     struct sockaddr_in sin;  
  80.     socklen_t len = sizeof(struct sockaddr_in);  
  81.     int nfd, i;  
  82.     // accept  
  83.     if((nfd = accept(fd, (struct sockaddr*)&sin, &len)) == -1)  
  84.     {  
  85.         if(errno != EAGAIN && errno != EINTR)  
  86.         {  
  87.         }
  88.         printf("%s: accept, %d", __func__, errno);  
  89.         return;  
  90.     }  
  91.     do  
  92.     {  
  93.         for(i = 0; i < MAX_EVENTS; i++)  
  94.         {  
  95.             if(g_Events[i].status == 0)  
  96.             {  
  97.                 break;  
  98.             }  
  99.         }  
  100.         if(i == MAX_EVENTS)  
  101.         {  
  102.             printf("%s:max connection limit[%d].", __func__, MAX_EVENTS);  
  103.             break;  
  104.         }  
  105.         // set nonblocking
  106.         int iret = 0;
  107.         if((iret = fcntl(nfd, F_SETFL, O_NONBLOCK)) < 0)
  108.         {
  109.             printf("%s: fcntl nonblocking failed:%d", __func__, iret);
  110.             break;
  111.         }
  112.         // add a read event for receive data  
  113.         EventSet(&g_Events[i], nfd, RecvData, &g_Events[i]);  
  114.         EventAdd(g_epollFd, EPOLLIN, &g_Events[i]);  
  115.     }while(0);  
  116.     printf("new conn[%s:%d][time:%d], pos[%d]\n", inet_ntoa(sin.sin_addr),
  117.             ntohs(sin.sin_port), g_Events[i].last_active, i);  
  118. }  
  119. // receive data  
  120. void RecvData(int fd, int events, void *arg)  
  121. {  
  122.     struct myevent_s *ev = (struct myevent_s*)arg;  
  123.     int len;  
  124.     // receive data
  125.     len = recv(fd, ev->buff+ev->len, sizeof(ev->buff)-1-ev->len, 0);    
  126.     EventDel(g_epollFd, ev);
  127.     if(len > 0)
  128.     {
  129.         ev->len += len;
  130.         ev->buff[len] = '\0';  
  131.         printf("C[%d]:%s\n", fd, ev->buff);  
  132.         // change to send event  
  133.         EventSet(ev, fd, SendData, ev);  
  134.         EventAdd(g_epollFd, EPOLLOUT, ev);  
  135.     }  
  136.     else if(len == 0)  
  137.     {  
  138.         close(ev->fd);  
  139.         printf("[fd=%d] pos[%d], closed gracefully.\n", fd, ev-g_Events);  
  140.     }  
  141.     else  
  142.     {  
  143.         close(ev->fd);  
  144.         printf("recv[fd=%d] error[%d]:%s\n", fd, errno, strerror(errno));  
  145.     }  
  146. }  
  147. // send data  
  148. void SendData(int fd, int events, void *arg)  
  149. {  
  150.     struct myevent_s *ev = (struct myevent_s*)arg;  
  151.     int len;  
  152.     // send data  
  153.     len = send(fd, ev->buff + ev->s_offset, ev->len - ev->s_offset, 0);
  154.     if(len > 0)  
  155.     {
  156.         printf("send[fd=%d], [%d<->%d]%s\n", fd, len, ev->len, ev->buff);
  157.         ev->s_offset += len;
  158.         if(ev->s_offset == ev->len)
  159.         {
  160.             // change to receive event
  161.             EventDel(g_epollFd, ev);  
  162.             EventSet(ev, fd, RecvData, ev);  
  163.             EventAdd(g_epollFd, EPOLLIN, ev);  
  164.         }
  165.     }  
  166.     else  
  167.     {  
  168.         close(ev->fd);  
  169.         EventDel(g_epollFd, ev);  
  170.         printf("send[fd=%d] error[%d]\n", fd, errno);  
  171.     }  
  172. }  
  173. void InitListenSocket(int epollFd, short port)  
  174. {  
  175.     int listenFd = socket(AF_INET, SOCK_STREAM, 0);  
  176.     fcntl(listenFd, F_SETFL, O_NONBLOCK); // set non-blocking  
  177.     printf("server listen fd=%d\n", listenFd);  
  178.     EventSet(&g_Events[MAX_EVENTS], listenFd, AcceptConn, &g_Events[MAX_EVENTS]);  
  179.     // add listen socket  
  180.     EventAdd(epollFd, EPOLLIN, &g_Events[MAX_EVENTS]);  
  181.     // bind & listen  
  182.     sockaddr_in sin;  
  183.     bzero(&sin, sizeof(sin));  
  184.     sin.sin_family = AF_INET;  
  185.     sin.sin_addr.s_addr = INADDR_ANY;  
  186.     sin.sin_port = htons(port);  
  187.     bind(listenFd, (const sockaddr*)&sin, sizeof(sin));  
  188.     listen(listenFd, 5);  
  189. }  
  190. int main(int argc, char **argv)  
  191. {  
  192.     unsigned short port = 12345; // default port  
  193.     if(argc == 2){  
  194.         port = atoi(argv[1]);  
  195.     }  
  196.     // create epoll  
  197.     g_epollFd = epoll_create(MAX_EVENTS);  
  198.     if(g_epollFd <= 0) printf("create epoll failed.%d\n", g_epollFd);  
  199.     // create & bind listen socket, and add to epoll, set non-blocking  
  200.     InitListenSocket(g_epollFd, port);  
  201.     // event loop  
  202.     struct epoll_event events[MAX_EVENTS];  
  203.     printf("server running:port[%d]\n", port);  
  204.     int checkPos = 0;  
  205.     while(1){  
  206.         // a simple timeout check here, every time 100, better to use a mini-heap, and add timer event  
  207.         long now = time(NULL);  
  208.         for(int i = 0; i < 100; i++, checkPos++) // doesn't check listen fd  
  209.         {  
  210.             if(checkPos == MAX_EVENTS) checkPos = 0; // recycle  
  211.             if(g_Events[checkPos].status != 1) continue;  
  212.             long duration = now - g_Events[checkPos].last_active;  
  213.             if(duration >= 60) // 60s timeout  
  214.             {  
  215.                 close(g_Events[checkPos].fd);  
  216.                 printf("[fd=%d] timeout[%d--%d].\n", g_Events[checkPos].fd, g_Events[checkPos].last_active, now);  
  217.                 EventDel(g_epollFd, &g_Events[checkPos]);  
  218.             }  
  219.         }  
  220.         // wait for events to happen  
  221.         int fds = epoll_wait(g_epollFd, events, MAX_EVENTS, 1000);  
  222.         if(fds < 0){  
  223.             printf("epoll_wait error, exit\n");  
  224.             break;  
  225.         }  
  226.         for(int i = 0; i < fds; i++){  
  227.             myevent_s *ev = (struct myevent_s*)events[i].data.ptr;  
  228.             if((events[i].events&EPOLLIN)&&(ev->events&EPOLLIN)) // read event  
  229.             {  
  230.                 ev->call_back(ev->fd, events[i].events, ev->arg);  
  231.             }  
  232.             if((events[i].events&EPOLLOUT)&&(ev->events&EPOLLOUT)) // write event  
  233.             {  
  234.                 ev->call_back(ev->fd, events[i].events, ev->arg);  
  235.             }  
  236.         }  
  237.     }  
  238.     // free resource  
  239.     return 0;  
  240. }   

我在想,不能直接使用c++它?

版权声明:本文博客原创文章,博客,未经同意,不得转载。

使用c++代替使用的c包!的更多相关文章

  1. Npm包的开发

    个人开发包的目录结构 ├── coverage //istanbul测试覆盖率生成的文件 ├── index.js //入口文件 ├── introduce.md //说明文件 ├── lib │   ...

  2. Windows server 2012 添加中文语言包(英文转为中文)(离线)

    Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...

  3. 如何在nuget上传自己的包+搭建自己公司的NuGet服务器(新方法)

    运维相关:http://www.cnblogs.com/dunitian/p/4822808.html#iis 先注册一个nuget账号https://www.nuget.org/ 下载并安装一下Nu ...

  4. android http 抓包

    有时候想开发的时候想看APP发出的http请求和响应是什么,这就需要抓包了,这可以得到一些不为人知的api,比如还可以干些“坏事”... 需要工具: Fiddler2 抓包(点击下载) Android ...

  5. 带你实现开发者头条APP(四)---首页优化(加入design包)

    title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...

  6. git克隆项目到本地&&全局安装依赖项目&&安装依赖包&&启动服务

     一.安装本地开发环境 1.安装本项目 在需要保存到本地的项目的文件夹,进入到文件夹里点击右键,bash here,出现下图: 2.安装依赖项目  3.安装依赖包(进入到命令行) # 安装依赖包 $ ...

  7. 关于Visual Studio 未能加载各种Package包的解决方案

    问题: 打开Visual Studio 的时候,总提示未能加载相应的Package包,有时候还无法打开项目,各种提示 解决方案: 进入用户目录 C:\Users\用户名\AppData\Local\M ...

  8. VS项目中使用Nuget还原包后编译生产还一直报错?

    Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...

  9. 用Java代码实现拦截区域网数据包

    起因: 吃饭的时间在想如果区域网内都是通过路由器上网,那如何实现拦截整个区域网的数据包,从而实现某种窥探欲. 思路:      正常是通过电脑网卡预先设置或分配的IP+网关对路由器进行通讯,比如访问百 ...

  10. Android studio使用gradle动态构建APP(不同的包,不同的icon、label)

    最近有个需求,需要做两个功能相似的APP,大部分代码是一样的,只是界面不一样,以前要维护两套代码,比较麻烦,最近在网上找资料,发现可以用gradle使用同一套代码构建两个APP.下面介绍使用方法: 首 ...

随机推荐

  1. 嵌入式arm linux环境中gdb+gdbserver调试

    一.前言嵌入式Linux系统中,应用开发过程中,很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序.采用GDB方法调试,由于嵌入式系统资源有限性,一般不能直接在目标系统上进行调试,通常采 ...

  2. 如何使stm32程序更好移植, 结构体相当于define

    原创:转载请标注引用地址 如何定义 led1对应于PA8  呢 :对于我一开始学习的方法:: #include "main.h" #define led1      GPIO_Pi ...

  3. embed-it_Integrator memory compile工具使用之二

    embed-it_Integrator memory compile工具使用之二 主要内容 使用ish接口自动加载memory的cfg文件运行生成memory 脚本内容 打开Integrate &am ...

  4. ibatis 开发中的经验 (三)Struts+Spring+Ibatis 开发环境搭建

             ibatis项目中用到了一些基本配置,须要和spring集成,看了看这些配置大部分同hibernate中是一样的,也比較好理解.仅仅是须要他们的配置中每个类的含义,还有当中的一些细节 ...

  5. 《Java设计模式》之抽象工厂模式

    场景问题 举个生活中常见的样例--组装电脑.我们在组装电脑的时候.通常须要选择一系列的配件,比方CPU.硬盘.内存.主板.电源.机箱等. 为讨论使用简单点.仅仅考虑选择CPU和主板的问题. 其实,在选 ...

  6. Linux下多线程查看工具(pstree、ps、pstack),linux命令之-pstree使用说明, linux 查看线程状态。 不指定

    0.最常用 pstree:[root@iZ25dcp92ckZ temp]# pstree -a|grep multe  |       |   `-multepoolser  |       |   ...

  7. 【转】HTML5移动端最新兼容问题解决方案

    1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显 ...

  8. Spring web 工具类 WebApplicationContextUtils

    概述 Spring web 的工具类 WebApplicationContextUtils 位于包 org.springframework.web.context.support 是访问一个Servl ...

  9. css3-9 css中的浮动怎么使用

    css3-9 css中的浮动怎么使用 一.总结 一句话总结:用来做一般的行效果,比如说手机左右分布的头部导航栏.浮动的东西放到一个div中去,里面的内容根据需求左浮动或者右浮动,然后记得加上清除浮动. ...

  10. Unity3D资源管理架构

    在Unity3D引擎中,场景资源文件(.unity)是以2进制格式存储的.但同一时候它也有一种基于文本的表现格式. 可在Edit>Project Setting>Editor 中设置: 1 ...