1. #include <errno.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <iostream>
  9. #include <sys/epoll.h>
  10.  
  11. using namespace std;
  12.  
  13. int main(int argc, char *argv[])
  14. {
  15. if (argc != )
  16. {
  17. cout << "usage: " << argv[] << " ip port" << endl;
  18. return -;
  19. }
  20.  
  21. char *szIp = argv[];
  22. in_addr_t iIp = inet_addr(szIp);
  23. if (iIp == INADDR_NONE)
  24. {
  25. cerr << "fail to parse ip: " << szIp << endl;
  26. return -;
  27. }
  28. char *pEnd = NULL;
  29. uint16_t usPort = strtoul(argv[], &pEnd, );
  30. if (*pEnd != '\0')
  31. {
  32. cerr << "fail to parse port: " << argv[] << endl;
  33. return -;
  34. }
  35.  
  36. int iSockFd = socket(AF_INET, SOCK_STREAM, );
  37. if (iSockFd < )
  38. {
  39. cerr << "fail to create socket, err: " << strerror(errno) << endl;
  40. return -;
  41. }
  42. cout << "create socket fd " << iSockFd << endl;
  43.  
  44. sockaddr_in oAddr;
  45. memset(&oAddr, , sizeof(oAddr));
  46. oAddr.sin_family = AF_INET;
  47. oAddr.sin_addr.s_addr = iIp;
  48. oAddr.sin_port = htons(usPort);
  49. if (bind(iSockFd, (sockaddr *)&oAddr, sizeof(oAddr)) < )
  50. {
  51. cerr << "fail to bind addr " << szIp << ":" << usPort << ", err: " << strerror(errno) << endl;
  52. return -;
  53. }
  54. cout << "bind addr " << szIp << ":" << usPort << endl;
  55.  
  56. if (listen(iSockFd, ) < )
  57. {
  58. cerr << "fail to listen on " << szIp << ":" << usPort << ", err: " << strerror(errno) << endl;
  59. }
  60. cout << "listen on socket fd " << iSockFd << endl;
  61.  
  62. int iEpollFd = epoll_create();
  63. if (iEpollFd < )
  64. {
  65. cerr << "fail to create epoll, err: " << strerror(errno) << endl;
  66. return -;
  67. }
  68.  
  69. epoll_event oEvent;
  70. oEvent.events = EPOLLIN;
  71. oEvent.data.fd = iSockFd;
  72. if (epoll_ctl(iEpollFd, EPOLL_CTL_ADD, iSockFd, &oEvent) < )
  73. {
  74. cerr << "fail to add listen fd to epoll, err: " << strerror(errno) << endl;
  75. return -;
  76. }
  77.  
  78. epoll_event aoEvents[];
  79. uint8_t acRecvBuf[ * ];
  80. while (true)
  81. {
  82. int iFdCnt = epoll_wait(iEpollFd, aoEvents, , -);
  83. if (iFdCnt < )
  84. {
  85. cerr << "epoll wait error, err: " << strerror(errno) << endl;
  86. return -;
  87. }
  88.  
  89. for (int i = ; i < iFdCnt; i++)
  90. {
  91. if (aoEvents[i].data.fd == iSockFd)
  92. {
  93. sockaddr_in oClientAddr;
  94. socklen_t iAddrLen = sizeof(oClientAddr);
  95. int iAcceptFd = accept(iSockFd, (sockaddr *)&oClientAddr, &iAddrLen);
  96. if (iAcceptFd < )
  97. {
  98. cerr << "fail to accpet, err: " << strerror(errno) << endl;
  99. continue;
  100. }
  101. cout << "recv connection from " << inet_ntoa(oClientAddr.sin_addr) << ":" << ntohs(oClientAddr.sin_port) << endl;
  102.  
  103. oEvent.events = EPOLLIN;
  104. oEvent.data.fd = iAcceptFd;
  105. if (epoll_ctl(iEpollFd, EPOLL_CTL_ADD, iAcceptFd, &oEvent) < )
  106. {
  107. close(iAcceptFd);
  108. cerr << "fail to add fd to epoll, err: " << strerror(errno) << endl;
  109. continue;
  110. }
  111. }
  112. else
  113. {
  114. int iCurFd = aoEvents[i].data.fd;
  115. ssize_t iRecvLen = recv(iCurFd, acRecvBuf, sizeof(acRecvBuf), );
  116. if (iRecvLen < )
  117. {
  118. cerr << "fail to recv, close connection, err: " << strerror(errno) << endl;
  119. if (epoll_ctl(iEpollFd, EPOLL_CTL_DEL, iCurFd, NULL) < )
  120. {
  121. cerr << "fail to del fd from epoll, err: " << strerror(errno) << endl;
  122. }
  123. close(iCurFd);
  124. continue;
  125. }
  126. if (iRecvLen == )
  127. {
  128. cout << "connection closed by client" << endl;
  129. if (epoll_ctl(iEpollFd, EPOLL_CTL_DEL, iCurFd, NULL) < )
  130. {
  131. cerr << "fail to del fd from epoll, err: " << strerror(errno) << endl;
  132. }
  133. close(iCurFd);
  134. continue;
  135. }
  136. cout << "recv data len: " << iRecvLen << endl;
  137.  
  138. ssize_t iSendLen = send(iCurFd, acRecvBuf, iRecvLen, );
  139. if (iSendLen < )
  140. {
  141. cerr << "fail to send, err: " << strerror(errno) << endl;
  142. if (epoll_ctl(iEpollFd, EPOLL_CTL_DEL, iCurFd, NULL) < )
  143. {
  144. cerr << "fail to del fd from epoll, err: " << strerror(errno) << endl;
  145. }
  146. close(iCurFd);
  147. break;
  148. }
  149. cout << "echo to client, len: " << iSendLen << endl;
  150. }
  151. }
  152. }
  153. }

