游戏编程系统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 inwrite 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;
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 : Msg Number (verifications)
wID : 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;
// 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
BOOLRead(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_SECTIONm_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;
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;
intnIndex;
TCHAR szTitle;
TCHAR szLocalIP;
TCHAR szIP;
intnPort;
intnRecvSockBuffer;
intnSendSockBuffer;
intnReadQueueBuffer;
intnSendQueueBuffer;
};
#define FILE_CONNECT L"connect.txt"
class CIOCPNet;
class CMultiToken
{
public:
CMultiToken(){}
~CMultiToken();
BOOL Connect(CIOCPNet* pNet);
void KeepAlive();
intDisConnect(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 何磐 矫累茄促
*/
_SocInfom_SocInfo;
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;
BOOLm_arrSockAlive;
void Stop() {
DWORD dwExit = 5;
TerminateThread(m_hThread,dwExit);}
protected:
CIOCPNet* m_pIOCPNet;
HANDLE m_hThread;
DWORDm_dwThreadID;
intm_iConnCount; //
intm_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狼 静贰靛荐甫 啊咙
DWORDm_dwCurrentTime;
CIOCPToken*m_pToken; // 楷搬窍绊磊 窍绰 辑滚狼 CIOCPToken狼 器牢磐蔼阑 啊咙
CMultiToken* m_pMultiToken; // 楷搬窍绊磊 窍绰 辑滚狼 CMultiToken狼 器牢磐蔼阑 啊咙
HWND m_hParents; // 促捞舅肺弊 HWND
HANDLE m_hThreads; // _xThread狼 静贰靛甫 cpu 俺荐 * 2甫 父惦
HANDLE m_hThreadAccept;
HANDLE m_hIOCP; // iocp勤甸
long m_nPort;
SOCKET m_ListenSoc;// 瘤陛篮 0捞搁 努扼捞攫飘侩 府郊家南1捞搁 辑滚侩 府郊家南
void AnalyizeMsg(UINT iClient,DWORD dwSize);
BOOL m_bPause;
BOOL m_bOperate;
// ::ofstreamm_IOCPclosenumber;
intGetEmptyClient();
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;
};
页:
[1]