51Testing软件测试论坛

标题: 游戏编程系统4----网络 [打印本页]

作者: 51testing    时间: 2007-11-23 14:50
标题: 游戏编程系统4----网络
做游戏,服务端不用IOCP的是笨蛋,客户端用了IOCP的是笨蛋,除非你告诉我你的客户端不在98上面跑...

关于IOCP网上介绍的太多了,也有实现,都很简单.没有完整可以支撑带运作的.
再来一段韩国代码吧.

---------
从没说过爱着谁
为谁而憔悴
从来没有想过对不对
我的眼中装满疲惫
面对自己总觉得好累

我也需要人来陪
不让我心碎
让我爱到深处不后悔
其实我并不像他们说的
那样多刺难以安慰

爱人的心应该没有罪
为何在夜里却一再流泪
每天抱着寂寞入睡
生活过得没有滋味
----
别问我是谁
请与我相恋
我的真心没人能够体会
像我这样的人不多
为何还要让我难过
----
别问我是谁
请和我面对
看看我的眼角流下的泪
我和你并没有不同
但我的心更容易破碎
--------



/********************************************************************
created: 2006/03/07
created: 7:3:2006   1:52
filename:  d:\myc\GameServer\NetWork\iocpnet.h
file path: d:\myc\GameServer\NetWork
file base: iocpnet
file ext: h
author:  kuchao

purpose: GameServer NetWork define
*********************************************************************/
#pragma once
#include <WinSock2.h>
//#include <atlbase.h>
#include "protocol.h"

struct OVERLAPPED_BASE : public WSAOVERLAPPED
{
OVERLAPPED_BASE()
{
  Internal = 0;
  InternalHigh = 0;
  Offset = 0;
  OffsetHigh = 0;
  hEvent = 0;
  m_iClient = 0;
  m_sEvent = IOCP_EVENT_NONE;
}
USHORT     m_sEvent;     //IOCPs Event
//IOCP_EVENT_NONE        
//IOCP_EVENT_READ
//IOCP_EVENT_WRITE
WORD     m_wID;      //Current ID (optional uses)
//when writing, m_wID is the array number of writing queue
UINT     m_iClient;     //Client array ID
UINT     m_iWritten;    //written size (used in  write process)
};

/************************************************************************************

struct SXClientBuffer

*/
#define XBUFFER_EMPTY  (0)
//for client read & write
struct SXClientBuffer
{
SXClientBuffer() {
  m_dwSize=0;
  m_szBuffer = NULL;
  m_dwTotalBufferSize = 0;
  m_dwSize_Sent = 0;
  m_bIOPending = FALSE;
}
~SXClientBuffer() {
  delete [] m_szBuffer;
}

void DeleteBuffer() {
  if (m_szBuffer != NULL)
   delete [] m_szBuffer;
  m_szBuffer = NULL;
  m_dwSize = 0;
}

void CreateBuffer(int buffersize) {
  if (m_szBuffer == NULL) {
   m_szBuffer = new BYTE[buffersize];
   m_dwTotalBufferSize = buffersize;
   m_bIOPending = FALSE;
  }
}

OVERLAPPED_BASE m_Overlapped;       //overlapped
DWORD   m_dwTotalBufferSize;
DWORD   m_dwSize;        //current size of buffer filled
DWORD   m_dwSize_Sent;
BOOL   m_bIOPending;
BYTE*   m_szBuffer;
};


