背景简介:
基于TCP协议的应用网络服务器程序开发一般对吞吐量和实时性有较高的要求,早期的Linux下实现一般采用I/O多路复用技术,比如使用select,aio等等。为了满足日益高涨的网络应用需求,Linux 自从2.6内核版本后实现了一种性能更高的I/O多路复用技术-EPOLL,与传统的POLL技术不同的是:使用接口API更简单(总共就三个函数),可控制的并发数更大(取决于可用的内存),稳定性更强(异步I/O,伸缩灵活)。
开发环境:
开发平台:云服务器 CentOS 7.3 64bit, 2核CPU,4G内存
编译器: gcc
设计目标:
实现并发10240个客户端连接交互业务数据
实现WEBSOCKET协议(我的项目中服务对象是微信小程序的websocket客户端)
核心代码:
Server.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <errno.h>
#include "ace/Task.h"
#include "ace/Synch.h"
#include "MLog.h"
#include "WebSocketManager.h"
#define MAX_EPOLL_EVENT 1024
class CWebSocketServer : public ACE_Task<ACE_MT_SYNCH>
{
public:
CWebSocketServer(unsigned short wServerPort, CMLog & mLog, CClientManager & clientMgr, CLoginServer & loginServer);
virtual ~CWebSocketServer();
bool Start();
void Stop();
protected:
virtual int open();
virtual int svc();
int SetNonBlock(int nFd);
bool OnNewConnection(int nNewSocket);
void OnCloseConnection(int nFd);
bool OnDataReceived(int nFd, const char * pszDataRecved, size_t nLen);
protected:
unsigned short m_wServerPort;
int m_nServerSocket;
int m_nEpollFd;
struct epoll_event * m_pEpollEvents;
//pthread_t m_thrIdServer;
bool m_bQuit;
CMLog & m_mLog;