epoll代码示例的更多相关文章

  1. 统一事件源epoll代码示例

    可以将信号注册进pipe管道的写端,通过对读端的监听,来实现统一事件源. #include <sys/types.h> #include <sys/socket.h> #inc ...

  2. 高级渲染技巧和代码示例 GPU Pro 7

    下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...

  3. Java8-Function使用及Groovy闭包的代码示例

    导航 定位 概述 代码示例 Java-Function Groovy闭包 定位 本文适用于想要了解Java8 Function接口编程及闭包表达式的筒鞋. 概述 在实际开发中,常常遇到使用模板模式的场 ...

  4. [IOS 开发] 懒加载 (延迟加载) 的基本方式,好处,代码示例

    懒加载的好处: 1> 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 2> 每个属性的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 ...

  5. SELECT控件操作的JS代码示例

    SELECT控件操作的JS代码示例 1 检测是否有选中 if(objSelect.selectedIndex > -1) { //说明选中 } else { //说明没有选中 } 2.动态创建s ...

  6. 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好

    HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...

  7. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

  8. C#与数据库访问技术总结(十五)之 DataAdapter对象代码示例

    DataAdapter对象代码示例 下面的代码将说明如何利用DataAdapter对象填充DataSet对象. private static string strConnect=" data ...

  9. C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例

    Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...

随机推荐

  1. Icehouse 创建Instance代码分析

    1. nova-api接收到request 在/etc/nova/api-paste.ini中,是这样配置nova v2的 [app:osapi_compute_app_v2] paste.app_f ...

  2. 包建强的培训课程(16):Android新技术入门和提高

    @import url(/css/cuteeditor.css); Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·‘“〈 ...

  3. python爬虫学习之爬取全国各省市县级城市邮政编码

    实例需求:运用python语言在http://www.ip138.com/post/网站爬取全国各个省市县级城市的邮政编码,并且保存在excel文件中 实例环境:python3.7 requests库 ...

  4. 盘点和反思在微信的阴影下艰难求生的移动端IM应用

    本文原作者:李越,由银杏财经原创发布,本次内容改动. 1.前言 上线一周完成1.5亿元融资,上线10天总激活用户数超400万,8月29日单日新增用户超100万,这是子弹短信交出的最新成绩单(详见< ...

  5. Javascript高级编程学习笔记(44)—— 动态样式

    动态样式 动态样式和昨天的动态脚本一样,都是一种动态引入外部样式(脚本的方式) 由于样式是由 link 元素引入的,所以动态样式自然也就是动态生成link元素插入文档的方式 不过和动态脚本不同的是,动 ...

  6. 动态创建数据table

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 吴恩达机器学习笔记31-梯度检验(Gradient Checking)

    当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解.为了避免这样的问题,我们采取一种叫做梯度的 ...

  8. silverlight属性改变事件通知

    工作中遇到silverlight本身没有提供的某些属性改变事件,但又需要在属性改变时得到通知,Google搬运stack overflow,原地址 /// Listen for change of t ...

  9. HBuilder+eclipse开发:使用ajax异步传值生成首字母索引

    使用ajax异步传值生成首字母索引大致有以下几个步骤: 1.服务器端使用servlet提取出数据库里的数据; 2.使用首字母工具类对数据进处理得到首字母; 3.再将首字母和数据一一对应存入json数组 ...

  10. Python 中的object takes no parameters错误

    Python是一门面向对象的语言,中我们首先创建一个类: class Student(object): def _init_(self,name,score): self.name = name se ...