转载请注明出处!
上篇五子棋<一>
http://www.cppblog.com/bujiwu/archive/2009/08/23/94199.html主要实现了五子棋的界面与下棋业务流程。
这二天实现了以下计划中的第一点,完成了网络对战功能,并实现了网络悔棋。
1、网络对战功能(包括GameClient与GameServer类,可以了解Socket编程)。2、人机对战功能(目前还没有好的思路)。
由于五子棋服务端与客户端通讯比较简单,所以只用最简单的网络通讯模式(没有使用IOCP)。定义网络通讯抽象基类CBaseSocket。
1 typedef void (* RECVFUNC)(char *pMsg, int len);
2
3 class CBaseSocket
4 {
5 public:
6 CBaseSocket();
7 virtual ~CBaseSocket();
8
9 virtual bool SendPacket(void* pMsg, int len) = 0;
10 virtual bool Initialize(int Port, char* pAddress) = 0;
11
12 protected:
13 bool InitWinSock();
14
15 protected:
16 SOCKET hSocket;
17 static RECVFUNC pRecv;
18 };
客户端类CGameClient与CGameServer类继承CBaseSocket基类。并实现bool SendPacket(void* pMsg, int len)
与 bool Initialize(int Port, char* pAddress)
纯虚函数。由于CGameClient与CGameServer都继承CBaseSocket,所以可以通过多态的实例化具体的客户端类或服务端类。
如下:
1 定义:
2 CBaseSocket *pSocket = NULL;
3
4 if(IsDlgButtonChecked(hDlg, IDC_RADI_HOST))
5 {
6 pSocket = new CGameServer(RecvPktCallBack);
7 gMode = SERVER_MODE;
8 EnableWindow( GetDlgItem(hDlg, IDOK), FALSE);
9 }
10 else
11 {
12 pSocket = new CGameClient(RecvPktCallBack);
13 gMode = CLIENT_MODE;
14 GetDlgItemText(hDlg, IDC_EDIT_IP, pAddress, sizeof(pAddress) );
15 }
服务端类当accept客户端就压入到vector,主要是为了以后支持网络模式下可以观棋的客户端连接。
1 class CGameServer:public CBaseSocket
2 {
3 public:
4 CGameServer(RECVFUNC pRecv);
5 ~CGameServer();
6
7 bool SendPacket(void* pMsg, int len);
8 bool Initialize(int Port, char* pAddress);
9
10 private:
11 static DWORD WINAPI RecvThread(LPVOID lpPara);
12 static DWORD WINAPI AcceptThread(LPVOID lpPara);
13
14 private:
15 static vector<SOCKET> ClientVec;
16 };
其它就是打包、解包的工作了。
代码:
/Files/bujiwu/Gobang.rar