当今网络游戏在中国大陆已经在大范围
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026yi.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026yi.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
![](/icons/33026dou2.gif)
网络游戏
![](/icons/33026de.gif)
![](/icons/33026chengxu.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
1.网络通信模块
2.协议模块
3.线程池模块
4.内存管理模块
5.游戏规则处理模块
6.后台游戏仿真世界模块
![](/icons/33026dou2.gif)
现在就网络中
![](/icons/33026de.gif)
![](/icons/33026yi.gif)
![](/icons/33026de.gif)
在网络游戏客户端和服务器端进行交互
![](/icons/33026de.gif)
1. Select模型
2. 事件驱动模型
3. 消息驱动模型
4. 重叠模型
5. 完成端口重叠模型
![](/icons/33026dou2.gif)
在这样
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
对于服务器端完成端口
![](/icons/33026de.gif)
![](/icons/33026yi.gif)
1. 建立服务器端SOCKET套接字描述符
![](/icons/33026dou.gif)
![](/icons/33026yi.gif)
![](/icons/33026dou2.gif)
例如:
SOCKET server_
![](/icons/33026socket.gif)
Server_
![](/icons/33026socket.gif)
![](/icons/33026socket.gif)
2.绑定套接字server_
![](/icons/33026socket.gif)
![](/icons/33026dou2.gif)
Const
![](/icons/33026int.gif)
struct sockaddr_in server_address.
mem
![](/icons/33026set.gif)
![](/icons/33026sizeof.gif)
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(SERV_TCP_PORT);
//绑定
Bind(serve_
![](/icons/33026socket.gif)
![](/icons/33026sizeof.gif)
2. 对于建立
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
Listen(server_
![](/icons/33026socket.gif)
3.
![](/icons/33026chushi.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026yi.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
HANDLE hCompletionPort;
HCompletionPort = CreateIoCompletionPort(NULL,NULL,NULL,0);
4. 在我们已经产生出来新
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
SYSTEM_INFO system_info;
Get
![](/icons/33026System.gif)
在我们知道我们系统
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026yi.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026yi.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
代码:
WORD threadNum = system_info. DwNumberOfProcessors*2+2;
for(
![](/icons/33026int.gif)
![](/icons/33026jiajia.gif)
{
HANDLE hThread;
DWORD dwthreadId;
hThread = _beg
![](/icons/33026int.gif)
CloseHandle(hThread);
}
CloseHandle(hThread)在
![](/icons/33026chengxu.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026dou2.gif)
6. 产生服务器检测客户端连接并且处理线程
![](/icons/33026dou2.gif)
HANDLE hAcceptThread;
DWORD dwThreadId;
hAcceptThread= _beg
![](/icons/33026int.gif)
CloseHandle(hAcceptThread);
7.连接处理线程
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026yi.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
首先我要将如下几个
![](/icons/33026hanshu.gif)
1.
HANDLE CreateIoCompletionPort (
HANDLE FileHandle, // handle to file
HANDLE ExistingCompletionPort, // handle to I/O completion port
ULONG_PTR CompletionKey, // completion key
DWORD NumberOfConcurrentThreads // number of threads to execute concurrently
);
参数1:
可以用来和完成端口联系
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026yi.gif)
套接字
![](/icons/33026dou.gif)
![](/icons/33026dou2.gif)
参数2:
已经存在
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026chushi.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
参数3:
这个参数对于我们来说将非常有用途
![](/icons/33026dou2.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026yi.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
这样
![](/icons/33026de.gif)
![](/icons/33026hanshu.gif)
![](/icons/33026hanshu.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026dou2.gif)
![](/icons/33026yi.gif)
![](/icons/33026dou2.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
参数4:
引用MSDN上
![](/icons/33026de.gif)
[in] Maximum number of threads that the operating system allows to concurrently process I/O completion packets for the I/O completion port. If this parameter is zero, the system allows as many concurrently running threads as there are processors in the system.
这个参数我们在使用中只需要将它
![](/icons/33026chushi.gif)
![](/icons/33026dou2.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
我要向大家介绍
![](/icons/33026de.gif)
![](/icons/33026hanshu.gif)
2.
BOOL GetQueuedCompletionStatus(
HANDLE CompletionPort, // handle to completion port
LPDWORD lpNumberOfBytes, //
![](/icons/33026byte.gif)
PULONG_PTR lpCompletionKey, // file completion key
LPOVERLAPPED *lpOverlapped, // buffer
DWORD dwMilliseconds // optional timeout value
);
参数1:
我们已经在前面产生
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
参数2:
![](/icons/33026yi.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
参数3:
完成端口
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026dou2.gif)
借用MSDN
![](/icons/33026de.gif)
[out] Po
![](/icons/33026int.gif)
![](/icons/33026if.gif)
所以在使用这个
![](/icons/33026hanshu.gif)
![](/icons/33026de.gif)
![](/icons/33026yi.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
参数4:
重叠I/O请求结构
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026yi.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
![](/icons/33026de.gif)
![](/icons/33026chengxu.gif)
![](/icons/33026dou2.gif)
[out] Po
![](/icons/33026int.gif)
![](/icons/33026if.gif)
3.
![](/icons/33026int.gif)
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
这个
![](/icons/33026hanshu.gif)
![](/icons/33026de.gif)
![](/icons/33026hanshu.gif)
![](/icons/33026dou.gif)
![](/icons/33026hanshu.gif)
![](/icons/33026dou.gif)
![](/icons/33026hanshu.gif)
![](/icons/33026dou2.gif)
参数1:
已经和Listen套接字建立连接
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
参数2:
用于接受请求数据
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
[in/out] Po
![](/icons/33026int.gif)
![](/icons/33026int.gif)
![](/icons/33026dou2.gif)
参数3:
参数2所指向
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
[in] Number of WSABUF structures in the lpBuffers
参数4:
[out] Po
![](/icons/33026int.gif)
![](/icons/33026byte.gif)
![](/icons/33026if.gif)
参数5:
[in/out] Po
![](/icons/33026int.gif)
参数6:
这个参数对于我们来说是比较有作用
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026yi.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
参数7:
[in] Po
![](/icons/33026int.gif)
![](/icons/33026socket.gif)
4.
![](/icons/33026int.gif)
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,
DWORD dwFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
参数解释可以参考上面或者MSDN
![](/icons/33026dou2.gif)
![](/icons/33026dou2.gif)
下面就关client端用户连接(connect(……..))请求
![](/icons/33026de.gif)
举例如下:
const
![](/icons/33026int.gif)
typedef struct IO_CS_DATA
{
SOCKET clisnt_s; //客户端SOCKET
WSABUF wsaBuf;
Char inBuffer[BUFFET_SIZE];
Char outBuffer[BUFFER_SIZE];
Int recvLen;
Int sendLen;
SYSTEM_TIME start_time;
SYSTEM_TIME start_time;
}IO_CS_DATA;
UINT WINAPI ServerAcceptThread(LPVOID param)
{
SOCKET client_s;
HANDLE hCompltPort = (HANDLE) param;
struct sockaddr_in client_addr;
![](/icons/33026int.gif)
![](/icons/33026sizeof.gif)
LPHANDLE_DATA hand_Data = NULL;
while(true)
{
If((client_s=accept(server_
![](/icons/33026socket.gif)
![](/icons/33026dd.gif)
{
pr
![](/icons/33026int.gif)
![](/icons/33026kh.gif)
![](/icons/33026kh.gif)
![](/icons/33026return.gif)
}
hand_Data = (LPHANDLE_DATA)malloc(
![](/icons/33026sizeof.gif)
hand_Data->
![](/icons/33026socket.gif)
![](/icons/33026if.gif)
![](/icons/33026dd.gif)
{
pr
![](/icons/33026int.gif)
![](/icons/33026kh.gif)
![](/icons/33026kh.gif)
}
![](/icons/33026else.gif)
{
game_Server->RecvDataRequest(client_s);
}
}
![](/icons/33026return.gif)
}
在这个例子中
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026hanshu.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
有关game_Sever object
![](/icons/33026de.gif)
![](/icons/33026dou2.gif)
![](/icons/33026class.gif)
{
public:
CServerSocket
![](/icons/33026kh.gif)
virtual ~CServerSocket
![](/icons/33026kh.gif)
bool StartUpServer
![](/icons/33026kh.gif)
void StopServer
![](/icons/33026kh.gif)
//发送或者接受数据(重叠请求)
bool RecvDataRequest(SOCKET client_s);
bool SendDataRequest(SOCKET client_s,char *buf,
![](/icons/33026int.gif)
void ControlRecvData(SOCKET client_s,char *buf,
![](/icons/33026int.gif)
void CloseClient(SOCKET client_s);
private:
friend UINT WINAPI GameServerThread(LPVOID completionPortID); //游戏服务器通信工作线程
private:
void Init
![](/icons/33026kh.gif)
void Release
![](/icons/33026kh.gif)
bool InitComplePort
![](/icons/33026kh.gif)
bool InitServer
![](/icons/33026kh.gif)
bool CheckOsVersion
![](/icons/33026kh.gif)
bool StartupWorkThread
![](/icons/33026kh.gif)
bool StartupAcceptThread
![](/icons/33026kh.gif)
private:
enum { SERVER_PORT = 10006};
UINT cpu_Num; //处理器数量
CEvent g_ServerStop; //服务器停止事件
CEvent g_ServerWatch; //服务器监视事件
public:
HANDLE hCompletionPort; //完成端口句柄
};
在上面
![](/icons/33026de.gif)
![](/icons/33026dou.gif)
![](/icons/33026de.gif)
![](/icons/33026socket.gif)
![](/icons/33026dou2.gif)
最新评论