一个简单的高并发的回应服务器(5万并发)

一个简单的高并发的回应服务器,主要是使用boost的库! 自己测试过可以达到5万个并发!

程序的下载地址:http://download.csdn.net/detail/guanyijun123/8335907


#include <stdio.h>
//#include "AuthenHandle.h"
//#include "configure.h"
//#include "NetSocketCommand.h"#ifdef WIN32 //for windows nt/2000/xp//#include "gelsserver.h"
#pragma comment(lib,"Ws2_32.lib")
#else         //for unix#include <sys/socket.h>
//    #include <sys/types.h>//    #include <sys/signal.h>//    #include <sys/time.h>#include <netinet/in.h>     //socket//    #include <netdb.h>#include <unistd.h>            //gethostname// #include <fcntl.h>#include <arpa/inet.h>#include <string.h>            //memsettypedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
#ifdef M_I386
typedef int socklen_t;
#endif#define BOOL             int
#define INVALID_SOCKET    -1
#define SOCKET_ERROR     -1
#define TRUE             1
#define FALSE             0
#endif        //end #ifdef WIN32static int count111 = 0;
static time_t oldtime = 0, nowtime = 0;#include <list>
#include <cstdlib>
#include <iostream>
#include <stdexcept>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/thread.hpp>const int server_port = 6768;            //服务器启动的端口;
const int server_thread_pool_num = 4;    //服务器启动线程池的线程数;using namespace std;
using boost::asio::ip::tcp;
CRITICAL_SECTION  listLock;
char szBuff[256] = {0} ;int   nConnectCount = 0 ;map<int, int> g_mapThreadId;  //线程ID 映射;bool InsertMapThreadId(int nThreadId)
{map<int, int>::iterator mapThreadIdIt = g_mapThreadId.find(nThreadId);if (mapThreadIdIt == g_mapThreadId.end()){//没有找到插入并返回true;g_mapThreadId.insert( std::make_pair(nThreadId, g_mapThreadId.size()+1) );return true;}else{//已经存在不插入返回falsereturn false;}
}class io_service_pool: public boost::noncopyable
{
public:explicit io_service_pool(std::size_t pool_size): next_io_service_(0){ for (std::size_t i = 0; i < pool_size; ++ i){io_service_sptr io_service(new boost::asio::io_service);work_sptr work(new boost::asio::io_service::work(*io_service));io_services_.push_back(io_service);work_.push_back(work);}}void start(){ for (std::size_t i = 0; i < io_services_.size(); ++ i){boost::shared_ptr<boost::thread> thread(new boost::thread(boost::bind(&boost::asio::io_service::run, io_services_[i])));threads_.push_back(thread);}}void join(){for (std::size_t i = 0; i < threads_.size(); ++ i){threads_[i]->join();} }void stop(){ for (std::size_t i = 0; i < io_services_.size(); ++ i){io_services_[i]->stop();}}boost::asio::io_service& get_io_service(){boost::mutex::scoped_lock lock(mtx);boost::asio::io_service& io_service = *io_services_[next_io_service_];++ next_io_service_;if (next_io_service_ == io_services_.size()){next_io_service_ = 0;}return io_service;}private:typedef boost::shared_ptr<boost::asio::io_service> io_service_sptr;typedef boost::shared_ptr<boost::asio::io_service::work> work_sptr;typedef boost::shared_ptr<boost::thread> thread_sptr;boost::mutex mtx;std::vector<io_service_sptr> io_services_;std::vector<work_sptr> work_;std::vector<thread_sptr> threads_; std::size_t next_io_service_;
};boost::mutex cout_mtx;
int packet_size = 0;
enum {MAX_PACKET_LEN = 4096};class session
{
public:session(boost::asio::io_service& io_service): socket_(io_service), recv_times(0){bDeleteFlag = FALSE ;memset(data_,0x00,sizeof(data_));}virtual ~session(){boost::mutex::scoped_lock lock(cout_mtx);socket_.close() ;nConnectCount -- ;}tcp::socket& socket(){return socket_;}//暂时不需要这个函数inline void requestRead(){socket_.async_read_some(boost::asio::buffer(data_,MAX_PACKET_LEN ),//boost::bind(&session::handle_read, this,boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));}void handle_read(const boost::system::error_code& error, size_t bytes_transferred){if (!error){if(bytes_transferred > 0){sendData(data_,bytes_transferred);}requestRead() ;}else{bDeleteFlag = TRUE;//socket_.close() ;nConnectCount -- ;}}BOOL sendData(char* szData,int nLength){boost::asio::ip::tcp::endpoint  endpoint1 = socket_.remote_endpoint();int nThreadID = ::GetCurrentThreadId();InsertMapThreadId(nThreadID);printf("in    socket:%d  remoteip:%s threadId:%lld 0x:%x theadIdnum:%d ", socket_.remote_endpoint().port(), socket_.remote_endpoint().address().to_string().c_str() , nThreadID, nThreadID) ;printf("threadNum:%d \r\n", g_mapThreadId.size());if(bDeleteFlag || szData == NULL || nLength <= 0 )return FALSE ;boost::asio::async_write(socket_, boost::asio::buffer(szData, nLength),boost::bind(&session::handle_write, this, boost::asio::placeholders::error));return TRUE ;}void handle_write(const boost::system::error_code& error){int nThreadID = ::GetCurrentThreadId();InsertMapThreadId(nThreadID);printf("write socket:%d  remoteip:%s threadId:%lld 0x:%x  ", socket_.remote_endpoint().port(), socket_.remote_endpoint().address().to_string().c_str() , nThreadID, nThreadID) ;printf("threadNum:%d \r\n", g_mapThreadId.size());if (!error){//写入正确}else{bDeleteFlag = TRUE;//socket_.close() ;nConnectCount -- ;}}public:BOOL            bDeleteFlag ;private:tcp::socket     socket_;char            data_[MAX_PACKET_LEN];int             recv_times;
};typedef list<session* >  SessionList ;
SessionList              sessionList ;
class server
{
public:server(short port, int thread_cnt): io_service_pool_(thread_cnt), acceptor_(io_service_pool_.get_io_service(), tcp::endpoint(tcp::v4(), port)){session* new_session = new session(io_service_pool_.get_io_service());acceptor_.async_accept(new_session->socket(),boost::bind(&server::handle_accept, this, new_session, boost::asio::placeholders::error));EnterCriticalSection(&listLock);sessionList.push_back(new_session) ;LeaveCriticalSection(&listLock);   }void handle_accept(session* new_session, const boost::system::error_code& error){if (!error){//new_session->readRequest(Packet_Is_Head,sizeof(PacketHead)); //先请求包头new_session->requestRead() ;nConnectCount ++ ;}else{new_session->bDeleteFlag = TRUE ;}new_session = new session(io_service_pool_.get_io_service());acceptor_.async_accept(new_session->socket(),boost::bind(&server::handle_accept, this, new_session, boost::asio::placeholders::error));EnterCriticalSection(&listLock);sessionList.push_back(new_session) ;LeaveCriticalSection(&listLock);   int nThreadID = ::GetCurrentThreadId();printf("链接数量 %d  threadId:%lld 0x:%x \r\n",nConnectCount,  nThreadID, nThreadID) ;}void run(){io_service_pool_.start();io_service_pool_.join();}private:io_service_pool io_service_pool_;tcp::acceptor acceptor_;
};int main()
{//boostInitializeCriticalSection(&listLock) ;printf("server run! server port :%d thread_poo_num:%d \n", server_port, server_thread_pool_num);//创建线程数量,要先检测CPU线程数量,然后再创建相应的线程数server svr(server_port, server_thread_pool_num);svr.run();while(true){Sleep(1000);}DeleteCriticalSection(&listLock);printf("server end\n ");return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

delphi 的一些备忘

override&#xff1a;覆盖&#xff1b; overload&#xff1a;重载&#xff1b; Reintroduce&#xff1a;重定义&#xff0c;它的引入是为了屏蔽父类的一个虚方法,而在子类中生成一个新的方法; 其实你不使用reintroduce也会覆盖屏蔽父类的方法的但是会产生一个警告&#xff01; …

10.高效分布

ListView默认的分页是先从数据源取得所有数据&#xff0c;然后再截取当前页面的部分&#xff0c;在数据量非常大的情况下效率非常低&#xff0c;因此默认的分布基本不能用。应该是只从数据源取得要显示的数据即可。SQL中语句中取得分页数据的方法为&#xff1a;Select * ,ROW_N…

项目测试~

这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 这个作业要求在哪里 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3340 团队名称 求莫名堂 作业的目标 学会进行项目的测试&#xff0c;并通过测试发…

boost_1_48_0 在VS2008下的安装 Boost.Asio安装

第一步&#xff1a;到官网www.boost.org&#xff0c;下载boost最新版boost_1_48_0.zip第二步&#xff1a;将boost压缩包解压到C盘根目录下(在C盘操作简单&#xff0c;不会出错)&#xff0c;目录为C:\BOOST_1_48_0,里面就是boost的源码和需要编译的文件及文档资料第三步&#xf…

线程----BlockingQueue

import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** 本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西…

D3D9 effect (hlsl)(转)

转:http://blog.csdn.net/leonwei/article/details/8212800 effect其实整合了shader和render state的控制两大部分内容 9.1 effect文件基本框架 part1 &#xff1a;shader state包括全局变量 shader数据结构定义&#xff0c;shader的实现 part2 &#xff1a;texture and sample…

boost_1.47在VS2010下的安装

第一步&#xff1a;到官网www.boost.org&#xff0c;下载boost最新版boost_1_47_0.zip第二步&#xff1a;将boost压缩包解压到C盘根目录下(在C盘操作简单&#xff0c;不会出错)&#xff0c;目录为C:\BOOST_1_47_0,里面就是boost的源码和需要编译的文件及文档资料第三步&#xf…

创建 WPF 不规则窗口

创建 WPF 不规则窗口 本文为khler原作&#xff0c;转载必须确保本文完整并完整保留原作者信息及本文原始链接  E-mail: khler163.com  QQ: 23381103  MSN: pragmachotmail.com   相对于用MFC创建不规则窗口&#xff0c;WPF创建不规则窗体的过程就显得相当享受了&…

公司运作 - 利润率、周转率

公司一般由市场部、研发部、财务部、人力资源部及其他辅助部门组成。分成了几个层面&#xff0c;如下&#xff1a; 宏观层面&#xff1a;业务范围、业务定位、专业化、多元化部门层面&#xff1a;各部门绩效、部门职责主体层面&#xff1a;跨部门事务&#xff0c;如产品研发涉及…

ffmpeg编解码详细过程

1. 注册所有容器格式和CODEC:av_register_all() 2. 打开文件:av_open_input_file() 3. 从文件中提取流信息:av_find_stream_info() 4. 穷举所有的流&#xff0c;查找其中种类为CODEC_TYPE_VIDEO 5. 查找对应的解码器:avcodec_find_decoder() 6. 打开编解码器:avcodec_open() 7.…

使用docker 起容器配置负载均衡(加权)

首先要准备三个nginx的容器&#xff1b; 第二个容器&#xff1a; 第三个容器&#xff1a; 进入第一个容器&#xff08;主容器&#xff09; 要配置的容器&#xff08;docker exec -it 容器id /bin/bash&#xff09; vi/etc/nginx/nginx.conf 修改配置 在http{ }中加入 vi/etc/…

茴香豆的n种写法之②——Sql据多个条件 查询每个条件的前N条记录

----------------------------------- Author: liangCK 小梁-- Title : 查每个分组前N条记录-- Date : 2008-11-13 17:19:23-----------------------------------> 生成测试数据: #TIF OBJECT_ID(tempdb.dbo.#T) IS NOT NULL DROP TABLE #TCREATE TABLE #T (ID VARCHAR(3),G…

PostgreSQL建表动作分析

首先&#xff0c;建立表&#xff1a; pgsql# create table tab10(id integer); CREATE TABLE pgsql# select 147525::regclass;regclass ----------tab10 (1 row)pgsql# 查看此时的文件信息&#xff1a; [pgsqllocalhost 16384]$ pwd /home/pgsql/DemoDir/base/16384[pgsqllo…

http 断点续传,Windows下HTTP方式单线程下载

http 断点续传www.diybl.com 时间 &#xff1a; 2011-05-20 作者&#xff1a;匿名 编辑&#xff1a;hawk 点击&#xff1a; 1128 [ 评论 ]-- 原理&#xff1a; 1. 打开本地文件fopen&#xff0c;移动文件指针到文件尾fseek 2. 获得文件大小ftell, 格式化HTTP请求头 &…

给创业者的30条建议

http://www.cocoachina.com/programmer/20150206/11119.html 去年年底的时候&#xff0c;我&#xff08;Firstround Review 主编&#xff09;在 Facebook 公司的咖啡厅里和 Caryn Marooney 交流着创业公司应该注意些什么事情。Caryn Marooney 现在是 Facebook 公司科技交流部门…

php swoole websocket vue 实现聊天室案例

代码地址: https://github.com/9499574/demo_chat_room 转载于:https://www.cnblogs.com/phper8/p/11017892.html

数据结构 练习21-trie的原理分析和应用

前言 今天具体分析一下trie树&#xff0c;包括&#xff1a;原理分析&#xff0c;应用场合&#xff0c;复杂度分析&#xff0c;与hash的比较&#xff0c;源码展现。大部分内容来自互联网&#xff0c;文中会注明出处。 原理分析 主要是hash树的变种&#xff0c;先看下图&#xff…

在辞职后的旅途中:我写了个App 创立了一家公司

http://www.cocoachina.com/programmer/20150206/11119.html 英文原文&#xff1a;How I built a startup while traveling to 20 countries 一年前&#xff0c;我离开了旧金山&#xff0c;变卖或者送掉了一切我所拥有的东西&#xff0c;然后买了一只 40 升的登山包。 我旅行到…

Android找工作系列之自定义View

...转载于:https://www.cnblogs.com/hbolin/p/11019959.html

POJ 1088-滑雪

矩阵里的数字代表当前点的高度&#xff0c;只能从高的点滑到低的点&#xff0c;求最长能滑的距离。初始点 不规定。我们可以向每个点的四周搜索&#xff0c;能走则就在当前距离加1。并将已经求的值保存在 二维数组中。&#xff08;记忆化搜索&#xff09; /*Accepted 252K …