问题根源:当有许多客户端用socket来连接我的服务器(期间存在一定的数据交互)的时候,为了提高性能,我们需要采用多线程编程(处理具体的请求),同时还要使用epoll来高效的在IO事件之间切换(侦查socket连接的IO事件)。

这篇随笔,我们主要是写一个单独的模块来解决http到rpc的转化这个问题(本质上来说,有很多开源库来完成这个协议转化的比如XML-RPC,具体需要根据实际情况使用),我们的这么模块需要做其他逻辑,所以自己做了这个工作。

由于我们采用C++编程,有线程池的类写起来和传统的C程序有点不同。

如要在c++下操作线程,有两种办法:
1、第一种:在.CPP文件中,定义不属于某个类的线程处理函数。然后在某个类中调用pthread_create创建线程,并将线程处理函数的地址传给 pthread_create,编译通过。但是不方便处理和调用类中的成员变量或者成员函数,而且.CPP文件单独出现不属于任一类的函数,一定程度上破坏了类的结构,且与C++面向对象设计不符。
2、第二种:在.h头文件中申明static的线程处理函数,编译通过。但是由于处理函数是static静态的,在处理函数中如果再去调用或者处理类的变量和类函数,则也需对应的类变量和类函数都为static静态,这也一定程序破坏了类的结构。解决办法是:调用pthread_create时,pthread_create最后一个参数传进(void*)this指针给线程处理函数 ,这样就可以在static线程处理函数里调用this的类成员变量和类成员函数了。

至于epoll的例子,http://blog.csdn.net/haoahua/archive/2008/01/11/2037704.aspx讲的很好。

而之前提出的问题,设计思路则是:创建一个线程池(50)------->生成一个socket sfd并监听某端口,同时生成一个epoll epfd文件描述符并将sfd注册倒epfd中-------->当epoll发现IO有变动的时候,会拿到是什么类型的IO变动,如果是请求类型的变动,则建立新的连接,并同时加入epoll监听;如果不是新的连接,则说明是已有连接的数据到达,则放入循环队列(线程池中的线程会自动处理队列里面的东西)。经同事测试,这样的实现性能很好,qps很轻松的到3000+(开50个线程池的时候)。

http://dev.csdn.net/htmls/55/55394.html这里有一个比较详细的例子,我这里的程序也是在其基础上开发的,主要为了记录:

分析一下epoll,挺有意思的一个东西,其有两种模式,ET和LT,ET模式仅当状态发生变化的时候才获得通知,这里所谓的状态的变化并不包括缓冲区中还有未处理的数据,也就是说,如果要采用ET模式,需要一直 read/write直到出错为止,很多人反映为什么采用ET模式只接收了一部分数据就再也得不到通知了,大多因为这样;而LT模式是只要有数据没有处理就会一直通知下去的。

另外还有一点需要注意,既然是将http协议转化为rpc协议,那么就需要对传入的http请求串进行解析,取出其中有用的部分封装成rpc消息传与后端,对与http协议的描述见http://www.shenmiguo.com/archives/2009/147_http-format.html 主要是GET和POST方法。

转载于:https://www.cnblogs.com/mahatma/archive/2011/03/17/1987415.html

C++多线程编程以及epoll处理socket通信时多端口问题相关推荐

  1. Win32多线程编程(3) — 线程同步与通信

    一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线程的 ...

  2. epoll实现socket通信

    epoll是Linux特有的I/O复用函数,它在实现和使用上与select和poll有很大差异.epoll使用一组函数来完成任务,而不是单个函数.epoll把用户关心的文件描述符上的事件放在内核的一个 ...

  3. java socket编程聊天室_Java Socket通信之聊天室功能

    Java Socket通信之聊天室功能 发布时间:2020-10-17 14:36:00 来源:脚本之家 阅读:73 作者:LY_624 本文实例为大家分享了Java Socket聊天室功能的具体代码 ...

  4. 解决socket通信时TIME_WAIT的socket过多

    TIME_WAIT状态 TCP要保证在所有可能的情况下使得所有的数据都能够正确被投递. 当关闭一个 socket 连接时,主动关闭一端的 socket 将进入TIME_WAIT状态,而被动关闭一方则转 ...

  5. C#socket通信时,怎样判断socket双方是否断开连接

    我在Server端new了一个socket,然后bind,开了一个线程来accept前来连接的client,每接到一个client前来连接就新开一个线程和它进行通信. 我把Server端得到的sock ...

  6. java aio socket_java核心学习(三十三) 网络编程---AIO实现异步Socket通信

    AIO需要操作系统的支持,在linux内核2.6版本中加入了对真正异步IO的支持,java从jdk1.7开始支持AIO 核心类有AsynchronousSocketChannel .Asynchron ...

  7. 【网络编程知识】使用Socket通信,做一个简单的多人聊天室

  8. socket通信时如何判断当前连接是否断开--select函数,心跳线程,QsocketNotifier监控socket...

    client与server建立socket连接之后,如果突然关闭server,此时,如果不在客户端close(socket_fd),会有不好的影响: QsocketNotifier监控socket的槽 ...

  9. Qt使用socket通信时接收的汉字信息显示时乱码

    显示乱码的原因是因为编码格式不一致. 下面附上一个曾经的例子. QString str = ui->textEdit->toPlainText();QByteArray text = st ...

最新文章

  1. 题目1128:求平均年龄
  2. 目标代码文件、可执行文件和库
  3. Error:Unable to tunnel through proxy. Proxy returns HTTP/1.1 400 Bad Request
  4. java拳皇地下城_拳皇(Java简单的小程序)代码实例
  5. yarn.lock 文件和 yarn install
  6. yum安装openoffice
  7. 过去10年技术人员有哪些状态改变?
  8. Java设计模式--解释器模式
  9. python polar contour_13.极坐标系(Polar coordinate system)
  10. Odoo10教程---模块化三:模型约束,高级视图,工作流,安全性,向导,国际化和报表等
  11. mvc4.0 @Styles.Render(转)
  12. 解压.tar.bz2文件命令
  13. 程序员记录之人性弱点
  14. VMware虚拟机中激活Windows Server 2008的具体步骤
  15. 大数据Top K问题
  16. 学生用计算机重启,学生用计算器咋关机
  17. 做软文营销发布有哪些常见平台?
  18. 前端小程序,h5,浏览器,app, doc,.docx,.ofd,.PDF,.WPS以及Office文档的在线解析预览方式
  19. mysql常考50_要想学好SQL语句必会的50题,也是考试常考的点
  20. STL string容器 构造,查找,替换,拼接,比较,截取,插入删除

热门文章

  1. NSAssert和NSLog
  2. Reason not to use LINQ and reason to use
  3. WPC大会新动态:合作伙伴采纳Windows Azure
  4. Proximal Algorithms 3 Interpretation
  5. 一直被喷不实用的超算 在深度学习时代会改变吗?
  6. IBM首席执行官提出人工智能部署三大基本原则
  7. 写一个关于github简历远程仓库的总结
  8. GNU screen 命令
  9. [Android应用]《花界》V1.0 正式版隆重发布!
  10. Microsoft Dynamics CRM4.0 Data Auditing and Restore (数据审核和恢复)