锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
http://m.shnenglu.com/bujiwu/archive/2009/08/23/94199.html
涓昏瀹炵幇浜?jiǎn)浜斿瓙妫嬬殑鐣岄潰涓庝笅妫嬩笟鍔箒绋嬨?br>榪欎簩澶╁疄鐜頒簡(jiǎn)浠ヤ笅璁″垝涓殑絎竴鐐癸紝瀹屾垚浜?jiǎn)缃懢l滃鎴樺姛鑳斤紝騫跺疄鐜頒簡(jiǎn)緗戠粶鎮(zhèn)旀銆?br>錛戙佺綉緇滃鎴樺姛鑳?鍖呮嫭GameClient涓嶨ameServer綾?鍙互浜?jiǎn)瑙ocket緙栫▼)銆?/span>
錛掋佷漢鏈哄鎴樺姛鑳?鐩墠榪樻病鏈夊ソ鐨勬濊礬)銆?
鐢變簬浜斿瓙媯嬫湇鍔$涓庡鎴風(fēng)閫氳姣旇緝綆鍗曪紝鎵浠ュ彧鐢ㄦ渶綆鍗曠殑緗戠粶閫氳妯″紡錛堟病鏈変嬌鐢↖OCP錛夈傚畾涔夌綉緇滈氳鎶借薄鍩虹被CBaseSocket銆?br>
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涓嶤GameServer綾葷戶(hù)鎵緾BaseSocket鍩虹被銆傚茍瀹炵幇bool SendPacket(void* pMsg, int len)
涓?bool Initialize(int Port, char* pAddress)
綰櫄鍑芥暟銆傜敱浜嶤GameClient涓嶤GameServer閮界戶(hù)鎵緾BaseSocket錛屾墍浠ュ彲浠ラ氳繃澶氭佺殑瀹炰緥鍖栧叿浣撶殑瀹㈡埛绔被鎴栨湇鍔$綾匯?
濡備笅錛?br>
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 }
鏈嶅姟绔被褰揳ccept瀹㈡埛绔氨鍘嬪叆鍒皏ector,涓昏鏄負(fù)浜?jiǎn)浠ュ悗鏀寔缃懢l滄ā寮忎笅鍙互瑙傛鐨勫鎴風(fēng)榪炴帴銆?br>
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 };
鍏跺畠?yōu)鏄墦鍖呫佽В鍖呯殑宸ヤ綔浜?jiǎn)銆?br>
浠g爜錛?br>/Files/bujiwu/Gobang.rar
]]>
媯嬬洏絳夌晫闈㈠熀鏈兘鏄竴絎旂瑪鐢誨嚭鏉ョ殑錛屾湁鐨勬槸鍔犺澆鍥劇墖銆傛病鏈変粈涔堟妧鏈惈閲忥紝涓昏鏄瘮杈冪箒鐞?鏉冨綋瀵逛互鍓嶅涔?fàn)鐨刉indows娑堟伅錛岀敾鍥劇瓑鐨勫涔?fàn)銆?br>涓昏鐢ㄥ埌浜?jiǎn)浠ヤ笅鍑犱釜绫诲Q?br>
媯嬪瓙綾?鍖呮嫭媯嬪瓙鐨勯鑹蹭笌媯嬪瓙鏄惁浣胯兘)錛?br>
2 {
3 public:
4 CChessMan()
5 {
6 Reset();
7 }
8
9 void Reset()
10 {
11 Enable = false;
12 Color = BLACK;
13 }
14
15 bool Enable;
16 COLORREF Color;
17 };
媯嬬洏綾?綆$悊鍚勪釜媯嬪瓙錛屽垽鏂槸鍚︿簲瀛愪竴綰跨瓑)錛?br>
2 {
3 public:
4 CTable();
5
6 void ResetTable();
7
8 void SetChessMan(int x, int y);
9 CChessMan GetChessMan(int x, int y) const;
10
11 GAMESTATE GetRunState() const;
12 void SetRunState(GAMESTATE State);
13
14 bool GetLastChessMan(POINT &p) const;
15
16 void RegretLastStep();
17
18 WINNER_SIDE GetWhiteSideWinFlag() const;
19
20 void SetGameMode( GAME_MODE Mode );
21
22 private:
23 bool JudgeWinner(int x, int y) const;
24
25 bool JudgeRowChessMan(int x, int y) const;
26 bool JudgeColumnChessMan(int x, int y) const;
27 bool JudgeLeftChessMan(int x, int y) const;
28 bool JudgeRightChessMan(int x, int y) const;
29
30 bool CalcChessmanNum(CChessMan* pChessMan, int Pos) const;
31
32 void ChangeState();
33
34 private:
35 COLORREF Color; //褰撳墠涓嬫鐨勬瀛愰鑹?/span>
36 GAMESTATE State; //褰撳墠娓告垙鐘舵丷uning,Waiting,GameOver
37
38 CChessMan pChessMan[NumOfLine][NumOfLine]; //鍒濆鍖栨鐩樹(shù)笂鎵鏈夋瀛?/span>
39 stack<POINT> RecordStack; //璁板綍涓嬫杞ㄨ抗錛屼富瑕佷負(fù)鎮(zhèn)旀浣跨敤
40
41 WINNER_SIDE Winner; //鐧芥涓庨粦媯嬪摢鏂硅幏鑳?/span>
42 GAME_MODE Mode; //妯″紡錛岀洰鍓嶈繕鍙敮鎸佹湰鏈烘ā寮忥紝棰勭暀浠ュ悗緗戠粶瀵規(guī)垬鏃朵嬌鐢?/span>
43 };
鍏蜂綋鎬庝箞瀹炵幇錛岃繕鏄湅浠g爜浜?jiǎn)銆傜幆澧?Windows Xp + Visual Studio 2005)
鎴釜鍥撅細(xì)
鐩墠榪樻瘮杈冪矖緋?浠ュ悗浠ヤ笂浜屼釜鍔熻兘瀹屽杽鍚庯紝鍐嶅埛鏂頒笂浼犵殑浠g爜銆傛榪庡ぇ瀹舵彁鍑哄ソ鐨勬剰瑙侊紝TKS!
浜斿瓙媯嬫簮鐮侊細(xì)
http://m.shnenglu.com/Files/bujiwu/ChessMan.rar
]]>
2 #include <stdio.h>
3 #pragma comment(lib,"Ws2_32")
4
5 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
6 {
7 WSADATA ws;
8 SOCKET listenFD;
9 int ret;
10
11 //鍒濆鍖杦sa
12 WSAStartup(MAKEWORD(2,2),&ws);
13 //娉ㄦ剰瑕佺敤WSASocket
14 listenFD = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
15 //鐩戝惉鏈満830绔彛
16 struct sockaddr_in server;
17 server.sin_family = AF_INET;
18 server.sin_port = htons(830);
19 server.sin_addr.s_addr=ADDR_ANY;
20 ret=bind(listenFD,(sockaddr *)&server,sizeof(server));
21 ret=listen(listenFD,2);
22 //濡傛灉瀹㈡埛璇鋒眰830绔彛錛屾帴鍙楄繛鎺?/span>
23 int iAddrSize = sizeof(server);
24 SOCKET clientFD=accept(listenFD,(sockaddr *)&server,&iAddrSize);
25
26 STARTUPINFO si;
27 ZeroMemory(&si,sizeof(si));
28 si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
29 //si.wShowWindow = SW_HIDE;
30
31 si.wShowWindow = SW_SHOWNORMAL;
32 si.hStdInput = si.hStdOutput = si.hStdError = (void *)clientFD;
33 char cmdLine[] = "cmd.exe";
34 PROCESS_INFORMATION ProcessInformation;
35 //寤虹珛榪涚▼
36 ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInformation);
37
38 return 0;
39 }
]]>
瀹㈡埛绔?br> 1銆佸垵濮嬪寲Windows Socket搴撱?br>
2銆佸垱寤篠ocket銆?br> 3銆佽繛鎺ocket銆?br> 4銆佹帴鏀躲佸彂閫佹暟鎹?br>
鏈嶅姟绔瘡鎺ユ敹鍒頒竴涓鎴風(fēng)鐨凷ocket,鍒欏垱寤轟竴涓嚎紼嬨傛弧瓚充竴涓湇鍔$榪炴帴澶氫釜瀹㈡埛绔?br>
2 #include <iostream>
3 #include <Windows.h>
4
5 using namespace std;
6
7 #define PORT 4000
8 #define IP_ADDRESS "192.168.1.145"
9
10 DWORD WINAPI ClientThread(LPVOID lpParameter)
11 {
12 SOCKET CientSocket = (SOCKET)lpParameter;
13 int Ret = 0;
14 char RecvBuffer[MAX_PATH];
15
16 while ( true )
17 {
18 memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
19 Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);
20 if ( Ret == 0 || Ret == SOCKET_ERROR )
21 {
22 cout<<"瀹㈡埛绔鍑?"<<endl;
23 break;
24 }
25 cout<<"鎺ユ敹鍒板鎴蜂俊鎭負(fù):"<<RecvBuffer<<endl;
26 }
27
28 return 0;
29 }
30
31 int main(int argc, char* argv[])
32 {
33 WSADATA Ws;
34 SOCKET ServerSocket, CientSocket;
35 struct sockaddr_in LocalAddr, ClientAddr;
36 int Ret = 0;
37 int AddrLen = 0;
38 HANDLE hThread = NULL;
39
40 //Init Windows Socket
41 if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
42 {
43 cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
44 return -1;
45 }
46
47 //Create Socket
48 ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
49 if ( ServerSocket == INVALID_SOCKET )
50 {
51 cout<<"Create Socket Failed::"<<GetLastError()<<endl;
52 return -1;
53 }
54
55 LocalAddr.sin_family = AF_INET;
56 LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
57 LocalAddr.sin_port = htons(PORT);
58 memset(LocalAddr.sin_zero, 0x00, 8);
59
60 //Bind Socket
61 Ret = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr));
62 if ( Ret != 0 )
63 {
64 cout<<"Bind Socket Failed::"<<GetLastError()<<endl;
65 return -1;
66 }
67
68 Ret = listen(ServerSocket, 10);
69 if ( Ret != 0 )
70 {
71 cout<<"listen Socket Failed::"<<GetLastError()<<endl;
72 return -1;
73 }
74
75 cout<<"鏈嶅姟绔凡緇忓惎鍔?img src="http://m.shnenglu.com/Images/dot.gif">
"<<endl;
76
77 while ( true )
78 {
79 AddrLen = sizeof(ClientAddr);
80 CientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);
81 if ( CientSocket == INVALID_SOCKET )
82 {
83 cout<<"Accept Failed::"<<GetLastError()<<endl;
84 break;
85 }
86
87 cout<<"瀹㈡埛绔繛鎺?:"<<inet_ntoa(ClientAddr.sin_addr)<<":"<<ClientAddr.sin_port<<endl;
88
89 hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CientSocket, 0, NULL);
90 if ( hThread == NULL )
91 {
92 cout<<"Create Thread Failed!"<<endl;
93 break;
94 }
95
96 CloseHandle(hThread);
97 }
98
99 closesocket(ServerSocket);
100 closesocket(CientSocket);
101 WSACleanup();
102
103 return 0;
104 }
2 #include <iostream>
3 #include <Windows.h>
4
5 using namespace std;
6
7 #define PORT 4000
8 #define IP_ADDRESS "192.168.1.145"
9
10
11 int main(int argc, char* argv[])
12 {
13 WSADATA Ws;
14 SOCKET CientSocket;
15 struct sockaddr_in ServerAddr;
16 int Ret = 0;
17 int AddrLen = 0;
18 HANDLE hThread = NULL;
19 char SendBuffer[MAX_PATH];
20
21 //Init Windows Socket
22 if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
23 {
24 cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
25 return -1;
26 }
27
28 //Create Socket
29 CientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
30 if ( CientSocket == INVALID_SOCKET )
31 {
32 cout<<"Create Socket Failed::"<<GetLastError()<<endl;
33 return -1;
34 }
35
36 ServerAddr.sin_family = AF_INET;
37 ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
38 ServerAddr.sin_port = htons(PORT);
39 memset(ServerAddr.sin_zero, 0x00, 8);
40
41 Ret = connect(CientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr));
42 if ( Ret == SOCKET_ERROR )
43 {
44 cout<<"Connect Error::"<<GetLastError()<<endl;
45 return -1;
46 }
47 else
48 {
49 cout<<"榪炴帴鎴愬姛!"<<endl;
50 }
51
52 while ( true )
53 {
54 cin.getline(SendBuffer, sizeof(SendBuffer));
55 Ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
56 if ( Ret == SOCKET_ERROR )
57 {
58 cout<<"Send Info Error::"<<GetLastError()<<endl;
59 break;
60 }
61 }
62
63 closesocket(CientSocket);
64 WSACleanup();
65
66 return 0;
67 }
Windows Socket緙栫▼
]]>
2 #include <stdio.h>
3
4 BYTE arCode[10];
5
6 /*淇濆瓨鍘熷嚱鏁版寚閽?/span>*/
7 void SaveOldFunctionAddress(void* pFuncAddress)
8 {
9 BOOL bRtn =FALSE;
10 SIZE_T cbRead =0;
11
12 HANDLE hProcess =GetCurrentProcess();
13 bRtn =ReadProcessMemory(hProcess, (unsigned long*)(pFuncAddress), arCode, 5, &cbRead);
14 if( !bRtn )
15 {
16 unsigned long err;
17 err =GetLastError();
18 return;
19 }
20
21 return;
22 }
23
24 unsigned int WriteProcessMemExt(HANDLE hProcess, void *pBaseAddress, BYTE ucCmd, unsigned long dwData)
25 {
26 BYTE aBuf[10];
27 BOOL bRtn;
28 unsigned long cbWrite;
29
30 aBuf[0] =ucCmd;
31 aBuf[1] =(BYTE)(dwData & 0xFF);
32 aBuf[2] =(BYTE)( (dwData & 0xFF00)>>8 );
33 aBuf[3] =(BYTE)( (dwData & 0xFF0000)>>16 );
34 aBuf[4] =(BYTE)( (dwData & 0xFF000000)>>24 );
35 //淇敼鍘熷嚱鏁板叆鍙e鎸囦護(hù)錛岀敤涓婇潰鍑嗗鐨勮煩杞寚浠や慨鏀?/span>
36 bRtn =WriteProcessMemory(hProcess, pBaseAddress, aBuf, 5, &cbWrite);
37 if( !bRtn )
38 {
39 unsigned long err;
40 err =GetLastError();
41 printf("%s \r\n", err);
42 }
43
44 return bRtn;
45 }
46
47 BOOL PatchAdd(void* pNewFunc, void* pOldFunc)
48 {
49 HANDLE hProcess =GetCurrentProcess();
50 //璁$畻鍑芥暟鐩稿鍘熷嚱鏁扮殑鍋忕Щ
51 unsigned long ljumpoffset = (unsigned long)pNewFunc - (unsigned long)pOldFunc - 5;
52 BOOL bRtn =WriteProcessMemExt(hProcess, pOldFunc, 0xE9, (unsigned long)ljumpoffset );
53 if( !bRtn )
54 {
55 unsigned long err;
56 err =GetLastError();
57 printf("%s \r\n", err);
58 return FALSE;
59 }
60
61 return TRUE;
62 }
63
64 BOOL PatchDel(void* pOldFunc)
65 {
66 HANDLE hProcess =GetCurrentProcess();
67 BOOL bRtn =WriteProcessMemExt(hProcess, pOldFunc, arCode[0], *(unsigned long*)(arCode+1) );
68 if( !bRtn )
69 {
70 unsigned long err;
71 err =GetLastError();
72 printf("%s \r\n", err);
73 return FALSE;
74 }
75
76 return TRUE;
77 }
78
79 int old_fun(int i)
80 {
81 printf("old function\r\n");
82
83 return 0;
84 }
85
86 int new_fun(int i)
87 {
88 printf("new function\r\n");
89
90 return 0;
91 }
92
93 int main(void)
94 {
95 old_fun(1);
96 //淇濆瓨鍘熷嚱鏁板湴鍧
97 SaveOldFunctionAddress(old_fun);
98 PatchAdd(new_fun,old_fun);
99 old_fun(1);
100 PatchDel(old_fun);
101 old_fun(1);
102
103 return 0;
104 }
105
涓哄嚱鏁版墦琛ヤ竵
]]>
1 #include <iostream>
2 using namespace std;
3
4 void Function(int n)
5 {
6 int Length =n*(n+1)/2;
7
8 int *result =new int[Length];
9 memset(result,0,Length);
10
11 result[0]=1;
12 int number_count =1;
13 int number_carry =0;
14 int number_temp = 0;
15
16 for(int i= 1; i<=n; i++)
17 {
18 for(int j=0;j<number_count; j++)
19 {
20 number_temp =result[j]*i + number_carry;
21 result[j] = number_temp % 10;
22 number_carry = (int)(number_temp/10);
23 }
24 while(number_carry)
25 {
26 result[number_count] =(number_carry % 10);
27 number_carry = (int)(number_carry / 10);
28 number_count++;
29 }
30 }
31
32 for(int i=number_count-1; i>=0;--i)
33 {
34 cout<<result[i];
35 }
36
37 cout<<endl;
38 delete[] result;
39 }
40
41 int main()
42 {
43 unsigned int n;
44 while(cin>>n&&n!=0)
45 {
46 Function(n);
47 }
48
49 return 0;
50 }
]]>