一个简单的高并发的回应服务器,主要是使用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;
}

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

  1. 一个简单的socket套接字服务器,Python

    (1)用Python实现一个简单的套接字socket服务器例子,该服务器在接受客户端连接后,每隔一秒从a到z的字符中随机选一个发送给客户端. import socketserver import ti ...

  2. LIBUV学习笔记(三)libuv中pipe/tty相关操作以及一个简单的unix域回射服务器/客户端例子...

    uv_pipe_t - Pipe handle Pipe handles provide an abstraction over local domain sockets on Unix and na ...

  3. Java写一个简单的静态文件的HTTP服务器(基于Socket)

    ** 一.实现思路 ** 1.使用 ServerSocket 监听某一端口,然后等待连接获取 Socket对象. 2.创建一个类 HttpServer 继承 java.lang.Thread 类,重写 ...

  4. 性能测试并发数以及服务器,怎么测试服务器并发数

    怎么测试服务器并发数 内容精选 换一换 使用Benchmark工具测试MySQL并发100个进程的性能数据.cd /home/ BenchMarkSQL/run 怎么测试服务器并发数 相关内容 云硬盘 ...

  5. 从简单到高并发服务器(一)

    一个单线程的回声服务器 (Echo Server) 我们从一个简单的服务器开始说起. 它可以接受一个客户的连接,接收消息,然后把这个消息发送回去,关闭连接--完工.我们用 Linux 和 iOS / ...

  6. 聊聊高并发(十六)实现一个简单的可重入锁

    可重入锁指的是假设一个线程已经获得了一个锁,那么它能够多次进入这个锁,当然前提是线程须要先获得这个锁. 可重入锁是最常使用的锁.Java的内置锁就是可重入锁,使用synchronizedkeyword ...

  7. java 多进程写一个文件_java高并发多线程及多进程同时写入文件研究

    测试&思考: 环境:windows 七.linux centos 6.三.java8html java多线程同时写一个文件 java高并发环境下多线程同时写入一个文件时, 经过 FileLoc ...

  8. 500并发 一台服务器的性能_面试官绝杀:系统是如何支撑高并发的?

    作者 | 中华石杉 责编 | 伍杏玲 本文经授权转载石杉的架构笔记(ID:shishan100) 很多人面试的时候被问到一个让人特别手足无措的问题:你的系统如何支撑高并发? 大多数同学被问到这个问题压 ...

  9. TCP高并发数据转接服务器(Ntrip Caster)

    TCP高并发数据转接服务器(Ntrip Caster) 说到NTRIP Caster, 咱们需要首先链接一下什么是Ntrip协议由于这不是本博客的重点,故只做如下简单介绍,,大家可以通过如下链接对nt ...

最新文章

  1. 联合索引会创建几个索引_面试官:谈谈你对mysql联合索引的认识?
  2. c#学习体会:使用 ref 和 out 传递数组
  3. js text 和 html,JS DOM innerText和textContent的区别
  4. 1.3编程基础之算术表达式与顺序执行 05 计算分数的浮点数值
  5. PHP实时生成并下载超大数据量的EXCEL文件 1
  6. python setup.py build_打包Python项目为rpm时遇到python setup.py build报错的问题
  7. 1003 C语言输入以某个特殊输入为结束标志
  8. android fragment传递参数_fragment之间传值的两种方法
  9. 【渝粤教育】国家开放大学2019年春季 2083信息技术与教育技术(2) 参考试题
  10. Jquery中拿到相同的对应的所有的标签
  11. 批量网刻安装操作系统之PXE网络克隆图文教程
  12. 安装CloudReady,体验Chrome OS
  13. java JDBC编程
  14. xxl-job分布式任务调度的使用
  15. 为什么贝叶斯统计如此重要?
  16. 基于EEG-EMG混合控制方法的研究—生物机器人应用:现状、挑战与未来方向(三)
  17. Could not start on port 1099 3837
  18. python xmxl 无法启动_auto-pypi-一个Python命令行工具,用于自动设置包并将其上载到PyPi。-Sen LEI Use As A Command Line Tool...
  19. Java面试宝典_君哥讲解笔记04_java基础面试题——String s=new String(“xyz“);创建了几个String Object、equals和hashCode、hashCode(
  20. [matlabpython]01——sort排序的相关内容

热门文章

  1. linux的apache2.4限定某个目录禁止解析PHP及user_agent与PHP相关配置
  2. Page.FindControl方法找不到指定控件的原因
  3. JavaScript服务器端开发技术(对象属性的枚举与查询)
  4. HaProxy+Keepalived+Mycat高可用群集配置
  5. struts2学习(3)struts2核心知识II
  6. SharePoint 2013 Nintex Workflow 工作流帮助(六)
  7. Matrix Computations 1
  8. iOS中有两种支持机制:Notification和KVO(Key-Value Observing)
  9. Python 模块之科学计算 Pandas
  10. python实例化对象做实参_如何在Python中记住类实例化?