/****************************************************************************************

struct SIOCPPacketHeader
union _header
wID[0] : Msg Number (verifications)
wID[1] : Msg Count;

dwID   : Unique ID of The message

total of 256 messages for uses


*/
//#define PACKET_HEADER  (0)
//#define PACKET_COUNT  (1)
//union _header
//{
// WORD wID[2];
// DWORD   dwID;
//};
/****************************************************************************************

class CSClient

*/
#define CLIENT_COOL_TIME 5000   //socket cool time (not acceptable in cool time)   
class CXClient
{
public:
CXClient();        //construction
~CXClient();

bool Init(int buffersize,int WritebufferSize); //init buffers
void Close(int closenumber);         //close socket

BOOL  Read(WORD wSize = MAX_ONETIME_RECEIVE_BUFFER);     //set read in queue

SOCKET GetSocket() {return m_Socket;}
UINT   GetClientNumber() {return m_iClient;}

void   SetClientNumber(UINT number) {m_iClient = number;}
void   SetSocket(SOCKET socket) {m_Socket = socket;}
void   SetConnectFlag(BOOL bConn) {m_bConnected = bConn;}
BOOL   IsConnected() {return m_bConnected;}

//write and read operation****************************************************************
int   Write(BYTE* szBuffer,DWORD dwSize,BOOL bExtra = FALSE); //write in queue
void     WriteSocket();            //write into IOCPs
void     WriteFinish(int sent);          //write finished
CRITICAL_SECTION  m_csSWriteflag;
void EnterWriteCS()  {EnterCriticalSection(&m_csSWriteflag);}
void LeaveWriteCS()  {LeaveCriticalSection(&m_csSWriteflag);}

SXClientBuffer*      m_XReceiveBuffer;  //receive buffer
SXClientBuffer*      m_XSendBuffer;   //send buffer
public:

WORD   m_wClientType;

DWORD   m_dwCoolTime;
DWORD   m_dwLastReceviedCount; //latency receive count
DWORD   m_dwLastReceivedTime; //latency
TCHAR   m_szPeerName[25];

DWORD   GetInitCnt() {return m_dwInitCnt;}


int    m_iFakeClient;   //real sock num
bool   m_bFakeConnect;   //real sock connected

protected:
SOCKET   m_Socket;    //socket
UINT   m_iClient;    //Current Client array number
BOOL   m_bConnected;
BOOL   m_bCencelIO;
long   m_lPort;
DWORD   m_dwInitCnt;

};


struct _SocInfo
{
BOOL bListen;
int  nIndex;
TCHAR szTitle[25];
TCHAR szLocalIP[25];
TCHAR szIP[25];
int  nPort;
int  nRecvSockBuffer;
int  nSendSockBuffer;
int  nReadQueueBuffer;
int  nSendQueueBuffer;
};

#define FILE_CONNECT L"connect.txt"
class CIOCPNet;
class CMultiToken
{
public:
CMultiToken(){}
~CMultiToken();

BOOL Connect(CIOCPNet* pNet);
void KeepAlive();
int  DisConnect(int nClient);
void SendReady(int iClient,int nServer,BOOL bSend = FALSE);
BOOL Analize_ConnectData();
virtual void OnConnected(int /*iClient*/, int /*nServer*/) {}
virtual void OnDisConnected(int /*iClient*/, int /*nServer*/) {}
void Connected(int iClient, int nServer);
void DisConnected(int iClient, int nServer);

int GetServerNum() {return m_nServer;}
int GetTotalServerCount() {return m_nSocInfoCount;}


//CXCLIENT 鉴辑
/*
Listen SocInfo 1锅何磐 俊 蝶扼 1何磐 矫累茄促
Listen SocInfo 饶何磐 Connect 鉴辑俊 蝶扼 1何磐 矫累茄促
Listen SocInfo 0 篮 蜡历侩烙栏肺 BRAVO_MAX_MULTI_SERVER 何磐 矫累茄促
*/
_SocInfo  m_SocInfo[SOCKET_MAX_LISTEN];

int   m_nConnectSocketCount;
int   m_nListenSocketCount;
int   m_nSocInfoCount;

int   m_nFirstlistencount;
int   GetFirstConnet();

int   m_nZoneservercount;
int   m_nGatewaycount;
int   m_nStartGateway;

int   m_nExceptLiveserver;

TCHAR m_chCaptionName[20];

BOOL  m_arrSockAlive[SOCKET_MAX_LISTEN];
void Stop() {
  DWORD dwExit = 5;
  TerminateThread(m_hThread,dwExit);}
protected:

CIOCPNet* m_pIOCPNet;         
HANDLE m_hThread;      
DWORD  m_dwThreadID;      

int  m_iConnCount;        //
int  m_nServer;               //郴 辑滚锅龋
};


class CIOCPToken
{
public:
CIOCPToken() {}
~CIOCPToken() {}
void Connected(int iClient);
void DisConnected(int iClient);

protected:

virtual void OnConnected(int /*iClient*/)  {}
virtual void OnDisconnected(int /*iClient*/) {}
};


/*

CIOCPNet

Windows MMORPG server engine using Windows IOCPs

*/
class CIOCPNet
{
public:
//const & dist
CIOCPNet();
~CIOCPNet();

bool Init(CIOCPToken* pToken, CMultiToken* pMultiToken = NULL);
bool StartUp();
BOOL    Process();
BOOL Accept();
BOOL Accept(SOCKET listen,int nNum,int nRecvSockBuffer,int nSendSockBuffer, int nReadQueueBuffer,int nSendQueueBuffe);
void CloseClient(int iClient);
int     Connect(TCHAR* szPeerName, long port,int nClient ,TCHAR* szLocalIP ,int SocReadBuffer,int SocWriteBuffer
  ,int ReadQueueBuffer,int SendQueueBuffer);
DWORD   GetMsgSize(_header Header,UINT iClient);
void GetStatus(SYSTEM_INFO* info,int* iThreads,int* iClients)
{
  *info  = m_SysInfo;
  *iThreads   = m_iThreads;
  *iClients = m_iClients;
}
BOOL   InitListen(long port,WORD listen,TCHAR* LocalIP=NULL);

int    GetClientCount() {return m_iClients;}
void   GetLocalName(TCHAR* addr = NULL);
// gr 6_28
CMultiToken* GetMultiToken() {return m_pMultiToken;}   // 楷搬窍绊磊 窍绰 辑滚狼 CMultiToken狼 器牢磐蔼阑 啊咙
BOOL SockOptionSet(SOCKET soc,int nNum,int nRecvSockBuffer,int nSendSockBuffer);

protected:
int   m_iClients;     //client counts

SYSTEM_INFO m_SysInfo;

int   m_iThreads;     // 醚 _xThread狼 静贰靛荐甫 啊咙
DWORD  m_dwCurrentTime;

CIOCPToken*  m_pToken;        // 楷搬窍绊磊 窍绰 辑滚狼 CIOCPToken狼 器牢磐蔼阑 啊咙
CMultiToken* m_pMultiToken;   // 楷搬窍绊磊 窍绰 辑滚狼 CMultiToken狼 器牢磐蔼阑 啊咙

HWND   m_hParents;        // 促捞舅肺弊 HWND
HANDLE m_hThreads[IOCP_THREADS_PER_CPU];   // _xThread狼 静贰靛甫 cpu 俺荐 * 2甫 父惦
HANDLE m_hThreadAccept;
HANDLE m_hIOCP;        // iocp勤甸
long   m_nPort;      
SOCKET m_ListenSoc[SOCKET_MAX_LISTEN];  // 瘤陛篮 0捞搁 努扼捞攫飘侩 府郊家南  1捞搁 辑滚侩 府郊家南

void   AnalyizeMsg(UINT iClient,DWORD dwSize);
BOOL   m_bPause;
BOOL   m_bOperate;
// :fstream  m_IOCPclosenumber;

int  GetEmptyClient();

public:
void Stop();
void EnterCriticalListen(){EnterCriticalSection(&m_ListenFlag);}
void LeaveCriticalListen(){LeaveCriticalSection(&m_ListenFlag);}
void EnterCriticalSListen(){EnterCriticalSection(&m_ListenFlag_Server);}
void LeaveCriticalSListen(){LeaveCriticalSection(&m_ListenFlag_Server);}
CRITICAL_SECTION m_ListenFlag;
CRITICAL_SECTION m_ListenFlag_Server;
};





欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2