锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
鍛戒護琛?/MT 鎴?
榪欓噷鎸囧畾鑷畾涔夊叆鍙e嚱鏁板悕 鍛戒護琛?/entry:Start 鎴?img height=420 alt="" src="http://m.shnenglu.com/images/cppblog_com/eday/2991/o_vc8link.JPG" width=659 border=0>
//Win32鎺у埗鍙扮▼搴?br>//----------------------------------------------
//stdafx.h file
//----------------------------------------------
#pragma once
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#include <Windows.h>
//----------------------------------------------
//console.cpp
//----------------------------------------------
//Windows紼嬪簭
//----------------------------------------------------
//stdafx.h
//----------------------------------------------------
#ifndef WINVER
#define WINVER 0x0501
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#ifndef _WIN32_WINDOWS
#define _WIN32_WINDOWS 0x0410
#endif
#ifndef _WIN32_IE
#define _WIN32_IE 0x0600
#endif
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
//----------------------------------------------------
// winapp.cpp
//----------------------------------------------------
鍏堟潵璋堣皥闂儊浜х敓鐨勫師鍥?/p>
鍘熷洜涓錛?br />濡傛灉鐔熸倝鏄懼崱鍘熺悊鐨勮瘽錛岃皟鐢℅DI鍑芥暟鍚戝睆騫曡緭鍑虹殑鏃跺欏茍涓嶆槸绔嬪埢灝辨樉紺哄湪灞忓箷
涓婂彧鏄啓鍒頒簡鏄懼瓨閲岋紝鑰屾樉鍗℃瘡闅斾竴孌墊椂闂存妸鏄懼瓨鐨勫唴瀹硅緭鍑哄埌灞忓箷涓婏紝榪欏氨鏄埛鏂板懆鏈熴?/p>
涓鑸樉鍗$殑鍒鋒柊鍛ㄦ湡鏄?1/80縐掑乏鍙籌紝鍏蜂綋鏁板瓧鍙互鑷繁璁劇疆鐨勩?/p>
榪欐牱闂灝辨潵浜嗭紝涓鑸敾鍥鵑兘鏄厛鐢昏儗鏅壊錛岀劧鍚庡啀鎶婂唴瀹圭敾涓婂幓錛屽鏋滆繖涓ゆ鎿嶄綔涓嶅湪鍚屼竴涓?br />鍒鋒柊鍛ㄦ湡鍐呭畬鎴愶紝閭d箞緇欎漢鐨勮瑙夋劅鍙楀氨鏄紝鍏堢湅鍒板彧鏈夎儗鏅壊鐨勫浘鍍忥紝鐒跺悗鐪嬪埌鐢諱笂鍐呭鐨勫浘鍍忥紝
榪欐牱灝變細鎰熻闂儊浜嗐?/p>
瑙e喅鏂規硶錛氬敖閲忓揩鐨勮緭鍑哄浘鍍忥紝浣胯緭鍑哄湪涓涓埛鏂板懆鏈熷唴瀹屾垚錛屽鏋滆緭鍑哄唴瀹瑰緢澶氭瘮杈冩參錛岄偅涔堥噰鐢?br />鍐呭瓨緙撳啿鐨勬柟娉曪紝鍏堟妸瑕佽緭鍑虹殑鍐呭鍦ㄥ唴瀛樺噯澶囧ソ錛岀劧鍚庝竴嬈¤緭鍑哄埌鏄懼瓨銆傝鐭ラ亾涓嬈PI璋冪敤涓鑸彲浠?br />鍦ㄤ竴涓埛鏂板懆鏈熷唴瀹屾垚銆?/p>
瀵逛簬GDI錛岀敤鍒涘緩鍐呭瓨DC鐨勬柟娉曞氨鍙互浜?/p>
鍘熷洜浜岋細
澶嶆潅鐨勭晫闈㈡湁澶氬眰紿楀彛緇勬垚錛屽綋windows鍦ㄧ獥鍙f敼鍙樺ぇ灝忕殑鏃跺欐槸鍏堥噸鐢葷埗紿楀彛錛岀劧鍚庨噸鐢誨瓙紿楀彛錛屽瓙鐖?br />紿楀彛閲嶇敾鐨勮繃紼嬩竴鑸棤娉曞湪涓涓埛鏂板懆鏈熷唴瀹屾垚錛屾墍浠ヤ細鍛堢幇闂儊銆?/p>
鎴戜滑鐭ラ亾鐖剁獥鍙d笂琚瓙紿楀彛鎸′綇鐨勯儴鍒嗗叾瀹炴病蹇呰閲嶇敾鐨?/p>
瑙e喅鏂規硶錛氱粰紿楀彛鍔犱釜椋庢牸 WS_CLIPCHILDREN ,榪欐牱鐖剁獥鍙d笂琚瓙紿楀彛鎸′綇鐨勯儴鍒嗗氨涓嶄細閲嶇敾浜嗐?/p>
濡傛灉鍚岀駭紿楀彛涔嬮棿鏈夐噸鍙狅紝閭d箞闇瑕佸啀鍔犱笂 WS_CLIPSIBLINGS 椋庢牸
鍘熷洜涓夛細
鏈夋椂鍊欓渶瑕佸湪紿楀彛涓婁嬌鐢ㄤ竴浜涙帶浠訛紝姣斿IE錛屽綋浣犵殑紿楀彛鏀瑰彉澶у皬鐨勬椂鍊橧E浼氶棯鐑侊紝鍗充嬌浣犳湁浜哤S_CLIPCHILDREN
涔熸病鐢ㄣ傚師鍥犲湪浜庣獥鍙g殑綾婚鏍兼湁CS_HREDRAW 鎴栬?CS_VREDRAW錛岃繖涓や釜椋庢牸琛ㄧず紿楀彛鍦ㄥ搴︽垨鑰呴珮搴﹀彉鍖栫殑鏃跺?br />閲嶇敾錛屼絾鏄繖鏍峰氨浼氬紩璧稩E闂儊
瑙e喅鏂規硶錛氭敞鍐岀獥鍙g被鐨勬椂鍊欎笉瑕佷嬌鐢ㄨ繖涓や釜椋庢牸錛屽鏋滅獥鍙i渶瑕佸湪鏀瑰彉澶у皬鐨勬椂鍊欓噸鐢伙紝閭d箞鍙互鍦╓M_SIZE鐨勬椂鍊?br />璋冪敤RedrawWindow銆?/p>
鍘熷洜鍥涳細
鐣岄潰涓婄獥鍙e緢澶氾紝鑰屼笖鏀瑰彉澶у皬鏃跺緢澶氱獥鍙i兘瑕佺Щ鍔ㄥ拰鏀瑰彉澶у皬錛屽鏋滀嬌鐢∕oveWindow鎴栬匰etWindowPos涓や釜API鏉?br />鏀瑰彉紿楀彛鐨勫ぇ灝忓拰浣嶇疆錛岀敱浜庝粬浠槸絳夊緟紿楀彛閲嶇敾瀹屾垚鍚庢墠榪斿洖錛屾墍浠ヨ繃紼嬪緢鎱紝榪欐牱瑙嗚鏁堟灉灝卞彲鑳戒細闂儊銆?/p>
瑙e喅鏂規硶錛?/p>
浣跨敤浠ヤ笅API鏉ュ鐞嗙獥鍙gЩ鍔紝BeginDeferWindowPos, DeferWindowPos錛孍ndDeferWindowPos
鍏堣皟鐢?BeginDeferWindowPos 璁懼畾闇瑕佺Щ鍔ㄧ殑紿楀彛鐨勪釜鏁?br />浣跨敤DeferWindowPos錛屾潵縐誨姩紿楀彛錛岃繖涓狝PI騫朵笉鐪熺殑閫犳垚紿楀彛縐誨姩
EndDeferWindowPos 涓嬈℃у畬鎴愭墍鏈夌獥鍙g殑澶у皬鍜屼綅緗殑鏀瑰彉銆?/p>
鏈変釜鍦版柟瑕佺壒鍒敞鎰忥紝瑕佷粩緇嗚綆楁竻妤氳縐誨姩澶氬皯涓獥鍙o紝BeginDeferWindowPos璁懼畾
鐨勪釜鏁頒竴瀹氳鍜屽疄闄呯殑涓暟涓鑷達紝鍚﹀垯鍦╓in9x涓嬶紝濡傛灉瀹為檯縐誨姩鐨勭獥鍙f暟澶氫簬璋冪敤BeginDeferWindowPos
鏃惰瀹氱殑涓暟錛屽彲鑳戒細閫犳垚緋葷粺宕╂簝銆傚湪Windows NT緋誨垪涓嬩笉浼氭湁榪欐牱鐨勯棶棰樸?/p>
濡傛灉浣犲湪灞炴ч噷璁劇疆浜?鎷栧姩紿楀彛鏄劇ず紿楀彛鍐呭鐨勮瘽錛屽睆騫曠湅璧鋒潵浼氶棯璁稿銆備綘鍙互閫氳繃api SystemParameters錛堬級 錛屾妸瀹冨幓鎺夊湪浣犵殑搴旂敤紼嬪簭閲屻傝繖鏍峰湪鐢ㄦ埛鐪嬫潵浼氬ソ涓鐐廣傝繖鍙槸鎴戜釜浜哄緩璁?/p>
----------------------------
聽聽聽聽聽聽聽 1銆佸皢Invalidate()鏇挎崲涓篒nvalidateRect()
銆銆Invalidate()浼氬鑷存暣涓獥鍙g殑鍥捐薄閲嶇敾錛岄渶瑕佺殑鏃墮棿姣旇緝闀匡紝鑰孖nvalidateRect()浠呬粎閲嶇敾Rect鍖哄煙鍐呯殑鍐呭錛屾墍浠ユ墍闇鏃墮棿浼氬皯涓浜涖傝櫕铏互鍓嶅緢鎳掞紝緇忓父涓轟竴灝忓潡鍖哄煙鐨勯噸鐢誨氨璋冪敤Invalidate()錛屼笉鎰挎剰鑷繁鍘昏綆楅渶瑕侀噸鐢葷殑Rect錛屼絾鏄簨瀹炴槸錛屽鏋滀綘紜疄闇瑕佹敼鍠勯棯鐑佺殑鎯呭喌錛岃綆椾竴涓猂ect鎵鐢ㄧ殑鏃墮棿姣旇搗閲嶇敾閭d簺涓嶉渶瑕侀噸鐢葷殑鍐呭鎵闇瑕佺殑鏃墮棿瑕佸皯寰楀銆?
銆銆2銆佺姝㈢郴緇熸惤闄や綘鐨勭獥鍙?br />
銆銆緋葷粺鍦ㄩ渶瑕侀噸鐢葷獥鍙g殑鏃跺欎細甯綘鐢ㄦ寚瀹氱殑鑳屾櫙鑹叉潵鎼介櫎紿楀彛銆傚彲鏄紝涔熻闇瑕侀噸鐢葷殑鍖哄煙涔熻闈炲父灝忋傛垨鑰咃紝鍦ㄤ綘閲嶇敾榪欎簺涓滆タ涔嬮棿榪樿緇忚繃澶ч噺鐨勮綆楁墠鑳藉紑濮嬨傝繖涓椂鍊欎綘鍙互紱佹緋葷粺鎼芥帀鍘熸潵鐨勫浘璞°傜洿鍒頒綘宸茬粡璁$畻濂戒簡鎵鏈夌殑鏁版嵁錛岃嚜宸辨妸閭d簺闇瑕佹惤鎺夌殑閮ㄥ垎鐢ㄨ儗鏅壊瑕嗙洊鎺夛紙濡傦細dc.FillRect(rect,&brush);rect鏄渶瑕佹惤闄ょ殑鍖哄煙錛宐rush鏄甫鑳屾櫙鑹茬殑鍒峰瓙錛夛紝鍐嶇敾涓婃柊鐨勫浘褰€傝紱佹緋葷粺鎼介櫎浣犵殑紿楀彛錛屽彲浠ラ噸杞絆nEraseBkgnd()鍑芥暟錛岃鍏剁洿鎺ヨ繑鍥瀙UE灝卞彲浠ヤ簡銆傚
| BOOL CMyWin::OnEraseBkgnd(CDC* pDC) { 銆return pUE; 銆//return CWnd::OnEraseBkgnd(pDC);//鎶婄郴緇熷師鏉ョ殑榪欐潯璇彞娉ㄩ噴鎺夈? } |
| GetClientRect(rectClient); rgn1.CreateRectRgnIndirect(rectClient); rgn2.CreateRectRgnIndirect(m_rectEdit); if(rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR) == ERROR)//澶勭悊鍚庣殑rgn1鍙寘鎷簡Edit妗嗕箣澶栫殑瀹㈡埛鍖哄煙錛岃繖鏍鳳紝Edit灝嗕笉浼氳鎴戠殑鑳屾櫙瑕嗙洊鑰屽鑷撮噸鐢匯? { 銆ASSERT(FALSE); 銆return ; } brush.CreateSolidBrush(m_clrBackgnd); pDC->FillRgn(&rgn1,&brush); brush.DeleteObject(); |
| void CMyWin::OnPaint() { 銆CPaintDC dc1(this); // device context for painting 銆dcMemory.CreateCompatibleDC(&dc1); 銆CBitmap bmp;//榪欓噷鐨凚itmap鏄繀欏葷殑錛屽惁鍒欏綋蹇冨紕鍑轟竴涓ぇ榛戝潡鍝︺? 銆bmp.CreateCompatibleBitmap(&dc1,rectClient.Width(),rectClient.Height()); 銆dcMemory.SelectObject(&bmp); 銆//鎺ヤ笅鏉ヤ綘鎯蟲庝箞鐢誨氨鎬庝箞鐢誨惂銆? 銆//dcMemory.FillRect(rectClient,&brush); 銆dc1.BitBlt(0,0,rectClient.Width(),rectClient.Height(),&dcMemory,0,0,SRCCOPY); 銆dcMemory.DeleteDC(); 銆// Do not call CWnd::OnPaint() for painting messages } |
/************************************************************************/ // Marco parameter 'noEraseRect' specifies a screen coordinates based RECT, // Marco parameter 'pDC' is a kind of (CDC *) type. |
| BOOL CMyWnd::OnEraseBkgnd(CDC* pDC) { 銆ERASE_BKGND_BEGIN; 銆ADD_NOERASE_RGN(IDC_BUTTON2); 銆ADD_NOERASE_RGN(IDC_BUTTON1); 銆ADD_NOERASE_RGN(IDC_LIST_STAT); 銆ERASE_BKGND_END(pDC, GetSysColor(COLOR_3DFACE)); 銆return false; } |
| /* * No further full-erasing is required, * to prevent screen flashing caused by background erase and view repaint. * Only erase the blank area. */ BOOL CExListCtrl::OnEraseBkgnd(CDC* pDC) { 銆//compute the holding-data-items area of this list control CRect rect; 銆CPoint dataRgnTopLeftPoint; 銆CPoint dataRgnBottomRightPoint; 銆GetItemPosition(0 , &dataRgnTopLeftPoint); 銆GetItemPosition(GetItemCount() , &dataRgnBottomRightPoint); 銆if(!GetHeaderCtrl()->GetItemRect(GetHeaderCtrl()->GetItemCount()-1, rect)) return 銆CListCtrl::OnEraseBkgnd(pDC); 銆dataRgnBottomRightPoint.x = rect.right; 銆rect.SetRect(dataRgnTopLeftPoint, (CPoint)(dataRgnBottomRightPoint - CPoint(2,2))); 銆ClientToScreen(dataRgnRect); 銆//compute and erase the blank area. Using the Marco. ERASE_BKGND_BEGIN; 銆ADD_NOERASE_RECT(dataRgnRect); 銆ERASE_BKGND_END(pDC, GetBkColor()); 銆return false; } |
鍏蜂綋鏉ヨ錛屾垜浠皢閫氳繃IMAGE_IMPORT_DESCRIPTOR鏁扮粍鏉ヨ闂?idata鈥濇涓紩鍏ョ殑DLL鐨勪俊鎭紝鐒跺悗閫氳繃IMAGE_THUNK_DATA鏁扮粍鏉ラ拡瀵逛竴涓寮曞叆鐨凞LL璁塊棶璇LL涓寮曞叆鐨勬瘡涓嚱鏁扮殑淇℃伅錛屾壘鍒版垜浠渶瑕佹埅鑾風殑鍑芥暟鐨勮煩杞湴鍧錛岀劧鍚庢敼鎴愭垜浠嚜宸辯殑鍑芥暟鐨勫湴鍧鈥︹﹀叿浣撶殑鍋氭硶鍦ㄥ悗闈㈢殑鍏抽敭浠g爜涓細鏈夎緇嗙殑璁茶В銆?br />聽聽 璁蹭簡榪欎箞澶氬師鐞嗭紝鐜板湪璁╂垜浠洖鍒扳滈紶鏍囧睆騫曞彇璇嶁濈殑涓撻涓婃潵銆傞櫎浜咥PI鍑芥暟鐨勬埅鑾鳳紝瑕佸疄鐜扳滈紶鏍囧睆騫曞彇璇嶁濓紝榪橀渶瑕佸仛涓浜涘叾瀹冪殑宸ヤ綔錛岀畝鍗曠殑璇存潵錛屽彲浠ユ妸涓涓畬鏁寸殑鍙栬瘝榪囩▼褰掔撼鎴愪互涓嬪嚑涓楠わ細
1錛?瀹夎榧犳爣閽╁瓙錛岄氳繃閽╁瓙鍑芥暟鑾峰緱榧犳爣娑堟伅銆?br />浣跨敤鍒扮殑API鍑芥暟錛歋etWindowsHookEx
2錛?寰楀埌榧犳爣鐨勫綋鍓嶄綅緗紝鍚戦紶鏍囦笅鐨勭獥鍙e彂閲嶇敾娑堟伅錛岃瀹冭皟鐢ㄧ郴緇熷嚱鏁伴噸鐢葷獥鍙c?br />聽聽聽聽 浣跨敤鍒扮殑API鍑芥暟錛歐indowFromPoint錛孲creenToClient錛孖nvalidateRect
3錛?鎴幏瀵圭郴緇熷嚱鏁扮殑璋冪敤錛屽彇寰楀弬鏁幫紝涔熷氨鏄垜浠鍙栫殑璇嶃?br />瀵逛簬澶у鏁扮殑Windows搴旂敤紼嬪簭鏉ヨ錛屽鏋滆鍙栬瘝錛屾垜浠渶瑕佹埅鑾風殑鏄淕di32.dll鈥濅腑鐨勨淭extOutA鈥濆嚱鏁般?br />鎴戜滑鍏堜豢鐓extOutA鍑芥暟鍐欎竴涓嚜宸辯殑MyTextOutA鍑芥暟錛屽錛?br />BOOL WINAPI MyTextOutA(HDC hdc, int nXStart, int nYStart, LPCSTR lpszString,int cbString)
{
聽聽聽聽聽聽 // 榪欓噷榪涜杈撳嚭lpszString鐨勫鐞?br />聽聽聽聽聽聽聽聽聽聽 // 鐒跺悗璋冪敤姝g増鐨凾extOutA鍑芥暟
}
鎶婅繖涓嚱鏁版斁鍦ㄥ畨瑁呬簡閽╁瓙鐨勫姩鎬佽繛鎺ュ簱涓紝鐒跺悗璋冪敤鎴戜滑鏈鍚庣粰鍑虹殑HookImportFunction鍑芥暟鏉ユ埅鑾瘋繘紼?br />瀵筎extOutA鍑芥暟鐨勮皟鐢紝璺寵漿鍒版垜浠殑MyTextOutA鍑芥暟錛屽畬鎴愬杈撳嚭瀛楃涓茬殑鎹曟崏銆侶ookImportFunction鐨?br />鐢ㄦ硶錛?br />聽HOOKFUNCDESC hd;
聽PROC聽聽聽聽聽聽聽聽 pOrigFuns;
聽hd.szFunc="TextOutA";
聽hd.pProc=(PROC)MyTextOutA;
聽HookImportFunction (AfxGetInstanceHandle(),"gdi32.dll",&hd,pOrigFuns);
涓嬮潰緇欏嚭浜咹ookImportFunction鐨勬簮浠g爜錛岀浉淇¤灝界殑娉ㄩ噴涓瀹氫笉浼氳鎮ㄨ寰楃悊瑙f埅鑾峰埌搴曟槸鎬庝箞瀹炵幇鐨?br />寰堥毦錛孫k,Let鈥檚 Go錛?
///////////////////////////////////////////// Begin ///////////////////////////////////////////////////////////////
#include <crtdbg.h>
// 榪欓噷瀹氫箟浜嗕竴涓駭鐢熸寚閽堢殑瀹?br />#define MakePtr(cast, ptr, AddValue) (cast)((DWORD)(ptr)+(DWORD)(AddValue))
// 瀹氫箟浜咹OOKFUNCDESC緇撴瀯,鎴戜滑鐢ㄨ繖涓粨鏋勪綔涓哄弬鏁頒紶緇橦ookImportFunction鍑芥暟
typedef struct tag_HOOKFUNCDESC
{
聽 LPCSTR szFunc; // The name of the function to hook.
聽 PROC pProc;聽聽聽 // The procedure to blast in.
} HOOKFUNCDESC , * LPHOOKFUNCDESC;
// 榪欎釜鍑芥暟鐩戞祴褰撳墠緋葷粺鏄惁鏄疻indowNT
BOOL IsNT();
// 榪欎釜鍑芥暟寰楀埌hModule -- 鍗蟲垜浠渶瑕佹埅鑾風殑鍑芥暟鎵鍦ㄧ殑DLL妯″潡鐨勫紩鍏ユ弿榪扮(import descriptor)
PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hModule, LPCSTR szImportModule);
// 鎴戜滑鐨勪富鍑芥暟
BOOL HookImportFunction(HMODULE hModule, LPCSTR szImportModule,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 LPHOOKFUNCDESC paHookFunc, PROC* paOrigFuncs)
{
/////////////////////// 涓嬮潰鐨勪唬鐮佹嫻嬪弬鏁扮殑鏈夋晥鎬?////////////////////////////
聽_ASSERT(szImportModule);
聽_ASSERT(!IsBadReadPtr(paHookFunc, sizeof(HOOKFUNCDESC)));
#ifdef _DEBUG
聽if (paOrigFuncs) _ASSERT(!IsBadWritePtr(paOrigFuncs, sizeof(PROC)));
聽_ASSERT(paHookFunc.szFunc);
聽_ASSERT(*paHookFunc.szFunc != '\0');
聽聽聽聽聽聽聽 _ASSERT(!IsBadCodePtr(paHookFunc.pProc));
#endif
聽if ((szImportModule == NULL) || (IsBadReadPtr(paHookFunc, sizeof(HOOKFUNCDESC))))
聽{
聽聽_ASSERT(FALSE);
聽聽SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
聽聽return FALSE;
聽}
//////////////////////////////////////////////////////////////////////////////
聽// 鐩戞祴褰撳墠妯″潡鏄惁鏄湪2GB铏氭嫙鍐呭瓨絀洪棿涔嬩笂
聽// 榪欓儴鍒嗙殑鍦板潃鍐呭瓨鏄睘浜嶹in32榪涚▼鍏變韓鐨?br />聽if (!IsNT() && ((DWORD)hModule >= 0x80000000))
聽{
聽聽_ASSERT(FALSE);
聽聽SetLastErrorEx(ERROR_INVALID_HANDLE, SLE_ERROR);
聽聽return FALSE;
聽}
聽聽聽 聽// 娓呴浂
聽if (paOrigFuncs) memset(paOrigFuncs, NULL, sizeof(PROC));
聽// 璋冪敤GetNamedImportDescriptor()鍑芥暟,鏉ュ緱鍒癶Module -- 鍗蟲垜浠渶瑕?br />聽// 鎴幏鐨勫嚱鏁版墍鍦ㄧ殑DLL妯″潡鐨勫紩鍏ユ弿榪扮(import descriptor)
聽PIMAGE_IMPORT_DESCRIPTOR pImportDesc = GetNamedImportDescriptor(hModule, szImportModule);
聽if (pImportDesc == NULL)
聽return FALSE; // 鑻ヤ負絀?鍒欐ā鍧楁湭琚綋鍓嶈繘紼嬫墍寮曞叆
聽//聽 浠嶥LL妯″潡涓緱鍒板師濮嬬殑THUNK淇℃伅,鍥犱負pImportDesc->FirstThunk鏁扮粍涓殑鍘熷淇℃伅宸茬粡
聽//聽 鍦ㄥ簲鐢ㄧ▼搴忓紩鍏ヨDLL鏃惰鐩栦笂浜嗘墍鏈夌殑寮曞叆淇℃伅,鎵浠ユ垜浠渶瑕侀氳繃鍙栧緱pImportDesc->OriginalFirstThunk
聽//聽 鎸囬拡鏉ヨ闂紩鍏ュ嚱鏁板悕絳変俊鎭?br />聽PIMAGE_THUNK_DATA pOrigThunk = MakePtr(PIMAGE_THUNK_DATA, hModule,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 pImportDesc->OriginalFirstThunk);
聽
聽//聽 浠巔ImportDesc->FirstThunk寰楀埌IMAGE_THUNK_DATA鏁扮粍鐨勬寚閽?鐢變簬榪欓噷鍦―LL琚紩鍏ユ椂宸茬粡濉厖浜?br />聽//聽 鎵鏈夌殑寮曞叆淇℃伅,鎵浠ョ湡姝g殑鎴幏瀹為檯涓婃鏄湪榪欓噷榪涜鐨?br />聽PIMAGE_THUNK_DATA pRealThunk = MakePtr(PIMAGE_THUNK_DATA, hModule, pImportDesc->FirstThunk);
聽//聽 絀蜂婦IMAGE_THUNK_DATA鏁扮粍,瀵繪壘鎴戜滑闇瑕佹埅鑾風殑鍑芥暟,榪欐槸鏈鍏抽敭鐨勯儴鍒?
聽while (pOrigThunk->u1.Function)
聽{
聽聽// 鍙鎵鵑偅浜涙寜鍑芥暟鍚嶈屼笉鏄簭鍙峰紩鍏ョ殑鍑芥暟
聽聽if (IMAGE_ORDINAL_FLAG != (pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG))
聽聽{
聽聽聽// 寰楀埌寮曞叆鍑芥暟鐨勫嚱鏁板悕
聽聽聽PIMAGE_IMPORT_BY_NAME pByName = MakePtr(PIMAGE_IMPORT_BY_NAME, hModule,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 pOrigThunk->u1.AddressOfData);
聽聽聽// 濡傛灉鍑芥暟鍚嶄互NULL寮濮?璺寵繃,緇х畫涓嬩竴涓嚱鏁奧犅?
聽聽聽if ('\0' == pByName->Name[0])
聽聽聽聽continue;
聽聽聽// bDoHook鐢ㄦ潵媯鏌ユ槸鍚︽埅鑾鋒垚鍔?br />聽聽聽BOOL bDoHook = FALSE;
聽聽聽// 媯鏌ユ槸鍚﹀綋鍓嶅嚱鏁版槸鎴戜滑闇瑕佹埅鑾風殑鍑芥暟
聽聽聽if ((paHookFunc.szFunc[0] == pByName->Name[0]) &&
聽聽聽聽(strcmpi(paHookFunc.szFunc, (char*)pByName->Name) == 0))
聽聽聽{
聽聽聽聽// 鎵懼埌浜?
聽聽聽聽if (paHookFunc.pProc)
聽聽聽聽bDoHook = TRUE;
聽聽聽}
聽聽聽if (bDoHook)
聽聽聽{
聽聽聽聽// 鎴戜滑宸茬粡鎵懼埌浜嗘墍瑕佹埅鑾風殑鍑芥暟,閭d箞灝卞紑濮嬪姩鎵嬪惂
聽聽聽聽// 棣栧厛瑕佸仛鐨勬槸鏀瑰彉榪欎竴鍧楄櫄鎷熷唴瀛樼殑鍐呭瓨淇濇姢鐘舵?璁╂垜浠彲浠ヨ嚜鐢卞瓨鍙?br />聽聽聽聽MEMORY_BASIC_INFORMATION mbi_thunk;
聽聽聽聽VirtualQuery(pRealThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));
聽聽聽聽_ASSERT(VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 PAGE_READWRITE, &mbi_thunk.Protect));
聽聽聽聽// 淇濆瓨鎴戜滑鎵瑕佹埅鑾風殑鍑芥暟鐨勬紜煩杞湴鍧
聽聽聽聽if (paOrigFuncs)
聽聽聽聽聽 paOrigFuncs = (PROC)pRealThunk->u1.Function;
聽聽聽聽// 灝咺MAGE_THUNK_DATA鏁扮粍涓殑鍑芥暟璺寵漿鍦板潃鏀瑰啓涓烘垜浠嚜宸辯殑鍑芥暟鍦板潃!
聽聽聽聽// 浠ュ悗鎵鏈夎繘紼嬪榪欎釜緋葷粺鍑芥暟鐨勬墍鏈夎皟鐢ㄩ兘灝嗘垚涓哄鎴戜滑鑷繁緙栧啓鐨勫嚱鏁扮殑璋冪敤
聽聽聽聽pRealThunk->u1.Function = (PDWORD)paHookFunc.pProc;
聽聽聽聽// 鎿嶄綔瀹屾瘯!灝嗚繖涓鍧楄櫄鎷熷唴瀛樻敼鍥炲師鏉ョ殑淇濇姢鐘舵?br />聽聽聽聽DWORD dwOldProtect;
聽聽聽聽_ASSERT(VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 mbi_thunk.Protect, &dwOldProtect));
聽聽聽聽SetLastError(ERROR_SUCCESS);
聽聽聽聽return TRUE;
聽聽聽}
聽聽}
聽聽// 璁塊棶IMAGE_THUNK_DATA鏁扮粍涓殑涓嬩竴涓厓绱?br />聽聽pOrigThunk++;
聽聽pRealThunk++;
聽}
聽return TRUE;
}
// GetNamedImportDescriptor鍑芥暟鐨勫疄鐜?br />PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hModule, LPCSTR szImportModule)
{
聽// 媯嫻嬪弬鏁?br />聽_ASSERT(szImportModule);
聽_ASSERT(hModule);
聽if ((szImportModule == NULL) || (hModule == NULL))
聽{
聽聽_ASSERT(FALSE);
聽聽SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
聽聽return NULL;
聽}
聽// 寰楀埌Dos鏂囦歡澶?br />聽PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER) hModule;
聽// 媯嫻嬫槸鍚Z鏂囦歡澶?br />聽if (IsBadReadPtr(pDOSHeader, sizeof(IMAGE_DOS_HEADER)) ||
聽聽(pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE))
聽{
聽聽_ASSERT(FALSE);
聽聽SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
聽聽return NULL;
聽}
聽// 鍙栧緱PE鏂囦歡澶?br />聽PIMAGE_NT_HEADERS pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDOSHeader, pDOSHeader->e_lfanew);
聽// 媯嫻嬫槸鍚E鏄犲儚鏂囦歡
聽if (IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) ||
聽聽 (pNTHeader->Signature != IMAGE_NT_SIGNATURE))
聽{
聽聽_ASSERT(FALSE);
聽聽SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);
聽聽return NULL;
聽}
聽// 媯鏌E鏂囦歡鐨勫紩鍏ユ(鍗?.idata section)
聽if (pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0)
聽聽return NULL;
聽// 寰楀埌寮曞叆孌?鍗?.idata section)鐨勬寚閽?br />聽PIMAGE_IMPORT_DESCRIPTOR pImportDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, pDOSHeader,
聽聽pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
聽// 絀蜂婦PIMAGE_IMPORT_DESCRIPTOR鏁扮粍瀵繪壘鎴戜滑闇瑕佹埅鑾風殑鍑芥暟鎵鍦ㄧ殑妯″潡
聽while (pImportDesc->Name)
聽{
聽聽PSTR szCurrMod = MakePtr(PSTR, pDOSHeader, pImportDesc->Name);
聽聽if (stricmp(szCurrMod, szImportModule) == 0)
聽聽聽聽聽 break; // 鎵懼埌!涓柇寰幆
聽聽// 涓嬩竴涓厓绱?br />聽聽pImportDesc++;
聽}
聽// 濡傛灉娌℃湁鎵懼埌,璇存槑鎴戜滑瀵繪壘鐨勬ā鍧楁病鏈夎褰撳墠鐨勮繘紼嬫墍寮曞叆!
聽if (pImportDesc->Name == NULL)
聽聽return NULL;
聽// 榪斿洖鍑芥暟鎵鎵懼埌鐨勬ā鍧楁弿榪扮(import descriptor)
聽return pImportDesc;
}
// IsNT()鍑芥暟鐨勫疄鐜?br />BOOL IsNT()
{
聽OSVERSIONINFO stOSVI;
聽memset(&stOSVI, NULL, sizeof(OSVERSIONINFO));
聽stOSVI.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
聽BOOL bRet = GetVersionEx(&stOSVI);
聽_ASSERT(TRUE == bRet);
聽if (FALSE == bRet) return FALSE;
聽return (VER_PLATFORM_WIN32_NT == stOSVI.dwPlatformId);
}
/////////////////////////////////////////////// End //////////////////////////////////////////////////////////////////////
聽聽 涓嶇煡閬撳湪榪欑瘒鏂囩珷闂笘涔嬪墠錛屾湁澶氬皯鏈嬪弸灝濊瘯榪囧幓瀹炵幇鈥滈紶鏍囧睆騫曞彇璇嶁濊繖欏瑰厖婊′簡鎸戞垬鐨勬妧鏈紝涔熷彧鏈夊皾璇曡繃鐨勬湅鍙嬫墠鑳戒綋浼氬埌鍏墮棿鐨勪笉鏄擄紝灝ゅ叾鍦ㄦ帰绱PI鍑芥暟鐨勬埅鑾鋒椂錛屾墜澶寸殑鍑犵瘒璧勬枡娌℃湁涓綃囨槸娑夊強鍒板叧閿唬鐮佺殑錛岄噸瑕佺殑鍦版柟閮芥槸涓絎斾唬榪囷紝MSDN鏇存槸鏄懼緱鑻嶇櫧鑰屾棤鍔涳紝涔熶笉鐭ラ亾闄や簡IMAGE_IMPORT_DESCRIPTOR鍜孖MAGE_THUNK_DATA錛屽井杞繕闅愯棌浜嗗灝戠瀵嗭紝濂藉湪紜潃澶寸毊榪樻槸鎶婂畠緇欐敾鍏嬩簡錛屽笇鏈涜繖綃囨枃绔犲澶у鑳芥湁鎵甯姪銆?br />
{
銆銆float m[4][4]錛?br />} MATRIX錛?br />void XForm(float* res, const float* v, const float* m, int nNumVerts)
{
銆銆float dp錛?br />銆銆int i錛?br />銆銆銆const VERTEX* vv = (VERTEX *)v錛?br />銆銆銆for (i = 0錛?i <錛?nNumVerts錛?i++)
銆銆{
銆銆銆銆dp = vv->錛泋 * *m ++錛?br />銆銆銆銆dp += vv->錛泍 * *m ++錛?br />銆銆銆銆dp += vv->錛泎 * *m ++錛?br />銆銆銆銆dp += vv->錛泈 * *m ++錛?br />銆銆銆銆*res ++ = dp錛涖銆銆銆銆銆// 鍐欏叆杞崲浜嗙殑 x
銆銆銆銆dp = vv->錛泋 * *m ++錛?br />銆銆銆銆dp += vv->錛泍 * *m ++錛?br />銆銆銆銆dp += vv->錛泎 * *m ++錛?br />銆銆銆銆dp += vv->錛泈 * *m ++錛?br />銆銆銆銆*res ++ = dp錛涖銆銆銆銆// 鍐欏叆杞崲浜嗙殑 y
銆銆銆銆dp = vv->錛泋 * *m ++錛?br />銆銆銆銆dp += vv->錛泍 * *m ++錛?br />銆銆銆銆dp += vv->錛泎 * *m ++錛?br />銆銆銆銆dp += vv->錛泈 * *m ++錛?br />銆銆銆銆*res ++ = dp錛涖銆銆銆// 鍐欏叆杞崲浜嗙殑 z
銆銆銆銆dp = vv->錛泋 * *m ++錛?br />銆銆銆銆dp += vv->錛泍 * *m ++錛?br />銆銆銆銆dp += vv->錛泎 * *m ++錛?br />銆銆銆銆dp += vv->錛泈 * *m ++錛?br />銆銆銆銆*res ++ = dp錛涖銆銆銆// 鍐欏叆杞崲浜嗙殑 w
銆銆銆銆vv ++錛涖銆銆銆銆銆銆 // 涓嬩竴涓煝閲?br />銆銆銆銆m -= 16錛?br />銆銆}
}
聽聽聽 鎺ㄨ崘鐨勪唬鐮?
typedef struct
{
銆銆float x,y,z,w錛?br />} VERTEX錛?br />typedef struct
{
銆銆float m[4][4]錛?br />} MATRIX錛?br />void XForm (float* res, const float* v, const float* m, int nNumVerts)
{
銆銆int i錛?br />銆銆const VERTEX* vv = (VERTEX*)v錛?br />銆銆const MATRIX* mm = (MATRIX*)m錛?br />銆銆VERTEX* rr = (VERTEX*)res錛?br />銆銆for (i = 0錛?i <錛?nNumVerts錛?i++)
銆銆{
銆銆銆銆rr->錛泋 = vv->錛泋 * mm->錛沵[0][0] + vv->錛泍 * mm->錛沵[0][1]
銆銆銆銆銆銆銆銆+ vv->錛泎 * mm->錛沵[0][2] + vv->錛泈 * mm->錛沵[0][3]錛?br />銆銆銆銆rr->錛泍 = vv->錛泋 * mm->錛沵[1][0] + vv->錛泍 * mm->錛沵[1][1]
銆銆銆銆銆銆銆銆+ vv->錛泎 * mm->錛沵[1][2] + vv->錛泈 * mm->錛沵[1][3]錛?br />銆銆銆銆rr->錛泎 = vv->錛泋 * mm->錛沵[2][0] + vv->錛泍 * mm->錛沵[2][1]
銆銆銆銆銆銆銆銆+ vv->錛泎 * mm->錛沵[2][2] + vv->錛泈 * mm->錛沵[2][3]錛?br />銆銆銆銆rr->錛泈 = vv->錛泋 * mm->錛沵[3][0] + vv->錛泍 * mm->錛沵[3][1]
銆銆銆銆銆銆銆銆+ vv->錛泎 * mm->錛沵[3][2] + vv->錛泈 * mm->錛沵[3][3]錛?br />銆銆}
}
銆銆娉ㄦ剰: 婧愪唬鐮佺殑杞寲鏄笌緙栬瘧鍣ㄧ殑浠g爜鍙戠敓鍣ㄧ浉緇撳悎鐨勩備粠婧愪唬鐮佸眰嬈″緢闅炬帶鍒朵駭鐢熺殑鏈哄櫒鐮併備緷闈犵紪璇戝櫒鍜岀壒孌婄殑婧愪唬鐮侊紝鏈夊彲鑳芥寚閽堝瀷浠g爜緙栬瘧鎴愮殑鏈哄櫒鐮佹瘮鍚岀瓑鏉′歡涓嬬殑鏁扮粍鍨嬩唬鐮佽繍琛岄熷害鏇村揩銆傛槑鏅虹殑鍋氭硶鏄湪婧愪唬鐮佽漿鍖栧悗媯鏌ユц兘鏄惁鐪熸鎻愰珮浜嗭紝鍐嶉夋嫨浣跨敤鎸囬拡鍨嬭繕鏄暟緇勫瀷銆?
6.鍏呭垎鍒嗚В灝忕殑寰幆
銆銆瑕佸厖鍒嗗埄鐢–PU鐨勬寚浠ょ紦瀛橈紝灝辮鍏呭垎鍒嗚В灝忕殑寰幆銆傜壒鍒槸褰撳驚鐜綋鏈韓寰堝皬鐨勬椂鍊欙紝鍒嗚В寰幆鍙互鎻愰珮鎬ц兘銆侭TW:寰堝緙栬瘧鍣ㄥ茍涓嶈兘鑷姩鍒嗚В寰幆銆?
涓嶅ソ鐨勪唬鐮?鎺ㄨ崘鐨勪唬鐮?
// 3D杞寲錛氭妸鐭㈤噺 V 鍜?4x4 鐭╅樀 M 鐩鎬箻
for (i = 0錛?i <錛?4錛?i ++)
{
銆銆r = 0錛?br />銆銆for (j = 0錛?j <錛?4錛?j ++)
銆銆{
銆銆銆銆r += M[j]*V[j]錛?br />銆銆}
}
r[0] = M[0][0]*V[0] + M[1][0]*V[1] + M[2][0]*V[2] + M[3][0]*V[3]錛?br />r[1] = M[0][1]*V[0] + M[1][1]*V[1] + M[2][1]*V[2] + M[3][1]*V[3]錛?br />r[2] = M[0][2]*V[0] + M[1][2]*V[1] + M[2][2]*V[2] + M[3][2]*V[3]錛?br />r[3] = M[0][3]*V[0] + M[1][3]*V[1] + M[2][3]*V[2] + M[3][3]*v[3]錛?
7.閬垮厤娌℃湁蹇呰鐨勮鍐欎緷璧?
銆銆褰撴暟鎹繚瀛樺埌鍐呭瓨鏃跺瓨鍦ㄨ鍐欎緷璧栵紝鍗蟲暟鎹繀欏誨湪姝g‘鍐欏叆鍚庢墠鑳藉啀嬈¤鍙栥傝櫧鐒禔MD Athlon絳塁PU鏈夊姞閫熻鍐欎緷璧栧歡榪熺殑紜歡錛屽厑璁稿湪瑕佷繚瀛樼殑鏁版嵁琚啓鍏ュ唴瀛樺墠璇誨彇鍑烘潵錛屼絾鏄紝濡傛灉閬垮厤浜嗚鍐欎緷璧栧茍鎶婃暟鎹繚瀛樺湪鍐呴儴瀵勫瓨鍣ㄤ腑錛岄熷害浼氭洿蹇傚湪涓孌靛緢闀跨殑鍙堜簰鐩鎬緷璧栫殑浠g爜閾句腑錛岄伩鍏嶈鍐欎緷璧栨樉寰楀挨鍏墮噸瑕併傚鏋滆鍐欎緷璧栧彂鐢熷湪鎿嶄綔鏁扮粍鏃訛紝璁稿緙栬瘧鍣ㄤ笉鑳借嚜鍔ㄤ紭鍖栦唬鐮佷互閬垮厤璇誨啓渚濊禆銆傛墍浠ユ帹鑽愮▼搴忓憳鎵嬪姩鍘繪秷闄よ鍐欎緷璧栵紝涓句緥鏉ヨ錛屽紩榪涗竴涓彲浠ヤ繚瀛樺湪瀵勫瓨鍣ㄤ腑鐨勪復鏃跺彉閲忋傝繖鏍峰彲浠ユ湁寰堝ぇ鐨勬ц兘鎻愬崌銆備笅闈竴孌典唬鐮佹槸涓涓緥瀛愶細
聽聽聽 涓嶅ソ鐨勪唬鐮?br />float x[VECLEN], y[VECLEN], z[VECLEN]錛?br />......
for (unsigned int k = 1錛?k <錛?VECLEN錛?k ++)
{
銆銆x[k] = x[k-1] + y[k]錛?br />}
for (k = 1錛?k <錛?VECLEN錛?k++)
{
銆銆x[k] = z[k] * (y[k] - x[k-1])錛?br />}
銆銆 鎺ㄨ崘鐨勪唬鐮?
float x[VECLEN], y[VECLEN], z[VECLEN]錛?br />......
float t(x[0])錛?br />for (unsigned int k = 1錛?k <錛?VECLEN錛?k ++)
{
銆銆t = t + y[k]錛?br />銆銆x[k] = t錛?br />}
t = x[0]錛?br />for (k = 1錛?k <錛?VECLEN錛?k ++)
{
銆銆t = z[k] * (y[k] - t)錛?br />銆銆x[k] = t錛?br />}
8.Switch 鐨勭敤娉?
銆銆Switch 鍙兘杞寲鎴愬縐嶄笉鍚岀畻娉曠殑浠g爜銆傚叾涓渶甯歌鐨勬槸璺寵漿琛ㄥ拰姣旇緝閾?鏍戙傛帹鑽愬case鐨勫間緷鐓у彂鐢熺殑鍙兘鎬ц繘琛屾帓搴忥紝鎶婃渶鏈夊彲鑳界殑鏀懼湪絎竴涓紝褰搒witch鐢ㄦ瘮杈冮摼鐨勬柟寮忚漿鍖栨椂錛岃繖鏍峰彲浠ユ彁楂樻ц兘銆傛澶栵紝鍦╟ase涓帹鑽愪嬌鐢ㄥ皬鐨勮繛緇殑鏁存暟錛屽洜涓哄湪榪欑鎯呭喌涓嬶紝鎵鏈夌殑緙栬瘧鍣ㄩ兘鍙互鎶妔witch 杞寲鎴愯煩杞〃銆?
聽聽聽 涓嶅ソ鐨勪唬鐮?br />int days_in_month, short_months, normal_months, long_months錛?br />......
switch (days_in_month)
{
銆銆case 28:
銆銆case 29:
銆銆銆銆short_months ++錛?br />銆銆銆銆break錛?br />銆銆case 30:
銆銆銆銆normal_months ++錛?br />銆銆銆銆break錛?br />銆銆case 31:
銆銆銆銆long_months ++錛?br />銆銆銆銆break錛?br />銆銆default:
銆銆銆銆cout <錛?lt;錛?"錛沵onth has fewer than 28 or more than 31 days"錛?<錛?lt;錛?endl錛?br />銆銆銆銆break錛?br />}
聽聽聽 鎺ㄨ崘鐨勪唬鐮?
int days_in_month, short_months, normal_months, long_months錛?br />......
switch (days_in_month)
{
銆銆case 31:
銆銆銆銆long_months ++錛?br />銆銆銆銆break錛?br />銆銆case 30:
銆銆銆銆normal_months ++錛?br />銆銆銆銆break錛?br />銆銆case 28:
銆銆case 29:
銆銆銆銆short_months ++錛?
銆銆銆銆break錛?br />銆銆default:
銆銆銆銆cout <錛?lt;錛?"錛沵onth has fewer than 28 or more than 31 days"錛?<錛?lt;錛?endl錛?br />銆銆銆銆break錛?br />}
9.鎵鏈夊嚱鏁伴兘搴旇鏈夊師鍨嬪畾涔?
銆銆涓鑸潵璇達紝鎵鏈夊嚱鏁伴兘搴旇鏈夊師鍨嬪畾涔夈傚師鍨嬪畾涔夊彲浠ヤ紶杈劇粰緙栬瘧鍣ㄦ洿澶氱殑鍙兘鐢ㄤ簬浼樺寲鐨勪俊鎭?
銆銆灝藉彲鑳戒嬌鐢ㄥ父閲?const)銆侰++ 鏍囧噯瑙勫畾錛屽鏋滀竴涓猚onst澹版槑鐨勫璞$殑鍦板潃涓嶈鑾峰彇錛屽厑璁哥紪璇戝櫒涓嶅瀹冨垎閰嶅偍瀛樼┖闂淬傝繖鏍峰彲浠ヤ嬌浠g爜鏇存湁鏁堢巼錛岃屼笖鍙互鐢熸垚鏇村ソ鐨勪唬鐮併?
10.鎻愬崌寰幆鐨勬ц兘
銆銆瑕佹彁鍗囧驚鐜殑鎬ц兘錛屽噺灝戝浣欑殑甯擱噺璁$畻闈炲父鏈夌敤錛堟瘮濡傦紝涓嶉殢寰幆鍙樺寲鐨勮綆楋級銆?
銆銆涓嶅ソ鐨勪唬鐮?鍦╢or()涓寘鍚笉鍙樼殑if()) 鎺ㄨ崘鐨勪唬鐮?
for( i ... )
{
銆銆if( CONSTANT0 )
銆銆{
銆銆銆銆DoWork0( i )錛?// 鍋囪榪欓噷涓嶆敼鍙楥ONSTANT0鐨勫?br />銆銆}
銆銆else
銆銆{
銆銆銆銆DoWork1( i )錛?// 鍋囪榪欓噷涓嶆敼鍙楥ONSTANT0鐨勫?br />銆銆}
}
if( CONSTANT0 )
{
銆銆for( i ... )
銆銆{
銆銆銆銆DoWork0( i )錛?br />銆銆}
}
else
{
銆銆for( i ... )
銆銆{
銆銆銆銆DoWork1( i )錛?br />銆銆}
}
銆銆濡傛灉宸茬粡鐭ラ亾if()鐨勫鹼紝榪欐牱鍙互閬垮厤閲嶅璁$畻銆傝櫧鐒朵笉濂界殑浠g爜涓殑鍒嗘敮鍙互綆鍗曞湴棰勬祴錛屼絾鏄敱浜庢帹鑽愮殑浠g爜鍦ㄨ繘鍏ュ驚鐜墠鍒嗘敮宸茬粡紜畾錛屽氨鍙互鍑忓皯瀵瑰垎鏀嫻嬬殑渚濊禆銆?銆銆鎶婃湰鍦板嚱鏁板0鏄庝負闈欐佺殑(static)
銆銆濡傛灉涓涓嚱鏁板湪瀹炵幇瀹冪殑鏂囦歡澶栨湭琚嬌鐢ㄧ殑璇濓紝鎶婂畠澹版槑涓洪潤鎬佺殑(static)浠ュ己鍒朵嬌鐢ㄥ唴閮ㄨ繛鎺ャ傚惁鍒欙紝榛樿鐨勬儏鍐典笅浼氭妸鍑芥暟瀹氫箟涓哄閮ㄨ繛鎺ャ傝繖鏍峰彲鑳戒細褰卞搷鏌愪簺緙栬瘧鍣ㄧ殑浼樺寲鈥斺旀瘮濡傦紝鑷姩鍐呰仈銆?
11.鑰冭檻鍔ㄦ佸唴瀛樺垎閰?
銆銆鍔ㄦ佸唴瀛樺垎閰嶏紙C++涓殑"錛沶ew"錛涳級鍙兘鎬繪槸涓洪暱鐨勫熀鏈被鍨嬶紙鍥涘瓧瀵歸綈錛夎繑鍥炰竴涓凡緇忓榻愮殑鎸囬拡銆備絾鏄鏋滀笉鑳戒繚璇佸榻愶紝浣跨敤浠ヤ笅浠g爜鏉ュ疄鐜板洓瀛楀榻愩傝繖孌典唬鐮佸亣璁炬寚閽堝彲浠ユ槧灝勫埌 long 鍨嬨?
銆銆渚嬪瓙
銆銆double* p = (double*)new BYTE[sizeof(double) * number_of_doubles+7L]錛?br />聽聽聽 double* np = (double*)((long(p) + 7L) &錛?鈥?L)錛?
銆銆鐜板湪錛屼綘鍙互浣跨敤 np 浠f浛 p 鏉ヨ闂暟鎹傛敞鎰忥細閲婃斁鍌ㄥ瓨絀洪棿鏃朵粛鐒跺簲璇ョ敤delete p銆?
12.浣跨敤鏄懼紡鐨勫茍琛屼唬鐮?
銆銆灝藉彲鑳芥妸闀跨殑鏈変緷璧栫殑浠g爜閾懼垎瑙f垚鍑犱釜鍙互鍦ㄦ祦姘寸嚎鎵ц鍗曞厓涓茍琛屾墽琛岀殑娌℃湁渚濊禆鐨勪唬鐮侀摼銆傚洜涓烘誕鐐規搷浣滄湁寰堥暱鐨勬綔浼忔湡錛屾墍浠ヤ笉綆″畠琚槧灝勬垚 x87 鎴?3DNow! 鎸囦護錛岃繖閮藉緢閲嶈銆傚緢澶氶珮綰ц璦錛屽寘鎷珻++錛屽茍涓嶅浜х敓鐨勬誕鐐硅〃杈懼紡閲嶆柊鎺掑簭錛屽洜涓洪偅鏄竴涓浉褰撳鏉傜殑榪囩▼銆傞渶瑕佹敞鎰忕殑鏄紝閲嶆帓搴忕殑浠g爜鍜屽師鏉ョ殑浠g爜鍦ㄤ唬鏁頒笂涓鑷村茍涓嶇瓑浠蜂簬璁$畻緇撴灉涓鑷達紝鍥犱負嫻偣鎿嶄綔緙轟箯綺劇‘搴︺傚湪涓浜涙儏鍐典笅錛岃繖浜涗紭鍖栧彲鑳藉鑷存剰鏂欎箣澶栫殑緇撴灉銆傚垢榪愮殑鏄紝鍦ㄥぇ閮ㄥ垎鎯呭喌涓嬶紝鏈鍚庣粨鏋滃彲鑳藉彧鏈夋渶涓嶉噸瑕佺殑浣嶏紙鍗蟲渶浣庝綅錛夋槸閿欒鐨勩?
銆銆涓嶅ソ鐨勪唬鐮?br />double a[100], sum錛?br />int i錛?br />sum = 0.0f錛?br />for (i=0錛?i<錛?00錛?i++)
銆銆sum += a錛?
聽聽聽 鎺ㄨ崘鐨勪唬鐮?
double a[100], sum1, sum2, sum3, sum4, sum錛?br />int i錛?br />sum1 = sum2 = sum3 = sum4 = 0.0錛?br />for (i = 0錛?i <錛?100錛?i += 4)
{
銆銆sum1 += a錛?br />銆銆sum2 += a[i+1]錛?br />銆銆sum3 += a[i+2]錛?br />銆銆sum4 += a[i+3]錛?br />}
sum = (sum4+sum3)+(sum1+sum2)錛?
銆銆瑕佹敞鎰忕殑鏄細浣跨敤4 璺垎瑙f槸鍥犱負榪欐牱浣跨敤浜?闃舵嫻佹按綰挎誕鐐瑰姞娉曪紝嫻偣鍔犳硶鐨勬瘡涓涓樁孌靛崰鐢ㄤ竴涓椂閽熷懆鏈燂紝淇濊瘉浜嗘渶澶х殑璧勬簮鍒╃敤鐜囥?
13.鎻愬嚭鍏叡瀛愯〃杈懼紡
銆銆鍦ㄦ煇浜涙儏鍐典笅錛孋++緙栬瘧鍣ㄤ笉鑳戒粠嫻偣琛ㄨ揪寮忎腑鎻愬嚭鍏叡鐨勫瓙琛ㄨ揪寮忥紝鍥犱負榪欐剰鍛崇潃鐩稿綋浜庡琛ㄨ揪寮忛噸鏂版帓搴忋傞渶瑕佺壒鍒寚鍑虹殑鏄紝緙栬瘧鍣ㄥ湪鎻愬彇鍏叡瀛愯〃杈懼紡鍓嶄笉鑳芥寜鐓т唬鏁扮殑絳変環鍏崇郴閲嶆柊瀹夋帓琛ㄨ揪寮忋傝繖鏃訛紝紼嬪簭鍛樿鎵嬪姩鍦版彁鍑哄叕鍏辯殑瀛愯〃杈懼紡錛堝湪VC.net閲屾湁涓欏光滃叏灞浼樺寲鈥濋夐」鍙互瀹屾垚姝ゅ伐浣滐紝浣嗘晥鏋滃氨涓嶅緱鑰岀煡浜嗭級銆?
鎺ㄨ崘鐨勪唬鐮?
float a, b, c, d, e, f錛?br />...
e = b * c / d錛?br />f = b / d * a錛?br />float a, b, c, d, e, f錛?br />...
const float t(b / d)錛?br />e = c * t錛?br />f = a * t錛?
鎺ㄨ崘鐨勪唬鐮?
float a, b, c, e, f錛?br />...
e = a / c錛?br />f = b / c錛?br />float a, b, c, e, f錛?br />...
const float t(1.0f / c)錛?br />e = a * t錛?br />f = b * t錛?
14.緇撴瀯浣撴垚鍛樼殑甯冨眬
銆銆寰堝緙栬瘧鍣ㄦ湁鈥滀嬌緇撴瀯浣撳瓧錛屽弻瀛楁垨鍥涘瓧瀵歸綈鈥濈殑閫夐」銆備絾鏄紝榪樻槸闇瑕佹敼鍠勭粨鏋勪綋鎴愬憳鐨勫榻愶紝鏈変簺緙栬瘧鍣ㄥ彲鑳藉垎閰嶇粰緇撴瀯浣撴垚鍛樼┖闂寸殑欏哄簭涓庝粬浠0鏄庣殑涓嶅悓銆備絾鏄紝鏈変簺緙栬瘧鍣ㄥ茍涓嶆彁渚涜繖浜涘姛鑳斤紝鎴栬呮晥鏋滀笉濂姐傛墍浠ワ紝瑕佸湪浠樺嚭鏈灝戜唬浠風殑鎯呭喌涓嬪疄鐜版渶濂界殑緇撴瀯浣撳拰緇撴瀯浣撴垚鍛樺榻愶紝寤鴻閲囧彇榪欎簺鏂規硶錛?
銆銆A鎸夌被鍨嬮暱搴︽帓搴?
銆銆鎶婄粨鏋勪綋鐨勬垚鍛樻寜鐓у畠浠殑綾誨瀷闀垮害鎺掑簭錛屽0鏄庢垚鍛樻椂鎶婇暱鐨勭被鍨嬫斁鍦ㄧ煭鐨勫墠闈€?
銆銆鎶婄粨鏋勪綋濉厖鎴愭渶闀跨被鍨嬮暱搴︾殑鏁村嶆暟
銆銆鎶婄粨鏋勪綋濉厖鎴愭渶闀跨被鍨嬮暱搴︾殑鏁村嶆暟銆傜収榪欐牱錛屽鏋滅粨鏋勪綋鐨勭涓涓垚鍛樺榻愪簡錛屾墍鏈夋暣涓粨鏋勪綋鑷劧涔熷氨瀵歸綈浜嗐備笅闈㈢殑渚嬪瓙婕旂ず浜嗗浣曞緇撴瀯浣撴垚鍛樿繘琛岄噸鏂版帓搴忥細
銆銆涓嶅ソ鐨勪唬鐮侊紝鏅氶『搴?鎺ㄨ崘鐨勪唬鐮侊紝鏂扮殑欏哄簭騫舵墜鍔ㄥ~鍏呬簡鍑犱釜瀛楄妭
struct
{
銆銆char a[5]錛?br />銆銆long k錛?br />銆銆double x錛?br />} baz錛?br />struct
{
銆銆double x錛?br />銆銆long k錛?br />銆銆char a[5]錛?br />char pad[7]錛?br />} baz錛?
銆銆榪欎釜瑙勫垯鍚屾牱閫傜敤浜庣被鐨勬垚鍛樼殑甯冨眬銆?
銆銆B鎸夋暟鎹被鍨嬬殑闀垮害鎺掑簭鏈湴鍙橀噺
銆銆褰撶紪璇戝櫒鍒嗛厤緇欐湰鍦板彉閲忕┖闂存椂錛屽畠浠殑欏哄簭鍜屽畠浠湪婧愪唬鐮佷腑澹版槑鐨勯『搴忎竴鏍鳳紝鍜屼笂涓鏉¤鍒欎竴鏍鳳紝搴旇鎶婇暱鐨勫彉閲忔斁鍦ㄧ煭鐨勫彉閲忓墠闈€傚鏋滅涓涓彉閲忓榻愪簡錛屽叾瀹冨彉閲忓氨浼氳繛緇殑瀛樻斁錛岃屼笖涓嶇敤濉厖瀛楄妭鑷劧灝變細瀵歸綈銆傛湁浜涚紪璇戝櫒鍦ㄥ垎閰嶅彉閲忔椂涓嶄細鑷姩鏀瑰彉鍙橀噺欏哄簭錛屾湁浜涚紪璇戝櫒涓嶈兘浜х敓4瀛楄妭瀵歸綈鐨勬爤錛屾墍浠?瀛楄妭鍙兘涓嶅榻愩備笅闈㈣繖涓緥瀛愭紨紺轟簡鏈湴鍙橀噺澹版槑鐨勯噸鏂版帓搴忥細
銆銆涓嶅ソ鐨勪唬鐮侊紝鏅氶『搴?鎺ㄨ崘鐨勪唬鐮侊紝鏀硅繘鐨勯『搴?
short ga, gu, gi錛?br />long foo, bar錛?br />double x, y, z[3]錛?br />char a, b錛?br />float baz錛?br />double z[3]錛?br />double x, y錛?br />long foo, bar錛?br />float baz錛?br />short ga, gu, gi錛?
14.閬垮厤涓嶅繀瑕佺殑鏁存暟闄ゆ硶
銆銆鏁存暟闄ゆ硶鏄暣鏁拌繍綆椾腑鏈鎱㈢殑錛屾墍浠ュ簲璇ュ敖鍙兘閬垮厤銆備竴縐嶅彲鑳藉噺灝戞暣鏁伴櫎娉曠殑鍦版柟鏄繛闄わ紝榪欓噷闄ゆ硶鍙互鐢變箻娉曚唬鏇褲傝繖涓浛鎹㈢殑鍓綔鐢ㄦ槸鏈夊彲鑳藉湪綆椾箻縐椂浼氭孩鍑猴紝鎵浠ュ彧鑳藉湪涓瀹氳寖鍥寸殑闄ゆ硶涓嬌鐢ㄣ?
銆銆涓嶅ソ鐨勪唬鐮?鎺ㄨ崘鐨勪唬鐮?
int i, j, k, m錛?br />m = i / j / k錛?br />int i, j, k, m錛?br />m = i / (j * k)錛?
15.鎶婇綣佷嬌鐢ㄧ殑鎸囬拡鍨嬪弬鏁版嫹璐濆埌鏈湴鍙橀噺
銆銆閬垮厤鍦ㄥ嚱鏁頒腑棰戠箒浣跨敤鎸囬拡鍨嬪弬鏁版寚鍚戠殑鍊箋傚洜涓虹紪璇戝櫒涓嶇煡閬撴寚閽堜箣闂存槸鍚﹀瓨鍦ㄥ啿紿侊紝鎵浠ユ寚閽堝瀷鍙傛暟寰寰涓嶈兘琚紪璇戝櫒浼樺寲銆傝繖鏍鋒槸鏁版嵁涓嶈兘琚瓨鏀懼湪瀵勫瓨鍣ㄤ腑錛岃屼笖鏄庢樉鍦板崰鐢ㄤ簡鍐呭瓨甯﹀銆傛敞鎰忥紝寰堝緙栬瘧鍣ㄦ湁鈥滃亣璁句笉鍐茬獊鈥濅紭鍖栧紑鍏籌紙鍦╒C閲屽繀欏繪墜鍔ㄦ坊鍔犵紪璇戝櫒鍛戒護琛?Oa鎴?Ow錛夛紝榪欏厑璁哥紪璇戝櫒鍋囪涓や釜涓嶅悓鐨勬寚閽堟繪槸鏈変笉鍚岀殑鍐呭錛岃繖鏍峰氨涓嶇敤鎶婃寚閽堝瀷鍙傛暟淇濆瓨鍒版湰鍦板彉閲忋傚惁鍒欙紝璇峰湪鍑芥暟涓寮濮嬫妸鎸囬拡鎸囧悜鐨勬暟鎹繚瀛樺埌鏈湴鍙橀噺銆傚鏋滈渶瑕佺殑璇濓紝鍦ㄥ嚱鏁扮粨鏉熷墠鎷瘋礉鍥炲幓銆?銆銆
聽聽聽 涓嶅ソ鐨勪唬鐮?
// 鍋囪 q != r
void isqrt(unsigned long a, unsigned long* q, unsigned long* r)
{
銆銆*q = a錛?br />銆銆if (a >錛?0)
銆銆{
銆銆銆銆while (*q >錛?(*r = a / *q))
銆銆銆銆{
銆銆銆銆銆銆*q = (*q + *r) >錛?gt;錛?1錛?br />銆銆銆銆}
銆銆}
銆銆*r = a - *q * *q錛?br />}
聽聽聽 鎺ㄨ崘鐨勪唬鐮?br />// 鍋囪 q != r
void isqrt(unsigned long a, unsigned long* q, unsigned long* r)
{
銆銆unsigned long qq, rr錛?br />銆銆qq = a錛?br />銆銆if (a >錛?0)
銆銆{
銆銆銆銆while (qq >錛?(rr = a / qq))
銆銆銆銆{
銆銆銆銆銆銆qq = (qq + rr) >錛?gt;錛?1錛?br />銆銆銆銆}
銆銆}
銆銆rr = a - qq * qq錛?br />銆銆*q = qq錛?br />銆銆*r = rr錛?br />}
16.璧嬪間笌鍒濆鍖?br />鍏堢湅鐪嬩互涓嬩唬鐮侊細
class CInt
{
銆銆int m_i錛?
public:
銆銆CInt(int a = 0):m_i(a) { cout <錛?lt;錛?"錛汣Int"錛?<錛?lt;錛?endl錛?}
銆銆~CInt() { cout <錛?lt;錛?"錛泘CInt"錛?<錛?lt;錛?endl錛?}
銆銆CInt operator + (const CInt&錛?a) { return CInt(m_i + a.GetInt())錛?}
銆銆void SetInt(const int i)銆銆{ m_i = i錛?}
銆銆int GetInt() const銆銆銆銆銆銆{ return m_i錛?}
}錛?br />聽聽聽 涓嶅ソ鐨勪唬鐮?
void main()
{
銆銆CInt a, b, c錛?br />銆銆a.SetInt(1)錛?br />銆銆b.SetInt(2)錛?br />銆銆c = a + b錛?br />}
聽聽聽 鎺ㄨ崘鐨勪唬鐮?br />void main()
{
銆銆CInt a(1), b(2)錛?br />銆銆CInt c(a + b)錛?br />}
銆銆榪欎袱孌典唬鐮佹墍浣滅殑浜嬮兘涓鏍鳳紝浣嗛偅涓涓洿濂藉憿錛熺湅鐪嬭緭鍑虹粨鏋滃氨浼氬彂鐜幫紝涓嶅ソ鐨勪唬鐮佽緭鍑轟簡鍥涗釜"錛汣Int"錛涘拰鍥涗釜"錛泘CInt"錛涳紝鑰屾帹鑽愮殑浠g爜鍙緭鍑轟笁涓備篃灝辨槸璇達紝絎簩涓緥瀛愭瘮絎竴涓緥瀛愬皯鐢熸垚涓嬈′復鏃跺璞°俉hy? 璇鋒敞鎰忥紝絎竴涓腑鐨刢鐢ㄧ殑鏄厛澹版槑鍐嶈祴鍊肩殑鏂規硶錛岀浜屼釜鐢ㄧ殑鏄垵濮嬪寲鐨勬柟娉曪紝瀹冧滑鏈夋湰璐ㄧ殑鍖哄埆銆傜涓涓緥瀛愮殑"錛沜 = a + b"錛涘厛鐢熸垚涓涓復鏃跺璞$敤鏉ヤ繚瀛榓 + b鐨勫鹼紝鍐嶆妸璇ヤ復鏃跺璞$敤浣嶆嫹璐濈殑鏂規硶緇檆璧嬪鹼紝鐒跺悗涓存椂瀵硅薄琚攢姣併傝繖涓復鏃跺璞″氨鏄偅涓鍑烘潵鐨勫璞°傜浜屼釜渚嬪瓙鐩存帴鐢ㄦ嫹璐濇瀯閫犲嚱鏁扮殑鏂規硶瀵筩鍒濆鍖栵紝涓嶄駭鐢熶復鏃跺璞°傛墍浠ワ紝灝介噺鍦ㄩ渶瑕佷嬌鐢ㄤ竴涓璞℃椂鎵嶅0鏄庯紝騫剁敤鍒濆鍖栫殑鏂規硶璧嬪垵鍊箋?
17.灝介噺浣跨敤鎴愬憳鍒濆鍖栧垪琛?
銆銆鍦ㄥ垵濮嬪寲綾葷殑鎴愬憳鏃訛紝灝介噺浣跨敤鎴愬憳鍒濆鍖栧垪琛ㄨ屼笉鏄紶緇熺殑璧嬪兼柟寮忋?
銆銆涓嶅ソ鐨勪唬鐮?
class CMyClass
{
銆銆string strName錛?
public:
銆銆CMyClass(const string&錛?str)錛?br />}錛?
CMyClass::CMyClass(const string&錛?str)
{
銆銆strName = str錛?br />}
聽聽聽 鎺ㄨ崘鐨勪唬鐮?br />class CMyClass
{
銆銆string strName錛?br />銆銆int i錛?br />public:
銆銆CMyClass(const string&錛?str)錛?br />}錛?
CMyClass::CMyClass(const string&錛泂tr)
聽聽 :strName(str)
{
}
銆銆涓嶅ソ鐨勪緥瀛愮敤鐨勬槸璧嬪肩殑鏂瑰紡銆傝繖鏍鳳紝strName浼氬厛琚緩绔嬶紙璋冪敤浜唖tring鐨勯粯璁ゆ瀯閫犲嚱鏁幫級錛屽啀鐢卞弬鏁皊tr璧嬪箋傝屾帹鑽愮殑渚嬪瓙鐢ㄧ殑鏄垚鍛樺垵濮嬪寲鍒楄〃錛宻trName鐩存帴鏋勯犱負str錛屽皯璋冪敤涓嬈¢粯璁ゆ瀯閫犲嚱鏁幫紝榪樺皯浜嗕竴浜涘畨鍏ㄩ殣鎮c?/p>
銆銆1銆佸姞瀵嗘妧鏈榪?/strong>
銆銆涓涓瘑鐮佺郴緇熺殑瀹夊叏鎬у彧鍦ㄤ簬瀵嗛挜鐨勪繚瀵嗘э紝鑰屼笉鍦ㄧ畻娉曠殑淇濆瘑鎬с?/p>
銆銆瀵圭函鏁版嵁鐨勫姞瀵嗙殑紜槸榪欐牱銆傚浜庝綘涓嶆効鎰忚浠栫湅鍒拌繖浜涙暟鎹紙鏁版嵁鐨勬槑鏂囷級鐨勪漢錛岀敤鍙潬鐨勫姞瀵嗙畻娉曪紝鍙鐮磋В鑰呬笉鐭ラ亾琚姞瀵嗘暟鎹殑瀵嗙爜錛屼粬灝變笉鍙В璇昏繖浜涙暟鎹?/p>
銆銆浣嗘槸錛岃蔣浠剁殑鍔犲瘑涓嶅悓浜庢暟鎹殑鍔犲瘑錛屽畠鍙兘鏄滈殣钘忊濄備笉綆′綘鎰挎剰涓嶆効鎰忚浠栵紙鍚堟硶鐢ㄦ埛錛屾垨 Cracker錛夌湅瑙佽繖浜涙暟鎹紙杞歡鐨勬槑鏂囷級錛岃蔣浠舵渶緇堟昏鍦ㄦ満鍣ㄤ笂榪愯錛屽鏈哄櫒錛屽畠灝卞繀欏繪槸鏄庢枃銆傛棦鐒舵満鍣ㄥ彲浠モ滅湅瑙佲濊繖浜涙槑鏂囷紝閭d箞 Cracker錛岄氳繃涓浜涙妧鏈紝涔熷彲浠ョ湅鍒拌繖浜涙槑鏂囥?/p>
銆銆浜庢槸錛屼粠鐞嗚涓婏紝浠諱綍杞歡鍔犲瘑鎶鏈兘鍙互鐮磋В銆傚彧鏄牬瑙g殑闅懼害涓嶅悓鑰屽凡銆傛湁鐨勮璁╂渶楂樻槑鐨?Cracker 蹇欎笂鍑犱釜鏈堬紝鏈夌殑鍙兘涓嶈垂鍚圭伆涔嬪姏錛屽氨琚牬瑙d簡銆?/p>
銆銆鎵浠ワ紝鍙嶇洍鐗堢殑浠誨姟錛堟妧鏈笂鐨勫弽鐩楃増錛岃岄潪琛屾斂涓婄殑鍙嶇洍鐗堬級灝辨槸澧炲姞 Cracker 鐨勭牬瑙i毦搴︺傝浠栦滑鑺辮垂鍦ㄧ牬瑙h蔣浠朵笂鐨勬垚鏈紝姣斾粬鐮磋В榪欎釜杞歡鐨勮幏鍒╄繕瑕侀珮銆傝繖鏍?Cracker 鐨勭牬瑙e彉寰楁鏃犳剰涔夆斺旇皝浼氳姳姣旀鐗堣蔣浠舵洿澶氱殑閽卞幓涔扮洍鐗堣蔣浠訛紵
銆銆2銆佸瘑鐮佸綆浠?/strong>
銆銆2.1聽聽 姒傚康
銆銆錛?錛?鍙戦佽呭拰鎺ユ敹鑰?/strong>
銆銆鍋囪鍙戦佽呮兂鍙戦佹秷鎭粰鎺ユ敹鑰咃紝涓旀兂瀹夊叏鍦板彂閫佷俊鎭細濂規兂紜俊鍋峰惉鑰呬笉鑳介槄璇誨彂閫佺殑娑堟伅銆?/p>
銆銆錛?錛?娑堟伅鍜屽姞瀵?/strong>
銆銆娑堟伅琚О涓烘槑鏂囥傜敤鏌愮鏂規硶浼娑堟伅浠ラ殣钘忓畠鐨勫唴瀹圭殑榪囩▼縐頒負鍔犲瘑錛屽姞浜嗗瘑鐨勬秷鎭О涓哄瘑鏂囷紝鑰屾妸瀵嗘枃杞彉涓烘槑鏂囩殑榪囩▼縐頒負瑙e瘑銆?/p>
銆銆鏄庢枃鐢∕錛堟秷鎭級鎴朠錛堟槑鏂囷級琛ㄧず錛屽畠鍙兘鏄瘮鐗規祦錛堟枃鏈枃浠躲佷綅鍥俱佹暟瀛楀寲鐨勮闊蟲祦鎴栨暟瀛楀寲鐨勮棰戝浘鍍忥級銆傝嚦浜庢秹鍙婂埌璁$畻鏈猴紝P鏄畝鍗曠殑浜岃繘鍒舵暟鎹傛槑鏂囧彲琚紶閫佹垨瀛樺偍錛屾棤璁哄湪鍝鎯呭喌錛孧鎸囧緟鍔犲瘑鐨勬秷鎭?/p>
銆銆瀵嗘枃鐢–琛ㄧず錛屽畠涔熸槸浜岃繘鍒舵暟鎹紝鏈夋椂鍜孧涓鏍峰ぇ錛屾湁鏃剁◢澶э紙閫氳繃鍘嬬緝鍜屽姞瀵嗙殑緇撳悎錛孋鏈夊彲鑳芥瘮P灝忎簺銆傜劧鑰岋紝鍗曞崟鍔犲瘑閫氬父杈句笉鍒拌繖涓鐐癸級銆傚姞瀵嗗嚱鏁癊浣滅敤浜嶮寰楀埌瀵嗘枃C錛岀敤鏁板琛ㄧず涓猴細
銆銆E錛圡錛?C.
銆銆鐩稿弽鍦幫紝瑙e瘑鍑芥暟D浣滅敤浜嶤浜х敓M
銆銆D錛圕錛?M.
銆銆鍏堝姞瀵嗗悗鍐嶈В瀵嗘秷鎭紝鍘熷鐨勬槑鏂囧皢鎭㈠鍑烘潵錛屼笅闈㈢殑絳夊紡蹇呴』鎴愮珛錛?/p>
銆銆D錛圗錛圡錛夛級=M
銆銆錛?錛?閴村埆銆佸畬鏁存у拰鎶楁姷璧?/strong>
銆銆闄や簡鎻愪緵鏈哄瘑鎬у錛屽瘑鐮佸閫氬父鏈夊叾瀹冪殑浣滅敤錛?
銆銆錛坅錛?閴村埆
銆銆娑堟伅鐨勬帴鏀惰呭簲璇ヨ兘澶熺‘璁ゆ秷鎭殑鏉ユ簮錛涘叆渚佃呬笉鍙兘浼鎴愪粬浜恒?/p>
銆銆錛坆錛?瀹屾暣鎬ф楠?/p>
銆銆娑堟伅鐨勬帴鏀惰呭簲璇ヨ兘澶熼獙璇佸湪浼犻佽繃紼嬩腑娑堟伅娌℃湁琚慨鏀癸紱鍏ヤ鏡鑰呬笉鍙兘鐢ㄥ亣娑堟伅浠f浛鍚堟硶娑堟伅銆?/p>
銆銆錛坈錛?鎶楁姷璧?/p>
銆銆鍙戦佽呬簨鍚庝笉鍙兘铏氬亣鍦板惁璁や粬鍙戦佺殑娑堟伅銆?/p>
銆銆錛?錛?綆楁硶鍜屽瘑閽?/strong>
銆銆瀵嗙爜綆楁硶涔熷彨瀵嗙爜錛屾槸鐢ㄤ簬鍔犲瘑鍜岃В瀵嗙殑鏁板鍑芥暟銆傦紙閫氬父鎯呭喌涓嬶紝鏈変袱涓浉鍏崇殑鍑芥暟錛氫竴涓敤浣滃姞瀵嗭紝鍙︿竴涓敤浣滆В瀵嗭級
銆銆濡傛灉綆楁硶鐨勪繚瀵嗘ф槸鍩轟簬淇濇寔綆楁硶鐨勭瀵嗭紝榪欑綆楁硶縐頒負鍙楅檺鍒剁殑綆楁硶銆傚彈闄愬埗鐨勭畻娉曞叿鏈夊巻鍙叉剰涔夛紝浣嗘寜鐜板湪鐨勬爣鍑嗭紝瀹冧滑鐨勪繚瀵嗘у凡榪滆繙涓嶅銆傚ぇ鐨勬垨緇忓父鍙樻崲鐨勭敤鎴風粍緇囦笉鑳戒嬌鐢ㄥ畠浠紝鍥犱負姣忔湁涓涓敤鎴風寮榪欎釜緇勭粐錛屽叾瀹冪殑鐢ㄦ埛灝卞繀欏繪敼鎹㈠彟澶栦笉鍚岀殑綆楁硶銆傚鏋滄湁浜烘棤鎰忔毚闇蹭簡榪欎釜縐樺瘑錛屾墍鏈変漢閮藉繀欏繪敼鍙樹粬浠殑綆楁硶銆?/p>
銆銆鏇寸碂鐨勬槸錛屽彈闄愬埗鐨勫瘑鐮佺畻娉曚笉鍙兘榪涜璐ㄩ噺鎺у埗鎴栨爣鍑嗗寲銆傛瘡涓敤鎴風粍緇囧繀欏繪湁浠栦滑鑷繁鐨勫敮涓綆楁硶銆傝繖鏍風殑緇勭粐涓嶅彲鑳介噰鐢ㄦ祦琛岀殑紜歡鎴栬蔣浠朵駭鍝併備絾紿冨惉鑰呭嵈鍙互涔板埌榪欎簺嫻佽浜у搧騫跺涔犵畻娉曪紝浜庢槸鐢ㄦ埛涓嶅緱涓嶈嚜宸辯紪鍐欑畻娉曞茍浜堜互瀹炵幇錛屽鏋滆繖涓粍緇囦腑娌℃湁濂界殑瀵嗙爜瀛﹀錛岄偅涔堜粬浠氨鏃犳硶鐭ラ亾浠栦滑鏄惁鎷ユ湁瀹夊叏鐨勭畻娉曘?/p>
銆銆灝界鏈夎繖浜涗富瑕佺己闄鳳紝鍙楅檺鍒剁殑綆楁硶瀵逛綆瀵嗙駭鐨勫簲鐢ㄦ潵璇磋繕鏄緢嫻佽鐨勶紝鐢ㄦ埛鎴栬呮病鏈夎璇嗗埌鎴栬呬笉鍦ㄤ箮浠栦滑緋葷粺涓唴鍦ㄧ殑闂銆?/p>
銆銆鐜頒唬瀵嗙爜瀛︾敤瀵嗛挜瑙e喅浜嗚繖涓棶棰橈紝瀵嗛挜鐢↘琛ㄧず銆侹鍙互鏄緢澶氭暟鍊奸噷鐨勪換鎰忓箋傚瘑閽鐨勫彲鑳藉肩殑鑼冨洿鍙仛瀵嗛挜絀洪棿銆傚姞瀵嗗拰瑙e瘑榪愮畻閮戒嬌鐢ㄨ繖涓瘑閽ワ紙鍗寵繍綆楅兘渚濊禆浜庡瘑閽ワ紝騫剁敤K浣滀負涓嬫爣琛ㄧず錛夛紝榪欐牱錛屽姞/瑙e瘑鍑芥暟鐜板湪鍙樻垚錛?/p>
銆銆EK錛圡錛?C
銆銆DK錛圕錛?M.
銆銆DK錛圗K錛圡錛夛級=M.
銆銆鏈変簺綆楁硶浣跨敤涓嶅悓鐨勫姞瀵嗗瘑閽ュ拰瑙e瘑瀵嗛挜錛屼篃灝辨槸璇村姞瀵嗗瘑閽1涓庣浉搴旂殑瑙e瘑瀵嗛挜K2涓嶅悓錛屽湪榪欑鎯呭喌涓嬶細
銆銆EK1錛圡錛?C
銆銆DK2錛圕錛?M
銆銆DK2 錛圗K1錛圡錛夛級=M
銆銆鎵鏈夎繖浜涚畻娉曠殑瀹夊叏鎬ч兘鍩轟簬瀵嗛挜鐨勫畨鍏ㄦэ紱鑰屼笉鏄熀浜庣畻娉曠殑緇嗚妭鐨勫畨鍏ㄦс傝繖灝辨剰鍛崇潃綆楁硶鍙互鍏紑錛屼篃鍙互琚垎鏋愶紝鍙互澶ч噺鐢熶駭浣跨敤綆楁硶鐨勪駭鍝侊紝鍗充嬌鍋峰惉鑰呯煡閬撲綘鐨勭畻娉曚篃娌℃湁鍏崇郴錛涘鏋滀粬涓嶇煡閬撲綘浣跨敤鐨勫叿浣撳瘑閽ワ紝浠栧氨涓嶅彲鑳介槄璇諱綘鐨勬秷鎭?/p>
銆銆瀵嗙爜緋葷粺鐢辯畻娉曘佷互鍙婃墍鏈夊彲鑳界殑鏄庢枃銆佸瘑鏂囧拰瀵嗛挜緇勬垚鐨勩?/p>
銆銆鍩轟簬瀵嗛挜鐨勭畻娉曢氬父鏈変袱綾伙細瀵圭О綆楁硶鍜屽叕寮瀵嗛挜綆楁硶銆備笅闈㈠皢鍒嗗埆浠嬬粛錛?/p>
銆銆2.2聽聽 瀵圭О瀵嗙爜綆楁硶
銆銆瀵圭О綆楁硶鏈夋椂鍙堝彨浼犵粺瀵嗙爜綆楁硶錛屽氨鏄姞瀵嗗瘑閽ヨ兘澶熶粠瑙e瘑瀵嗛挜涓帹綆楀嚭鏉ワ紝鍙嶈繃鏉ヤ篃鎴愮珛銆傚湪澶у鏁板縐扮畻娉曚腑錛屽姞/瑙e瘑瀵嗛挜鏄浉鍚岀殑銆傝繖浜涚畻娉曚篃鍙瀵嗗瘑閽ョ畻娉曟垨鍗曞瘑閽ョ畻娉曪紝瀹冭姹傚彂閫佽呭拰鎺ユ敹鑰呭湪瀹夊叏閫氫俊涔嬪墠錛屽晢瀹氫竴涓瘑閽ャ傚縐扮畻娉曠殑瀹夊叏鎬т緷璧栦簬瀵嗛挜錛屾硠婕忓瘑閽ュ氨鎰忓懗鐫浠諱綍浜洪兘鑳藉娑堟伅榪涜鍔?瑙e瘑銆傚彧瑕侀氫俊闇瑕佷繚瀵嗭紝瀵嗛挜灝卞繀欏諱繚瀵嗐?/p>
銆銆瀵圭О綆楁硶鐨勫姞瀵嗗拰瑙e瘑琛ㄧず涓猴細
銆銆EK錛圡錛?C
銆銆DK錛圕錛?M
銆銆瀵圭О綆楁硶鍙垎涓轟袱綾匯備竴嬈″彧瀵規槑鏂囦腑鐨勫崟涓瘮鐗癸紙鏈夋椂瀵瑰瓧鑺傦級榪愮畻鐨勭畻娉曠О涓哄簭鍒楃畻娉曟垨搴忓垪瀵嗙爜銆傚彟涓綾葷畻娉曟槸瀵規槑鏂囩殑涓緇勬瘮鐗逛簹琛岃繍綆楋紝榪欎簺姣旂壒緇勭О涓哄垎緇勶紝鐩稿簲鐨勭畻娉曠О涓哄垎緇勭畻娉曟垨鍒嗙粍瀵嗙爜銆傜幇浠h綆楁満瀵嗙爜綆楁硶鐨勫吀鍨嬪垎緇勯暱搴︿負64姣旂壒鈥斺旇繖涓暱搴﹀ぇ鍒拌凍浠ラ槻姝㈠垎鏋愮牬璇戯紝浣嗗張灝忓埌瓚充互鏂逛究浣跨敤錛堝湪璁$畻鏈哄嚭鐜板墠錛岀畻娉曟櫘閬嶅湴姣忔鍙鏄庢枃鐨勪竴涓瓧絎﹁繍綆楋紝鍙涓烘槸搴忓垪瀵嗙爜瀵瑰瓧絎﹀簭鍒楃殑榪愮畻錛夈?/p>
銆銆2.3聽聽 鍏紑瀵嗙爜綆楁硶
銆銆鍏紑瀵嗛挜綆楁硶錛堜篃鍙潪瀵圭О綆楁硶錛夋槸榪欐牱璁捐鐨勶細鐢ㄤ綔鍔犲瘑鐨勫瘑閽ヤ笉鍚屼簬鐢ㄤ綔瑙e瘑鐨勫瘑閽ワ紝鑰屼笖瑙e瘑瀵嗛挜涓嶈兘鏍規嵁鍔犲瘑瀵嗛挜璁$畻鍑烘潵錛堣嚦灝戝湪鍚堢悊鍋囧畾鐨勯暱鏃墮棿鍐咃級銆備箣鎵浠ュ彨鍋氬叕寮瀵嗛挜綆楁硶錛屾槸鍥犱負鍔犲瘑瀵嗛挜鑳藉鍏紑錛屽嵆闄岀敓鑰呰兘鐢ㄥ姞瀵嗗瘑閽ュ姞瀵嗕俊鎭紝浣嗗彧鏈夌敤鐩稿簲鐨勮В瀵嗗瘑閽ユ墠鑳借В瀵嗕俊鎭傚湪榪欎簺緋葷粺涓紝鍔犲瘑瀵嗛挜鍙仛鍏紑瀵嗛挜錛堢畝縐板叕閽ワ級錛岃В瀵嗗瘑閽ュ彨鍋氱浜哄瘑閽ワ紙綆縐扮閽ワ級銆傜浜哄瘑閽ユ湁鏃朵篃鍙瀵嗗瘑閽ャ備負浜嗛伩鍏嶄笌瀵圭О綆楁硶娣鋒穯錛屾澶勪笉鐢ㄧ瀵嗗瘑閽ヨ繖涓悕瀛椼?/p>
銆銆鐢ㄥ叕寮瀵嗛挜K鍔犲瘑琛ㄧず涓?/p>
銆銆EK錛圡錛?C.
銆銆铏界劧鍏紑瀵嗛挜鍜岀浜哄瘑閽ユ槸涓嶅悓鐨勶紝浣嗙敤鐩稿簲鐨勭浜哄瘑閽ヨВ瀵嗗彲琛ㄧず涓猴細
銆銆DK錛圕錛?M
銆銆鏈夋椂娑堟伅鐢ㄧ浜哄瘑閽ュ姞瀵嗚岀敤鍏紑瀵嗛挜瑙e瘑錛岃繖鐢ㄤ簬鏁板瓧絳懼悕錛堝悗闈㈠皢璇︾粏浠嬬粛錛夛紝灝界鍙兘浜х敓娣鋒穯錛屼絾榪欎簺榪愮畻鍙垎鍒〃紺轟負錛?/p>
銆銆EK錛圡錛?C
銆銆DK錛圕錛?M
銆銆褰撳墠鐨勫叕寮瀵嗙爜綆楁硶鐨勯熷害錛屾瘮璧峰縐板瘑鐮佺畻娉曪紝瑕佹參鐨勫錛岃繖浣垮緱鍏紑瀵嗙爜綆楁硶鍦ㄥぇ鏁版嵁閲忕殑鍔犲瘑涓簲鐢ㄦ湁闄愩?/p>
銆銆2.4聽聽 鍗曞悜鏁e垪鍑芥暟
銆銆鍗曞悜鏁e垪鍑芥暟 H錛圡錛?浣滅敤浜庝竴涓換鎰忛暱搴︾殑娑堟伅 M錛屽畠榪斿洖涓涓浐瀹氶暱搴︾殑鏁e垪鍊?h錛屽叾涓?h 鐨勯暱搴︿負 m .
銆銆杈撳叆涓轟換鎰忛暱搴︿笖杈撳嚭涓哄浐瀹氶暱搴︾殑鍑芥暟鏈夊緢澶氱錛屼絾鍗曞悜鏁e垪鍑芥暟榪樻湁浣垮叾鍗曞悜鐨勫叾瀹冪壒鎬э細
銆銆錛?錛?緇欏畾 M 錛屽緢瀹規槗璁$畻 h 錛?/p>
銆銆錛?錛?緇欏畾 h 錛屾牴鎹?H錛圡錛?= h 璁$畻 M 寰堥毦 錛?/p>
銆銆錛?錛?緇欏畾 M 錛岃鎵懼埌鍙︿竴涓秷鎭?M鈥?騫舵弧瓚?H錛圡錛?= H錛圡鈥欙級 寰堥毦銆?/p>
銆銆鍦ㄨ澶氬簲鐢ㄤ腑錛屼粎鏈夊崟鍚戞ф槸涓嶅鐨勶紝榪橀渶瑕佺О涔嬩負鈥滄姉紕版挒鈥濈殑鏉′歡錛?/p>
銆銆瑕佹壘鍑轟袱涓殢鏈虹殑娑堟伅 M 鍜?M鈥橈紝浣?H錛圡錛?= H錛圡鈥欙級 婊¤凍寰堥毦銆?/p>
銆銆鐢變簬鏁e垪鍑芥暟鐨勮繖浜涚壒鎬э紝鐢變簬鍏紑瀵嗙爜綆楁硶鐨勮綆楅熷害寰寰寰堟參錛屾墍浠ワ紝鍦ㄤ竴浜涘瘑鐮佸崗璁腑錛屽畠鍙互浣滀負涓涓秷鎭?M 鐨勬憳瑕侊紝浠f浛鍘熷娑堟伅 M錛岃鍙戦佽呬負 H錛圡錛?絳懼悕鑰屼笉鏄 M 絳懼悕 .
銆銆濡?SHA 鏁e垪綆楁硶鐢ㄤ簬鏁板瓧絳懼悕鍗忚 DSA涓?/p>
銆銆2.5聽聽 鏁板瓧絳懼悕
銆銆鎻愬埌鏁板瓧絳懼悕灝辯涓嶅紑鍏紑瀵嗙爜緋葷粺鍜屾暎鍒楁妧鏈?/p>
銆銆鏈夊嚑縐嶅叕閽ョ畻娉曡兘鐢ㄤ綔鏁板瓧絳懼悕銆傚湪涓浜涚畻娉曚腑錛屼緥濡俁SA錛屽叕閽ユ垨鑰呯閽ラ兘鍙敤浣滃姞瀵嗐傜敤浣犵殑縐侀挜鍔犲瘑鏂囦歡錛屼綘灝辨嫢鏈夊畨鍏ㄧ殑鏁板瓧絳懼悕銆傚湪鍏跺畠鎯呭喌涓嬶紝濡侱SA錛岀畻娉曚究鍖哄垎寮鏉ヤ簡錛燂紵鏁板瓧絳懼悕綆楁硶涓嶈兘鐢ㄤ簬鍔犲瘑銆傝繖縐嶆濇兂棣栧厛鐢盌iffie鍜孒ellman鎻愬嚭 .
銆銆鍩烘湰鍗忚鏄畝鍗曠殑 錛?/p>
銆銆錛?錛?A 鐢ㄥス鐨勭閽ュ鏂囦歡鍔犲瘑錛屼粠鑰屽鏂囦歡絳懼悕銆?/p>
銆銆錛?錛?A 灝嗙鍚嶇殑鏂囦歡浼犵粰B.
銆銆錛?錛?B鐢ˋ鐨勫叕閽ヨВ瀵嗘枃浠訛紝浠庤岄獙璇佺鍚嶃?/p>
銆銆榪欎釜鍗忚涓紝鍙渶瑕佽瘉鏄嶢鐨勫叕閽ョ殑紜槸濂圭殑銆傚鏋淏涓嶈兘瀹屾垚絎紙3錛夋錛岄偅涔堜粬鐭ラ亾絳懼悕鏄棤鏁堢殑銆?/p>
銆銆榪欎釜鍗忚涔熸弧瓚充互涓嬬壒寰侊細
銆銆錛?錛?絳懼悕鏄彲淇$殑銆傚綋B鐢ˋ鐨勫叕閽ラ獙璇佷俊鎭椂錛屼粬鐭ラ亾鏄敱A絳懼悕鐨勩?/p>
銆銆錛?錛?絳懼悕鏄笉鍙吉閫犵殑銆傚彧鏈堿鐭ラ亾濂圭殑縐侀挜銆?/p>
銆銆錛?錛?絳懼悕鏄笉鍙噸鐢ㄧ殑銆傜鍚嶆槸鏂囦歡鐨勫嚱鏁幫紝騫朵笖涓嶅彲鑳借漿鎹㈡垚鍙﹀鐨勬枃浠躲?/p>
銆銆錛?錛?琚鍚嶇殑鏂囦歡鏄笉鍙敼鍙樼殑銆傚鏋滄枃浠舵湁浠諱綍鏀瑰彉錛屾枃浠跺氨涓嶅彲鑳界敤A鐨勫叕閽ラ獙璇併?/p>
銆銆錛?錛?絳懼悕鏄笉鍙姷璧栫殑銆侭涓嶇敤A鐨勫府鍔╁氨鑳介獙璇丄鐨勭鍚嶃?/p>
銆銆鍦ㄥ疄闄呭簲鐢ㄤ腑錛屽洜涓哄叕鍏卞瘑鐮佺畻娉曠殑閫熷害澶參錛岀鍚嶈呭線寰鏄娑堟伅鐨勬暎鍒楃鍚嶈屼笉鏄娑堟伅鏈韓絳懼悕銆傝繖鏍峰仛騫朵笉浼氶檷浣庣鍚嶇殑鍙俊鎬с?/p>
銆銆3聽聽聽 褰撳墠嫻佽鐨勪竴浜涜蔣浠朵繚鎶ゆ妧鏈?/strong>
銆銆3.1聽聽 搴忓垪鍙蜂繚鎶?/p>
銆銆鏁板綆楁硶涓欏歸兘鏄瘑鐮佸姞瀵嗙殑鏍稿績錛屼絾鍦ㄤ竴鑸殑杞歡鍔犲瘑涓紝瀹冧技涔庡茍涓嶅お涓轟漢浠叧蹇冿紝鍥犱負澶у鏁版椂鍊欒蔣浠跺姞瀵嗘湰韜疄鐜扮殑閮芥槸涓縐嶇紪紼嬬殑鎶宸с備絾榪戝嚑騫存潵闅忕潃搴忓垪鍙峰姞瀵嗙▼搴忕殑鏅強錛屾暟瀛︾畻娉曞湪杞歡鍔犲瘑涓殑姣旈噸浼間箮鏄秺鏉ヨ秺澶т簡銆?/p>
銆銆鐪嬬湅鍦ㄧ綉緇滀笂澶ц鍏墮亾鐨勫簭鍒楀彿鍔犲瘑鐨勫伐浣滃師鐞嗐傚綋鐢ㄦ埛浠庣綉緇滀笂涓嬭澆鏌愪釜shareware鈥斺斿叡浜蔣浠跺悗錛屼竴鑸兘鏈変嬌鐢ㄦ椂闂翠笂鐨勯檺鍒訛紝褰撹繃浜嗗叡浜蔣浠剁殑璇曠敤鏈熷悗錛屼綘蹇呴』鍒拌繖涓蔣浠剁殑鍏徃鍘繪敞鍐屽悗鏂硅兘緇х畫浣跨敤銆傛敞鍐岃繃紼嬩竴鑸槸鐢ㄦ埛鎶婅嚜宸辯殑縐佷漢淇℃伅錛堜竴鑸富瑕佹寚鍚嶅瓧錛夎繛鍚屼俊鐢ㄥ崱鍙風爜鍛婅瘔緇欒蔣浠跺叕鍙革紝杞歡鍏徃浼氭牴鎹敤鎴風殑淇℃伅璁$畻鍑轟竴涓簭鍒楃爜錛屽湪鐢ㄦ埛寰楀埌榪欎釜搴忓垪鐮佸悗錛屾寜鐓ф敞鍐岄渶瑕佺殑姝ラ鍦ㄨ蔣浠朵腑杈撳叆娉ㄥ唽淇℃伅鍜屾敞鍐岀爜錛屽叾娉ㄥ唽淇℃伅鐨勫悎娉曟х敱杞歡楠岃瘉閫氳繃鍚庯紝杞歡灝變細鍙栨秷鎺夋湰韜殑鍚勭闄愬埗錛岃繖縐嶅姞瀵嗗疄鐜拌搗鏉ユ瘮杈冪畝鍗曪紝涓嶉渶瑕侀澶栫殑鎴愭湰錛岀敤鎴瘋喘涔頒篃闈炲父鏂逛究錛屽湪浜掕仈緗戜笂鐨勮蔣浠?0%閮芥槸浠ヨ繖縐嶆柟寮忔潵淇濇姢鐨勩?/p>
銆銆杞歡楠岃瘉搴忓垪鍙風殑鍚堟硶鎬ц繃紼嬶紝鍏跺疄灝辨槸楠岃瘉鐢ㄦ埛鍚嶅拰搴忓垪鍙蜂箣闂寸殑鎹㈢畻鍏崇郴鏄惁姝g‘鐨勮繃紼嬨傚叾楠岃瘉鏈鍩烘湰鐨勬湁涓ょ錛屼竴縐嶆槸鎸夌敤鎴瘋緭鍏ョ殑濮撳悕鏉ョ敓鎴愭敞鍐岀爜錛屽啀鍚岀敤鎴瘋緭鍏ョ殑娉ㄥ唽鐮佹瘮杈冿紝鍏紡琛ㄧず濡備笅錛?/p>
銆銆搴忓垪鍙?= F錛堢敤鎴峰悕錛?/p>
銆銆浣嗚繖縐嶆柟娉曠瓑浜庡湪鐢ㄦ埛杞歡涓啀鐜頒簡杞歡鍏徃鐢熸垚娉ㄥ唽鐮佺殑榪囩▼錛屽疄闄呬笂鏄潪甯鎬笉瀹夊叏鐨勶紝涓嶈鍏舵崲綆楄繃紼嬪涔堝鏉傦紝瑙e瘑鑰呭彧闇鎶婁綘鐨勬崲綆楄繃紼嬩粠紼嬪簭涓彁鍙栧嚭鏉ュ氨鍙互緙栧埗涓涓氱敤鐨勬敞鍐岀▼搴忋?/p>
銆銆鍙﹀涓縐嶆槸閫氳繃娉ㄥ唽鐮佹潵楠岃瘉鐢ㄦ埛鍚嶇殑姝g‘鎬э紝鍏紡琛ㄧず濡備笅錛?/p>
銆銆鐢ㄦ埛鍚嶇О = F閫嗭紙搴忓垪鍙鳳級 錛堝ACDSEE錛?/p>
銆銆榪欏叾瀹炴槸杞歡鍏徃娉ㄥ唽鐮佽綆楄繃紼嬬殑鍙嶇畻娉曪紝濡傛灉姝e悜綆楁硶涓庡弽鍚戠畻娉曚笉鏄縐扮畻娉曠殑璇濓紝瀵逛簬瑙e瘑鑰呮潵璇達紝鐨勭‘鏈変簺鍥伴毦錛屼絾榪欑綆楁硶鐩稿綋涓嶅ソ璁捐銆?/p>
銆銆浜庢槸鏈変漢鑰冭檻鍒頒互涓嬬殑綆楁硶錛?/p>
銆銆F1錛堢敤鎴峰悕縐幫級 = F2錛堝簭鍒楀彿錛?/p>
銆銆F1銆丗2鏄袱縐嶅畬鍏ㄤ笉鍚岀殑鐨勭畻娉曪紝浣嗙敤鎴峰悕閫氳繃F1綆楁硶璁$畻鍑虹殑鐗瑰緛瀛楃瓑浜庡簭鍒楀彿閫氳繃F2綆楁硶璁$畻鍑虹殑鐗瑰緛瀛楋紝榪欑綆楁硶鍦ㄨ璁′笂姣旇緝綆鍗曪紝淇濆瘑鎬х浉瀵逛互涓婁袱縐嶇畻娉曚篃瑕佸ソ鐨勫銆傚鏋滆兘澶熸妸F1銆丗2綆楁硶璁捐鎴愪笉鍙嗙畻娉曠殑璇濓紝淇濆瘑鎬х浉褰撶殑濂斤紱鍙竴鏃﹁В瀵嗚呮壘鍒板叾涓箣涓鐨勫弽綆楁硶鐨勮瘽錛岃繖縐嶇畻娉曞氨涓嶅畨鍏ㄤ簡銆備竴鍏冪畻娉曠殑璁捐鐪嬫潵鍐嶅浣曞姫鍔涗篃寰堥毦鏈夊お澶х殑紿佺牬錛岄偅涔堜簩鍏冨憿錛?/p>
銆銆鐗瑰畾鍊?= F錛堢敤鎴峰悕錛屽簭鍒楀彿錛?/p>
銆銆榪欎釜綆楁硶鐪嬩笂鍘葷浉褰撲笉閿欙紝鐢ㄦ埛鍚嶇О涓庡簭鍒楀彿涔嬮棿鐨勫叧緋諱笉鍐嶉偅涔堟竻鏅頒簡錛屼絾鍚屾椂涔熷け鍘諱簡鐢ㄦ埛鍚嶄簬搴忓垪鍙風殑涓涓瀵瑰簲鍏崇郴錛岃蔣浠跺紑鍙戣呭繀欏昏嚜宸辯淮鎶ょ敤鎴峰悕縐頒笌搴忓垪鍙蜂箣闂寸殑鍞竴鎬э紝浣嗚繖浼間箮涓嶆槸闅句互鍔炲埌鐨勪簨錛屽緩涓暟鎹簱灝卞彲浠ヤ簡銆傚綋鐒朵篃鍙互鎶婄敤鎴峰悕縐板拰搴忓垪鍙峰垎涓哄嚑涓儴鍒嗘潵鏋勯犲鍏冪殑綆楁硶銆?/p>
銆銆鐗瑰畾鍊?= F錛堢敤鎴峰悕1錛岀敤鎴峰悕2錛?..搴忓垪鍙?錛屽簭鍒楀彿2...錛?/p>
銆銆鐜版湁鐨勫簭鍒楀彿鍔犲瘑綆楁硶澶у鏄蔣浠跺紑鍙戣呰嚜琛岃璁$殑錛屽ぇ閮ㄥ垎鐩稿綋綆鍗曘傝屼笖鏈変簺綆楁硶浣滆呰櫧鐒朵笅浜嗗緢澶х殑鍔熷か錛屾晥鏋滃嵈寰寰寰椾笉鍒板畠鎵甯屾湜鐨勭粨鏋溿?/p>
銆銆3.2聽聽 鏃墮棿闄愬埗
銆銆鏈変簺紼嬪簭鐨勮瘯鐢ㄧ増姣忔榪愯閮芥湁鏃墮棿闄愬埗錛屼緥濡傝繍琛?0鍒嗛挓鎴?0鍒嗛挓灝卞仠姝㈠伐浣滐紝蹇呴』閲嶆柊榪愯璇ョ▼搴忔墠鑳芥甯稿伐浣溿傝繖浜涚▼搴忛噷闈㈣嚜鐒舵湁涓畾鏃跺櫒鏉ョ粺璁$▼搴忚繍琛岀殑鏃墮棿銆?/p>
銆銆榪欑鏂規硶浣跨敤鐨勮緝灝戙?/p>
銆銆3.3聽聽 Key File 淇濇姢
銆銆Key File錛堟敞鍐屾枃浠訛級鏄竴縐嶅埄鐢ㄦ枃浠舵潵娉ㄥ唽杞歡鐨勪繚鎶ゆ柟寮忋侹ey File涓鑸槸涓涓皬鏂囦歡錛屽彲浠ユ槸綰枃鏈枃浠訛紝涔熷彲浠ユ槸鍖呭惈涓嶅彲鏄劇ず瀛楃鐨勪簩榪涘埗鏂囦歡錛屽叾鍐呭鏄竴浜涘姞瀵嗚繃鎴栨湭鍔犲瘑鐨勬暟鎹紝鍏朵腑鍙兘鏈夌敤鎴峰悕銆佹敞鍐岀爜絳変俊鎭傛枃浠舵牸寮忓垯鐢辮蔣浠朵綔鑰呰嚜宸卞畾涔夈傝瘯鐢ㄧ増杞歡娌℃湁娉ㄥ唽鏂囦歡錛屽綋鐢ㄦ埛鍚戜綔鑰呬粯璐規敞鍐屼箣鍚庯紝浼氭敹鍒頒綔鑰呭瘎鏉ョ殑娉ㄥ唽鏂囦歡錛屽叾涓彲鑳藉寘鍚敤鎴風殑涓漢淇℃伅銆傜敤鎴峰彧瑕佸皢璇ユ枃浠舵斁鍏ユ寚瀹氱殑鐩綍錛屽氨鍙互璁╄蔣浠舵垚涓烘寮忕増銆傝鏂囦歡涓鑸槸鏀懼湪杞歡鐨勫畨瑁呯洰褰曚腑鎴栫郴緇熺洰褰曚笅銆傝蔣浠舵瘡嬈″惎鍔ㄦ椂錛屼粠璇ユ枃浠朵腑璇誨彇鏁版嵁錛岀劧鍚庡埄鐢ㄦ煇縐嶇畻娉曡繘琛屽鐞嗭紝鏍規嵁澶勭悊鐨勭粨鏋滃垽鏂槸鍚︿負姝g‘鐨勬敞鍐屾枃浠訛紝濡傛灉姝g‘鍒欎互娉ㄥ唽鐗堟ā寮忔潵榪愯銆?/p>
銆銆榪欑淇濇姢鏂規硶浣跨敤涔熶笉澶氥?/p>
銆銆3.4聽聽 CD-check
銆銆鍗沖厜鐩樹繚鎶ゆ妧鏈傜▼搴忓湪鍚姩鏃跺垽鏂厜椹變腑鐨勫厜鐩樹笂鏄惁瀛樺湪鐗瑰畾鐨勬枃浠訛紝濡傛灉涓嶅瓨鍦ㄥ垯璁や負鐢ㄦ埛娌℃湁姝g増鍏夌洏錛屾嫆緇濊繍琛屻傚湪紼嬪簭榪愯鐨勮繃紼嬪綋涓竴鑸笉鍐嶆鏌ュ厜鐩樼殑瀛樺湪涓庡惁銆俉indows涓嬬殑鍏蜂綋瀹炵幇涓鑸槸榪欐牱鐨勶細鍏堢敤GetLogicalDriveStrings錛?錛夋垨GetLogicalDrives錛?錛夊緱鍒扮郴緇熶腑瀹夎鐨勬墍鏈夐┍鍔ㄥ櫒鐨勫垪琛紝鐒跺悗鍐嶇敤GetDriveType錛?錛夋鏌ユ瘡涓涓┍鍔ㄥ櫒錛屽鏋滄槸鍏夐┍鍒欑敤CreateFileA錛?錛夋垨FindFirstFileA錛?錛夌瓑鍑芥暟媯鏌ョ壒瀹氱殑鏂囦歡瀛樺湪涓庡惁錛屽茍鍙兘榪涗竴姝ュ湴媯鏌ユ枃浠剁殑灞炴с佸ぇ灝忋佸唴瀹圭瓑銆?/p>
銆銆3.5聽聽 杞歡鐙?/p>
銆銆杞歡鐙楁槸涓縐嶆櫤鑳藉瀷鍔犲瘑宸ュ叿銆傚畠鏄竴涓畨瑁呭湪騫跺彛銆佷覆鍙g瓑鎺ュ彛涓婄殑紜歡鐢佃礬錛屽悓鏃舵湁涓濂椾嬌鐢ㄤ簬鍚勭璇█鐨勬帴鍙h蔣浠跺拰宸ュ叿杞歡銆傚綋琚嫍淇濇姢鐨勮蔣浠惰繍琛屾椂錛岀▼搴忓悜鎻掑湪璁$畻鏈轟笂鐨勮蔣浠剁嫍鍙戝嚭鏌ヨ鍛戒護錛岃蔣浠剁嫍榪呴熻綆楁煡璇㈠茍緇欏嚭鍝嶅簲錛屾紜殑鍝嶅簲淇濊瘉杞歡緇х畫榪愯銆傚鏋滄病鏈夎蔣浠剁嫍錛岀▼搴忓皢涓嶈兘榪愯錛屽鏉傜殑杞‖浠舵妧鏈粨鍚堝湪涓璧烽槻姝㈣蔣浠剁洍鐗堛傜湡姝f湁鍟嗕笟浠峰煎緱杞歡涓鑸兘鐢ㄨ蔣浠剁嫍鏉ヤ繚鎶ゃ?/p>
銆銆騫蟲椂甯歌鐨勭嫍涓昏鏈夆滄磱鐙椻濓紙鍥藉鐙楋級鍜屸滃湡鐙椻濓紙鍥戒駭鐙楋級銆傝繖閲屸滄磱鐙椻濅富瑕佹寚緹庡浗鐨勫僵铏瑰拰浠ヨ壊鍒楃殑HASP錛屸滃湡鐙椻濅富瑕佹湁閲戝ぉ鍦幫紙鐜板湪涓庣編鍥藉僵铏瑰悎璧勶紝鍙滃僵铏瑰ぉ鍦扳濓級銆佹繁鎬濄佸皷鐭熾傛葷殑璇存潵錛屸滄磱鐙椻濆湪杞歡鎺ュ彛銆佸姞澹熾佸弽璺熻釜絳夆滆蔣鈥濇柟闈㈡病鏈夆滃湡鐙椻濆ソ錛屼絾鍦ㄧ‖浠朵笂鐮磋В闅懼害闈炲父澶э紱鑰屸滃湡鐙椻濆湪杞殑鏂歸潰鍋氱殑寰堝ソ錛屼絾鍦ㄧ‖浠朵笂涓嶅鈥滄磱鐙椻濓紝紼嶆湁鍗曠墖鏈哄姛鍔涚殑浜猴紝閮藉彲浠ュ鍒躲?/p>
銆銆3.6聽聽 杞洏鍔犲瘑
銆銆閫氳繃鍦ㄨ蔣鐩樹笂鏍煎紡鍖栦竴浜涢潪鏍囧噯紓侀亾錛屽湪榪欎簺紓侀亾涓婂啓鍏ヤ竴浜涙暟鎹紝濡傝蔣浠剁殑瑙e瘑瀵嗛挜絳夌瓑銆傝繖縐嶈蔣鐩樻垚涓衡滈挜鍖欑洏鈥濄傝蔣浠惰繍琛屾椂鐢ㄦ埛灝嗚蔣鐩樻彃鍏ワ紝杞歡璇誨彇榪欎簺紓侀亾涓殑鏁版嵁錛屽垽鏂槸鍚﹀悎娉曠殑鈥滈挜鍖欑洏鈥濄?/p>
銆銆杞洏鍔犲瘑榪樻湁鍏跺畠涓浜涙妧鏈紝濡傚急浣嶅姞瀵嗙瓑絳夈?/p>
銆銆闅忕潃榪戝勾鏉ヨ蔣鐩樼殑娌¤惤錛岃繖縐嶆柟娉曞熀鏈笂閫鍑轟簡鍘嗗彶鑸炲彴銆?/p>
銆銆3.7聽聽 灝嗚蔣浠朵笌鏈哄櫒紜歡淇℃伅緇撳悎
銆銆鐢ㄦ埛寰楀埌錛堜拱鍒版垨浠庣綉涓婁笅杞斤級杞歡鍚庯紝瀹夎鏃惰蔣浠朵粠鐢ㄦ埛鐨勬満鍣ㄤ笂鍙栧緱璇ユ満鍣ㄧ殑涓浜涚‖浠朵俊鎭紙濡傜‖鐩樺簭鍒楀彿銆丅OIS搴忓垪鍙風瓑絳夛級錛岀劧鍚庢妸榪欎簺淇℃伅鍜岀敤鎴風殑搴忓垪鍙楓佺敤鎴峰悕絳夎繘琛岃綆楋紝浠庤屽湪涓瀹氱▼搴︿笂灝嗚蔣浠跺拰紜歡閮ㄥ垎緇戝畾銆傜敤鎴烽渶瑕佹妸榪欎竴搴忓垪鍙風敤Email銆佺數璇濇垨閭瘎絳夋柟娉曞瘎緇欒蔣浠舵彁渚涘晢鎴栧紑鍙戝晢錛岃蔣浠跺紑鍙戝晢鍒╃敤娉ㄥ唽鏈猴紙杞歡錛変駭鐢熻杞歡鐨勬敞鍐屽彿瀵勭粰鐢ㄦ埛鍗沖彲銆傝蔣浠跺姞瀵嗚櫧鐒跺姞瀵嗗己搴︽瘮紜歡鏂規硶杈冨急錛屼絾瀹冨叿鏈夐潪甯稿粔浠風殑鎴愭湰銆佹柟渚跨殑浣跨敤鏂規硶絳変紭鐐廣傞潪甯擱傚悎鍋氫負閲囩敤鍏夌洏錛圕DROM錛夌瓑鏂瑰紡鍙戞巿杞歡鐨勫姞瀵嗘柟妗堛?/p>
銆銆姝ょ鍔犲瘑綆楁硶鐨勪紭鐐?/p>
銆銆路聽聽聽 涓嶅悓鏈哄櫒娉ㄥ唽鐮佷笉鍚屻傜敤鎴瘋幏寰椾竴涓瘑鐮佸彧鑳藉湪涓鍙版満鍣ㄤ笂娉ㄥ唽浣跨敤杞歡銆備笉鍚屼簬鐩墠澶у杞歡閲囩敤鐨勬敞鍐屾柟娉曪紝鍗沖彧瑕佺煡閬撴敞鍐岀爜錛屽彲鍦ㄤ換浣曟満鍣ㄤ笂瀹夎娉ㄥ唽銆?/p>
銆銆路聽聽聽 涓嶉渶瑕佷換浣曠‖浠舵垨杞洏
銆銆路聽聽聽 鍙互閫夋嫨鎺у埗杞歡榪愯鍦ㄤ粈涔堟満鍣ㄣ佽繍琛屽闀挎椂闂存垨嬈℃暟絳?/p>
銆銆路聽聽聽 鍙杞歡鍦ㄤ笉娉ㄥ唽鍓嶇殑鍔熻兘涓烘紨紺鴻蔣浠訛紝鍙兘榪愯涓孌墊椂闂存垨閮ㄥ垎鍔熻兘銆傛敞鍐屽悗灝辯珛鍗沖彉涓烘寮忚蔣浠?/p>
銆銆路聽聽聽 閲囩敤鐗瑰埆鎶鏈紝瑙e瘑鑰呭緢闅炬壘鍒頒駭鐢熸敞鍐屽彿鐮佺殑瑙勫緥
銆銆路聽聽聽 鍦ㄤ嬌鐢ㄦ敞鍐屽彿浜х敓杞歡錛堟敞鍐屾満錛夋椂鍙噰鐢ㄤ嬌鐢ㄥ瘑鐮併佸瘑閽ョ洏銆佹繪鏁伴檺鍒剁瓑鏂規硶
銆銆路聽聽聽 鏂逛究鏄撶敤錛屼環鏍間綆寤夈?/p>
銆銆榪欑鍔犲瘑榪樻湁浠ヤ笅鐗圭偣
銆銆1銆?娉ㄥ唽鍔犲瘑鐨勮蔣浠訛紝鍙兘鍦ㄤ竴鍙版満鍣ㄤ笂瀹夎浣跨敤銆傛妸杞歡鎷瘋礉鍒板叾瀹冩満鍣ㄤ笂涓嶈兘榪愯銆?/p>
銆銆2銆?鑻ョ敤鎴鋒兂鍦ㄥ彟涓鏈哄櫒涓婂畨瑁呰繍琛岋紝蹇呴』鎶婅蔣浠跺湪榪欎竴鏈哄櫒涓婅繍琛屾椂鐨勫簭鍒楀彿錛屽瘎緇欒蔣浠跺嚭鐗堝晢鎹㈠彇娉ㄥ唽瀵嗙爜銆傚綋鐒跺簲鍐嶄氦涓浠借蔣浠惰垂鐢ㄣ?/p>
銆銆3銆?姝ゅ姞瀵嗘柟娉曠壒鍒傚簲鍦ㄥ洜鐗圭綉涓婂彂甯冪殑杞歡鍙婄敤鍏夌洏鍙戝竷鐨勮蔣浠躲?/p>
銆銆娉ㄩ噴錛?/p>
銆銆1銆佲滃姞瀵嗘妧鏈榪扳濋儴鍒嗗唴瀹瑰弬鑰冧簡澶у鏁欐潗鈥滃瘑鐮佸鍩虹鈥濄?/p>
銆銆2銆佲滃綋鍓嶆祦琛岀殑涓浜涜蔣浠朵繚鎶ゆ妧鏈濋儴鍒嗗唴瀹瑰弬鑰冧簡鈥滃姞瀵嗕笌瑙e瘑--杞歡淇濇姢鎶鏈強瀹屽叏瑙e喅鏂規鈥濅竴鏂囥?/p>
銆銆鏃犳暟嬈″惉鍒扳滄垜瑕佸紑濮嬪涔燙++!鈥濈殑鍛愬枈錛屾棤鏁版鍚埌鈥淐++澶鏉備簡錛屾垜鐪熺殑瀛︿笉浼氣濈殑鏃犲銆係tan Lippman鍏堢敓鏇懼湪銆奀++ Primer銆嬩竴涔︿腑鎸囧嚭鈥淐++鏄渶涓洪毦瀛︾殑楂樼駭紼嬪簭璁捐璇█涔嬩竴鈥濓紝浜轟滑甯稿皢鈥滀箣涓鈥濆幓鎺変互琛ㄨ揪鑷繁瀵笴++鐨勬暚鐣忋傝瘹鐒訛紝C++紼嬪簭璁捐璇█瀵逛簬瀛︿範鑰呯殑紜湁寰堝闅句互閫捐秺鐨勯縛娌燂紝浣撶郴緇撴瀯鐨勫簽澶э紝搴旀帴涓嶆殗騫朵笉鏂墿鍏呯殑鐗規р︹﹂櫎姝や箣澶栵紝鍙傝冭祫鏂欎箣澶氫笌鍐楁潅浣垮畠鐨勫涔犺呮湜鑰屽嵈姝ワ紝嬈叉眰娣卞叆鑰呰嫤涓嶅牚璦銆傚笇鏈涜繖涓浠戒笉瀹屽叏瀵煎紩鑳藉鎴愪負鎮–++瀛︿範涔嬭礬涓婄殑寮曡礬鐏?/p>
銆銆鎾板啓鏈枃鐨勫垵琛峰茍涓嶆墦綆楀甫棰嗗ぇ瀹朵綋楠屽彜鑰佺殑C++鍘嗗彶錛屽鏋滀綘鎯充簡瑙++鐨勫巻鍙蹭笌鍏跺墠鏈熷彂灞曚腑璇稿鎶鏈殑婕斿彉錛屼綘搴斿綋鍘誨弬鑰傿jarne鐨勩奣he Design and Evolution of C++銆嬨傚綋鐒朵篃涓嶆墦綆楃粰澶у涓涓棤鎵涓嶅寘鐨勫疂鍏革紙騫墮潪涓嶆兂錛氬叾涓鏄洜姘村鉤鏈夐檺錛屽叾浜屾棤濂圕++涔嬪崥澶х簿娣憋級錛屾墍緇欏嚭鐨勪粎浠呮槸涓浜涙垜浠涓哄浜庢兂瀛︿範C++鐨勫箍澶ц鑰呮潵璇存渶閲嶈騫朵笖瑙︽墜鍙強鐨勫紑鍙戜笌瀛︿範璧勬簮銆?/p>
銆銆鏈枃浠嬬粛騫跺垎鏋愪簡涓浜涚紪璇戝櫒錛屽紑鍙戠幆澧冿紝搴擄紝灝戦噺鐨勪功綾嶄互鍙婂弬鑰冪綉绔欙紝騫朵笖灝藉彲鑳藉皾璇曠潃緇欏嚭涓涓埄鐢ㄨ繖浜涜祫婧愮殑瀵煎紩錛屾湜瀵瑰鍚屾垜浠竴鏍風殑鍒濆鑰呰兘澶熸湁鎵瑁ㄧ泭銆?/p>
聽聽聽 銆2錛岀紪璇戝櫒
銆銆鍦–++涔嬪鐨勪換浣曡璦涓紝緙栬瘧鍣ㄩ兘浠庢潵娌℃湁鍙楀埌榪囧姝や箣閲嶈銆傚洜涓篊++鏄竴闂ㄧ浉褰撳鏉傜殑璇█錛屾墍浠ョ紪璇戝櫒涔熼毦浜庢瀯寤恒傜洿鍒版渶榪戞垜浠墠寮濮嬭兘澶熶嬌鐢ㄤ笂瀹屽叏絎﹀悎C++鏍囧噯鐨勭紪璇戝櫒錛堝摝錛屼綘鍙兘浼氳矗鎬偅浜涚紪璇戝櫒鍘傚晢涓嶈兘灝芥棭鐨勬彁渚涚鍚堟爣鍑嗙殑緙栬瘧鍣紝榪欏彧鑳芥粬浠悇鑷淮緋葷潃鑷韓鐨勪竴濂楀埆浜轟笉鎰挎帴鍙楃殑鏍囧噯錛夈備粈涔堬紵浣犺榪欐棤鍏崇揣瑕侊紵鍝︼紝涓嶏紝浣犳墍闇瑕佺殑鏄拰鏍囧噯鍖朇++楂樺害鍏煎鐨勭紪璇戠幆澧冦傞暱榪滄潵鐪?br />錛屽彧鏈夎繖鏍風殑緙栬瘧鍣ㄥC++寮鍙戜漢鍛樻潵璇存墠鏄渶鏈夋剰涔夌殑宸ュ叿錛屽挨鍏舵槸瀵逛簬紼嬪簭璁捐璇█鐨勫涔犺呫備竴鑷蟲ц浠g爜鍏峰鍙Щ妞嶆э紝騫惰涓闂ㄨ璦鍙婂叾搴撶殑搴旂敤鏇翠負騫挎硾銆傚棷錛屾槸鐨勶紝鎴戜滑榪欓噷鍙墦綆椾粙緇嶄竴浜涘叕璁ょ殑浼樼緙栬瘧鍣ㄣ?/p>
銆銆2.1 Borland C++
銆銆榪欎釜鏄疊orland C++ Builder鍜孊orland C++ Builder X榪欎袱縐嶅紑鍙戠幆澧冪殑鍚庡彴緙栬瘧鍣ㄣ傦紙鍝︼紝鎴戜箣鎵浠ュ皢涔嬪垎涓轟袱縐嶅紑鍙戠幆澧冧綘搴斿綋鑳芥槑鐧戒負浠涔堬紝姝eDelphi7鍒癉elphi8鐨勮漿鍙橈紝鏄潻鍛芥х殑涓や唬銆傦級Borland C++鐢辮佺墝寮鍙戝伐鍏峰巶鍟咮orland鍊懼姏鎵撻犮傝鍏徃鐨勭紪璇戝櫒绱犱互閫熷害蹇紝絀洪棿鏁堢巼楂樿憲縐幫紝Borland C++ 緋誨垪緙栬瘧鍣ㄧ鎵夸簡榪欎釜浼犵粺錛屽睘浜庨潪甯鎬紭璐ㄧ殑緙栬瘧鍣ㄣ傛爣鍑嗗寲鏂歸潰鏃╁湪5.5鐗堟湰鐨勭紪璇戝櫒涓鏍囧噯鍖朇++鐨勫吋瀹瑰氨杈懼埌浜?2.73%銆傜洰鍓嶆渶鏂扮増鏈槸Borland C++ Builder X涓殑6.0鐗堟湰錛屽畼鏂圭О100%絎﹀悎ANSI/ISO鐨凜++鏍囧噯浠ュ強C99鏍囧噯銆傚棷鈥﹁繖姝f槸鎴戝墠闈㈡墍鎸囩殑鈥滃畬鍏ㄧ鍚圕++鏍囧噯鐨勭紪璇戝櫒鈥濄?/p>
銆銆2.2 Visual C++
銆銆榪欎釜姝f槸鎴戜滑鐔熺煡鐨刅isual Studio 鍜?Visual Studio.net 2002, 2003浠ュ強2005 Whidbey涓甫鐨凜++緙栬瘧鍣ㄣ傜敱Microsoft鍏徃鐮斿埗銆傚湪Visual Studio 6.0涓紝鍥犱負緙栬瘧鍣ㄦ湁澶鍦版柟涓嶈兘涓庡悗鏉ュ嚭鐜扮殑C++鏍囧噯鐩稿惢鍚堣岄ケ鍙楁壒璇勶紙鎯蟲兂浣犲湪浣跨敤STL鐨勬椂鍊欑紪璇戞椂鎶ュ嚭鐨勯偅浜涗護浜哄帉鎭剁殑error鍜寃arning鍚э級銆俈C++6.0瀵規爣鍑嗗寲C+
+鐨勫吋瀹瑰彧鏈?3.43%銆備絾鏄殢鐫C++緙栬瘧鍣ㄨ璁″ぇ甯圫tanley Lippman浠ュ強璇稿C++紺劇兢杈句漢鐨勫姞鐩燂紝鍦╒isual Studio.NET 2003涓紝Visual C++緙栬瘧鍣ㄥ凡緇忔垚涓轟竴涓潪甯告垚鐔熷彲*鐨凜++緙栬瘧鍣ㄤ簡銆侱r.Dobb's Journal鐨勮瘎嫻嬫樉紺篤isual C++7.1瀵規爣鍑咰++鐨勫吋瀹規ч珮杈?8.22%錛屼竴搴︽垚涓篊BX涔嬪墠鍏煎鎬ф渶濂界殑緙栬瘧鍣ㄣ傜粨鍚堝己澶х殑Visual Studio.NET寮鍙戠幆澧冿紝鏄竴涓潪甯鎬笉閿欑殑閫夋嫨銆傝嚦浜嶹hidbey鏃朵唬鐨刅isual C++,浼間箮寰蔣鎵鏈鍏蟲敞鐨勬槸C++/CLI鈥︹︽垜浠笉鎯寵瘎璁哄井杞笅涓浠g殑C++緙栬瘧鍣ㄥ鏍囧噯鍖栧吋瀹瑰浣曪紝浣嗕粬紜疄瓚婃潵瓚婇傚悎.NET (鍏跺疄浣犲拰鎴戠殑鎰熻鍙兘鏄竴鏍風殑錛屽井杞笉搴斿綋鎶婃爣鍑咰++榪欏潡鑲ヨ倝涓㈢粰Borland,鐒惰屽井杞彲鑳藉茍涓嶈繖鏍瘋涓?銆?/p>
銆銆2.3 GNU C++
銆銆钁楀悕鐨勫紑婧怌++緙栬瘧鍣ㄣ傛槸綾籙nix鎿嶄綔緋葷粺涓嬬紪鍐機++紼嬪簭鐨勯閫夈傜壒鐐規槸鏈夐潪甯稿ソ鐨勭Щ妞嶆э紝浣犲彲浠ュ湪闈炲父騫挎硾鐨勫鉤鍙頒笂浣跨敤瀹冿紝鍚屾椂涔熸槸緙栧啓璺ㄥ鉤鍙幫紝宓屽叆寮忕▼搴忓緢濂界殑閫夋嫨銆傚彟澶栧湪絎﹀悎鏍囧噯榪欎釜鏂歸潰涓鐩撮兘闈炲父濂斤紝GCC3.3澶ф鑳藉杈懼埌96.15%銆備絾鏄敱浜庡叾璺ㄥ鉤鍙扮殑鐗規э紝鍦ㄤ唬鐮佸昂瀵擱熷害絳変紭鍖栦笂鐣ュ井宸竴鐐廣?/p>
銆銆鍩轟簬GNU C++鐨勭紪璇戝櫒鏈夊緢澶氾紝姣斿錛?/p>
銆銆(1) Mingw
銆銆GCC鐨勪竴涓猈indows鐨勭Щ妞嶇増鏈紙Dev-C++鐨勫悗鍙幫級
銆銆(2) Cygwin
銆銆http://sources.redhat.com/cygwin/
銆銆GCC鐨勫彟澶栦竴涓猈indows縐繪鐗堟湰鏄疌ygwin鐨勪竴閮ㄥ垎錛孋ygwin鏄疻indows涓嬬殑涓涓猆nix浠跨湡鐜銆備弗鏍肩殑璇存槸妯℃嫙GNU鐨勭幆澧冿紝榪欎篃灝辨槸"Gnu's Not Unix"瑕佽〃杈劇殑鎰忔濓紝鍣紝鎵繙浜嗭紝榪欏茍涓嶆槸鎴戜滑鍦ㄨ繖閲屽叧蹇冪殑瀹炶川鍐呭銆?/p>
銆銆(3) Djgpp
銆銆http://www.delorie.com/djgpp/
銆銆榪欐槸GCC鐨凞OS縐繪鐗堟湰銆?/p>
銆銆(4) RSXNT
銆銆http://www.mathematik.uni-bielefeld.de/~rainer/
銆銆榪欐槸GCC鐨凞OS鍜學indows縐繪鐗堟湰銆?/p>
銆銆(5) Intel C++
銆銆钁楀悕CPU鍒墮犲巶鍟咺ntel鍑哄搧鐨勭紪璇戝櫒錛孲pecial Design for Intel x86錛佸浜嶪ntel x86緇撴瀯鐨凜PU緇忚繃鐗瑰埆鐨勪紭鍖栥傚湪鏈変簺搴旂敤鎯呭喌涓嬶紝鐗瑰埆鏄暟鍊艱綆楃瓑楂樻ц兘搴旂敤錛屼粎浠呴噰鐢↖ntel鐨勭紪璇戝櫒緙栬瘧灝辮兘澶у箙搴︾殑鎻愰珮鎬ц兘銆?/p>
銆銆(6) Digital Mars C++
銆銆緗戠粶涓婃彁渚涘厤璐逛笅杞斤紝Zortech/Symantec C++鐨勭戶鎵胯咃紝鍏跺墠韜湪褰撳勾鎯ㄧ儓鐨凜++鍥涘浗鎴樹腑涔熸槸涓昏涔嬩竴銆?/p>
銆銆3錛屽紑鍙戠幆澧?/p>
銆銆寮鍙戠幆澧冨浜庣▼搴忓憳鐨勪綔鐢ㄤ笉璦鑰屽柣銆傞夋嫨鑷繁鏈濆鐩稿鐨勭幆澧冧篃涓嶆槸瀹規槗鐨勪簨鎯咃紝鐗瑰埆鏄湪IDE濡傛涓板瘜鐨勬儏鍐典笅銆備笅闈㈠氨鏄垜浠帹鑽愮殑涓浜涘父瑙佺殑C++寮鍙戠幆澧冿紝騫舵病鏈夊寘鎷竴浜涘皬鍨嬬殑錛岀綍瑙佺殑IDE銆傚叾涓換浣曚竴嬈鵑兘鏄姛鑳戒赴瀵岋紝鍙互鐢ㄤ綔鏃ュ父寮鍙戜嬌鐢ㄧ殑銆傚浜庝笉鍚屽眰闈㈢殑寮鍙戣咃紝璇峰弬瑙佸唴鏂囧叧浜庨傜敤瀵硅薄鐨勬弿榪般?/p>
銆銆3.1 Visual Studio 6.0
銆銆榪欎釜铏界劧鏄疢icrosoft鍏徃鐨勮佺増鏈殑寮鍙戠幆澧冿紝浣嗘槸閴翠簬鍏跺悗緇х増鏈琕isualStudio.NET鐨勫簽澶ц韓韜紝浠ュ強鍒濆鑰呭茍涓嶉偅涔堥珮鐨勫姛鑳借姹傦紝鎵浠ユ帹鑽愯繖涓紑鍙戠幆澧冪粰C++鐨勫垵瀛﹁咃紝渚涘叾瀛︿範C++鐨勬渶鍩烘湰鐨勯儴鍒嗭紝姣斿C鐨勯偅閮ㄥ垎瀛愰泦錛屽綋鐒朵綘鍒寚鏈涗粬鑳藉鏀寔鏈鏂扮殑C99鏍囧噯銆傚湪鏃ュ父鐨勫紑鍙戜腑錛屼粛鐒舵湁寰堝鍏徃浣跨敤榪欎釜緇忓吀紼沖畾鐨勭幆澧冿紝姣斿絎旇呭氨鐪嬫浘浜茶鏈変簺鍏徃灝嗗叾緙栬瘧鍣ㄦ浛鎹負GCC鍋氭墜鏈哄紑鍙戜箣鐢ㄣ?/p>
銆銆3.2 Visual Studio.NET 2003
銆銆浣滀負Microsoft鍏徃瀹樻柟姝e紡鍙戝竷鐨勬渶鏂扮増鏈紑鍙戠幆澧冿紝鍏朵腑鏈夊お澶氭縺鍔ㄤ漢蹇冪殑鍔熻兘銆傜粨鍚堝叾鏈鏂扮殑C++緙栬瘧鍣ㄣ傚浜庢満鍣ㄩ厤緗瘮杈冨ソ鐨勫紑鍙戜漢鍛樻潵璇達紝浣跨敤榪欎釜寮鍙戠幆澧冨皢鑳芥弧瓚沖叾澶ч儴鍒嗙殑瑕佹眰銆傝繖閲屼笉鎵撶畻鍗曠嫭璇碫isual Studio Whidbey,铏界劧Visual Studio .NET 2005 - Whidbey紺懼尯棰勮鐗堝凡緇忔帹鍑猴紝浣嗘殏涓嶆槸寰堢ǔ瀹氾紝璇昏呭彲浠ヤ翰韜幓浣撻獙銆?/p>
銆銆3.3 Borland C++ Builder 6
銆銆榪欎釜騫朵笉鏄疊orland鐨凜++寮鍙戠幆澧冪殑鏈鏂扮増鏈傞夋嫨瀹冪殑鍘熷洜鏄畠涓嶆槸鐢↗ava鍐欑殑IDE錛岄熷害姣旇緝蹇傚畠鏈変竴涓緢瀹屽杽鐨凣UI紿椾綋璁捐鍣紝鍜孌elphi鍏辯敤涓涓猇CL銆傜敱浜庤繖浜涚壒鐐癸紝姣旇緝閫傚悎鍒濆鑰呬笂鎵嬨備絾鏄敱浜庡叾GUI鐨勪腑蹇冧綅緗紝鍙兘涓嶅埄浜庡浜嶤++璇█鐨勫涔犮傝屼笖鍏朵負浜嗘敮鎸乂CL榪欎釜Object Pascal鍐欑殑搴撲篃瀵笴++榪涜浜嗕竴浜涚鏈夌殑鎵╁厖銆備嬌寰椾漢浠湁涓涓笉寰椾笉鎺ュ彈鐨勪簨瀹烇細鈥淏orland C++ Builder 6鐨勯珮鎵?br />鍑犱箮閮芥槸Delphi楂樻墜鈥濄?/p>
銆銆3.4 Borland C++ Builder X
銆銆姝e鍓嶆枃鎵榪幫紝铏界劧鐗堟湰鍙蜂笂鍜屽墠闈㈤偅涓狪DE闈炲父鐩歌薄錛屼絾鏄叾瀹炲畠浠槸瀹屽叏涓嶅悓鐨勪袱涓泦鎴愬紑鍙戠幆澧冦侰++Builder鏇村鐨勬槸涓涓拰Delphi鍚屾鐨凜++鐗堟湰鐨勫紑鍙戠幆澧冿紝C++BuilderX鍒欐槸瀹屽叏浠嶤++鐨勮搴︽濊冨緱鍑虹殑涓涓姛鑳戒赴瀵岀殑IDE銆傚叾鏈澶х殑鐗圭偣鏄法騫沖彴錛岃法緙栬瘧鍣紝澶氱Framework鐨勯泦鎴愶紝騫朵笖鏈変竴涓猈xWindows涓哄熀紜鐨凣UI璁捐鍣ㄣ傚挨鍏舵槸閲囩敤浜嗙函C++鏉ラ噸鍐欎簡鏁翠釜Framework,鎽掑純浜嗕互鍓嶄護浜烘棤濂堢殑鐗堟湰銆傚浜嶤++鐨勫紑鍙戞潵璇達紝浠庣紪璇戝櫒錛屽埌搴擄紝鍒板姛鑳介泦鎴愰兘鏄潪甯哥悊鎯崇殑銆傚彲浠ラ瑙侊紝Borland C++ Builder X 2.0寰堝煎緱C++鐖卞ソ鑰呮湡寰呫傚敮涓浠や漢闅懼牚涔嬪鏄綔涓轟竴涓狢++鐨勫紑鍙戝伐鍏鳳紝鍏禝DE鏄敤Java鍐欑殑錛屽湪閰嶇疆涓嶅鐞嗘兂鐨勬満鍣ㄤ笂璇鋒厧閲嶈冭檻鍐嶅畨瑁呫?/p>
銆銆3.5 Emacs + GCC
銆銆鍓嶉潰璁茬殑澶ч儴鍒嗘槸Windows鐜涓嬬殑闆嗘垚寮鍙戠幆澧冦侺inux涓婄殑寮鍙戣呮洿鍊懼悜浜庝嬌鐢‥macs鏉ョ紪杈慍++鐨勬枃浠訛紝鐢∕akefile鏉ュ懡浠CC鍋氱紪璇戙傝櫧鐒剁湅涓婂幓姣旇緝鏉炬暎錛屼絾鏄繖浜涗笢瑗跨患鍚堣搗鏉ヨ繕鏄竴涓紑0鍙戠幆澧冦傚鏋滀綘鑳藉濞寸啛鐨勪嬌鐢ㄨ繖鏍風殑鐜鍐欑▼搴忥紝浣犵殑姘村鉤搴旇瓚沖鎸囧鎴戜滑鏉ュ啓榪欑瘒闄嬫枃浜嗐?/p>
銆銆3.6 Dev C++
銆銆GCC鏄竴涓緢濂界殑緙栬瘧鍣ㄣ傚湪Windows涓婄殑C++緙栬瘧鍣ㄤ竴鐩村拰鏍囧噯鏈夌潃涓孌佃窛紱葷殑鏃跺欙紝GCC灝辨槸涓涓Windows涓嬪紑鍙戣呮祦鍙f按鐨勭紪璇戝櫒銆侱ev-C++灝辨槸鑳藉璁〨CC璺戝湪Windows涓嬬殑宸ュ叿錛屼綔涓洪泦鎴愬紑鍙戠幆澧冿紝榪樻彁渚涗簡鍚屼笓涓欼DE鐩稿緹庣殑璇硶楂樹寒錛屼唬鐮佹彁紺猴紝璋冭瘯絳夊姛鑳姐傜敱浜庝嬌鐢―elphi寮鍙戯紝鍗犵敤鍐呭瓨灝戯紝閫熷害寰堝揩錛屾瘮杈冮傚悎杞婚噺綰х殑瀛︿範鍜屼嬌鐢ㄣ?/p>
銆銆3.7 Eclipse + CDT
銆銆Eclipse鍙槸榪戞潵澶у悕榧庨紟鐨勫紑鍙戝伐鍏楓傛渶鏂頒竴鏈熺殑Jolt澶у灝遍緇欎簡榪欎釜鏉板嚭鐨勭鐗┿傝鍏剁濂囨槸鍥犱負錛屽畠鏈韓鏄敤Java鍐欑殑錛屼絾鏄嫢鏈夋瘮涓鑸琂ava鍐欑殑紼嬪簭蹇緱澶氱殑閫熷害銆傝屼笖鍥犱負鍏跺熀浜庢彃浠剁粍瑁呬竴鍒囩殑鍘熷垯錛屼嬌寰楄兘澶熸湁CDT榪欐牱鐨勬彃浠舵妸Eclipse鍙樻垚涓涓狢/C++鐨勫紑鍙戠幆澧冦傚鏋滀綘涓鐩寸敤Eclipse鍐橨ava鐨勭▼搴忥紝涓嶅Θ鐢ㄥ畠浣撻獙涓涓婥++寮鍙戠殑涔愯叮銆?/p>
--------------------------------------------------------------------------------
銆銆4錛屽伐鍏?/p>
銆銆C++鐨勮緟鍔╁伐鍏風箒澶氾紝鎴戜滑鍒嗛棬鍒被鐨勪負澶у浣滀粙緇嶏細
銆銆4.1 鏂囨。綾?/p>
銆銆(1) Doxygen
銆銆鍙傝冪珯鐐癸細http://www.doxygen.org/
銆銆Doxygen鏄竴縐嶉傚悎C椋庢牸璇█錛堝C++銆丆銆両DL銆丣ava鐢氳嚦鍖呮嫭C#鍜孭HP錛夌殑銆佸紑鏀炬簮鐮佺殑銆佸熀浜庡懡浠よ鐨勬枃妗d駭鐢熷櫒銆?/p>
銆銆(2) C++2HTML
銆銆鍙傝冪珯鐐癸細http://www.bedaux.net/cpp2html/
銆銆鎶奀++浠g爜鍙樻垚璇硶楂樹寒鐨凥TML
銆銆(3) CodeColorizer
銆銆鍙傝冪珯鐐癸細http://www.chami.com/colorizer/
銆銆瀹冭兘鎶婂ソ鍑犵璇█鐨勬簮浠g爜鐫鑹蹭負HTML
銆銆(4) Doc-O-Matic
銆銆鍙傝冪珯鐐癸細http://www.doc-o-matic.com/
銆銆Doc-O_Matic涓轟綘鐨凜/C++錛孋++.net錛孌elphi/Pascal, VB.NET錛孋#鍜孞ava紼嬪簭鎴栬呯粍浠朵駭鐢熷噯紜殑鏂囨。銆侱oc-O-Matic浣跨敤婧愪唬鐮佷腑鐨勭鍙峰拰娉ㄩ噴浠ュ強澶栭儴鐨勬枃妗f枃浠跺垱寤轟笌嫻佽鐨勬枃妗f牱寮忎竴鑷寸殑鏂囨。銆?/p>
銆銆(5) DocVizor
銆銆鍙傝冪珯鐐癸細http://www.ucancode.net/Products/DocBuilder/Features.htm
銆銆DocVizor婊¤凍浜嗛潰鍚戝璞¤蔣浠跺紑鍙戣呯殑鍩烘湰瑕佹眰鈥斺斿畠璁╂垜浠兘澶熺湅鍒癈++宸ョ▼涓殑綾誨眰嬈$粨鏋勩侱ocVizor蹇熷湴浜х敓瀹屾暣鍙緵鎵撳嵃鐨勭被灞傛緇撴瀯鍥撅紝鍖呮嫭浠庣涓夋柟搴撲腑鏉ョ殑閭d簺綾伙紝闄ゆ涔嬪DocVizor榪樿兘浠庣被淇℃伅涓駭鐢烪TML鏂囦歡銆?/p>
銆銆(6) SourcePublisher C++
銆銆鍙傝冪珯鐐癸細http://www.scitools.com/sourcepublisher_c.html
銆銆緇欐簮浠g爜浜х敓鎻愪緵蹇熺洿瑙傜殑HTML鎶ヨ〃錛屽寘鎷唬鐮侊紝綾誨眰嬈$粨鏋勶紝璋冪敤鍜岃璋冪敤鏍戯紝鍖呭惈鍜岃鍖呭惈鏍戙傛敮鎸佸縐嶆搷浣滅郴緇熴?/p>
銆銆(7) Understand
銆銆鍙傝冪珯鐐癸細http://www.scitools.com/ucpp.html
銆銆鍒嗘瀽浠諱綍瑙勬ā鐨凜鎴栬匔++宸ョ▼錛屽府鍔╂垜浠洿濂界殑鐞嗚В浠ュ強緙栧啓鏂囨。銆?/p>
銆銆4.2 浠g爜綾?/p>
銆銆(1) CC-Rider
銆銆鍙傝冪珯鐐癸細http://www.cc-rider.com/
銆銆CC-Rider鏄敤浜嶤/C++紼嬪簭寮哄ぇ鐨勪唬鐮佸彲瑙嗗寲宸ュ叿錛岄氳繃浜や簰寮忔祻瑙堛佺紪杈戝強鑷姩鏂囦歡鏉ヤ績榪涚▼搴忕殑緇存寔鍜屽彂灞曘?/p>
銆銆(2) CodeInspect
銆銆鍙傝冪珯鐐癸細http://www.yokasoft.com/
銆銆涓縐嶆柊鐨凜/C++浠g爜鍒嗘瀽宸ュ叿銆傚畠媯鏌ユ垜浠殑婧愪唬鐮佹壘鍑洪潪鏍囧噯鐨勶紝鍙兘鐨勶紝浠ュ強鏅氱殑閿欒浠g爜銆?/p>
銆銆(3) CodeWizard
銆銆鍙傝冪珯鐐癸細http://www.parasoft.com/
銆銆鍏堣繘鐨凜/C++婧愪唬鐮佸垎鏋愬伐鍏鳳紝浣跨敤瓚呰繃500涓紪鐮佽鑼冭嚜鍔ㄥ寲鍦版爣鏄庡嵄闄╃殑錛屼絾鏄紪璇戝櫒涓嶈兘媯鏌ュ埌鐨勪唬鐮佺粨鏋勩?/p>
銆銆(4) C++ Validation Test Suites
銆銆鍙傝冪珯鐐癸細http://www.plumhall.com/suites.html
銆銆涓緇勭敤浜庢祴璇曠紪璇戝櫒鍜屽簱瀵逛簬鏍囧噯鍚誨悎紼嬪害鐨勪唬鐮佸簱銆?/p>
銆銆(5) CppRefactory
銆銆鍙傝冪珯鐐癸細http://cpptool.sourceforge.net/
銆銆CPPRefactory鏄竴涓嬌寰楀紑鍙戣呰兘澶熼噸鏋勪粬浠殑C++浠g爜鐨勭▼搴忋傜洰鐨勬槸浣垮緱C++浠g爜鐨勯噸鏋勮兘澶熷敖鍙兘鐨勬湁鏁堢巼鍜岀畝鍗曘?/p>
銆銆(6) Lzz
銆銆鍙傝冪珯鐐癸細http://www.lazycplusplus.com/
銆銆Lzz鏄竴涓嚜鍔ㄥ寲璁稿C++緙栫▼涓殑浣撳姏媧葷殑宸ュ叿銆傚畠鑳藉鑺傜渷鎴戜滑璁稿浜嬩歡騫朵笖浣垮緱緙栫爜鏇村姞鏈変箰瓚c傜粰鍑轟竴緋誨垪鐨勫0鏄庯紝Lzz浼氱粰鎴戜滑鍒涘緩澶存枃浠跺拰婧愭枃浠躲?/p>
銆銆(7) QA C++ Generation 2000
銆銆鍙傝冪珯鐐癸細http://www.programmingresearch.com/solutions/qacpp.htm
銆銆瀹冨叧娉ㄩ潰鍚戝璞$殑C++婧愪唬鐮侊紝瀵規湁鍏充簬璁捐錛屾晥鐜囷紝鍙?鎬э紝鍙淮鎶ゆх殑閮ㄥ垎鎻愬嚭璀﹀憡淇℃伅銆?/p>
銆銆(8) s-mail project - Java to C++DOL
銆銆鍙傝冪珯鐐癸細http://sadlocha.strefa.pl/s-mail/ja2dol.html
銆銆鎶奐ava婧愪唬鐮佺炕璇戜負鐩稿簲鐨凜++婧愪唬鐮佺殑鍛戒護琛屽伐鍏楓?/p>
銆銆(9) SNIP from Cleanscape Software International
銆銆鍙傝冪珯鐐癸細http://www.cleanscape.net/stdprod/snip/index.html
銆銆涓涓~騫崇紪鐮佸拰璁捐涔嬮棿娌熷鐨勬槗浜庝嬌鐢ㄧ殑C++寮鍙戝伐鍏鳳紝鑺傜渷澶ч噺緙栬緫鍜岃皟璇曠殑浜嬩歡錛屽畠榪樹嬌寰楀紑鍙戣呰兘澶熸寚瀹氳璁℃ā寮忎綔涓哄璞℃ā鍨嬶紝鑷姩浠庡璞℃ā鍨嬩腑浜х敓C++鐨勭被銆?/p>
銆銆(10) SourceStyler C++
銆銆鍙傝冪珯鐐癸細http://www.ochresoftware.com/
銆銆瀵笴/C++婧愪唬鐮佹彁渚涘畬鏁寸殑鏍煎紡鍖栧拰鎺掔増鎺у埗鐨勫伐鍏楓傛彁渚涘浜?5涓殑鏍煎紡鍖栭夐」浠ュ強瀹屽叏鏀寔ANSI C++銆?/p>
銆銆4.3 緙栬瘧綾?/p>
銆銆(1) Compilercache
銆銆鍙傝冪珯鐐癸細http://www.erikyyy.de/compilercache/
銆銆Compilercache鏄竴涓浣犵殑C鍜孋++緙栬瘧鍣ㄧ殑灝佽鑴氭湰銆傛瘡嬈℃垜浠繘琛岀紪璇戯紝灝佽鑴氭湰錛屾妸緙栬瘧鐨勭粨鏋滄斁鍏ョ紦瀛橈紝涓鏃︾紪璇戠浉鍚岀殑涓滆タ錛岀粨鏋滃皢浠庣紦瀛樹腑鍙栧嚭鑰屼笉鏄啀嬈$紪璇戙?/p>
銆銆(2) Ccache
銆銆鍙傝冪珯鐐癸細http://ccache.samba.org/
銆銆Ccache鏄竴涓紪璇戝櫒緙撳瓨銆傚畠浣跨敤璧鋒潵灝卞儚C/C++緙栬瘧鍣ㄧ殑緙撳瓨棰勫鐞嗗櫒錛岀紪璇戦熷害閫氬父鑳芥彁楂樻櫘閫氱紪璇戣繃紼嬬殑5~10鍊嶃?/p>
銆銆(3) Cmm (C++ with MultiMethods)
銆銆鍙傝冪珯鐐癸細http://www.op59.net/cmm/cmm-0.28/users.html
銆銆榪欐槸涓縐岰++璇█鐨勬墿灞曘傝鍏mm婧愪唬鐮佽緭鍑篊++鐨勬簮浠g爜錛屽姛鑳芥槸瀵笴++璇█娣誨姞浜嗗multimethod鐨勬敮鎸併?/p>
銆銆(4) The Frost Project
銆銆鍙傝冪珯鐐癸細http://frost.flewid.de/
銆銆Forst浣垮緱浣犺兘澶熷湪C++紼嬪簭涓儚鍘熺敓鐨凜++鐗規т竴鏍蜂嬌鐢╩ultimethod浠ュ強铏氬嚱鏁板弬鏁般傚畠鏄竴涓紪璇戝櫒鐨勫澹熾?/p>
銆銆4.4 嫻嬭瘯鍜岃皟璇曠被
銆銆(1) CPPUnit
銆銆CppUnit 鏄釜鍩轟簬 LGPL 鐨勫紑婧愰」鐩紝鏈鍒濈増鏈Щ妞嶈嚜 JUnit錛屾槸涓涓潪甯鎬紭縐鐨勫紑婧愭祴璇曟鏋躲侰ppUnit 鍜?JUnit 涓鏍蜂富瑕佹濇兂鏉ユ簮浜庢瀬闄愮紪紼嬨備富瑕佸姛鑳藉氨鏄鍗曞厓嫻嬭瘯榪涜綆$悊錛屽茍鍙繘琛岃嚜鍔ㄥ寲嫻嬭瘯銆?br />
銆銆(2) C++Test
銆銆鍙傝冪珯鐐癸細http://www.parasoft.com/
銆銆C++ Test鏄竴涓崟鍏冩祴璇曞伐鍏鳳紝瀹冭嚜鍔ㄥ寲浜咰鍜孋++綾伙紝鍑芥暟鎴栬呯粍浠剁殑嫻嬭瘯銆?/p>
銆銆(3) Cantata++
銆銆鍙傝冪珯鐐癸細http://www.iplbath.com/products/tools/pt400.shtml
銆銆璁捐鐨勭洰鐨勬槸涓轟簡婊¤凍鍦ㄥ悎鐞嗙殑緇忔祹寮閿涓嬩嬌鐢ㄨ繖涓伐鍏峰彲浠ヨ寮鍙戝伐紼嬪笀寮灞曞崟鍏冩祴璇曞拰闆嗘垚嫻嬭瘯鐨勯渶姹?
銆銆(4) Purify
銆銆鍙傝冪珯鐐癸細http://www-900.ibm.com/cn/software/rational/products/purif
yplus/index.shtml
銆銆IBM Rational PurifyPlus鏄竴濂楀畬鏁寸殑榪愯鏃跺垎鏋愬伐鍏鳳紝鏃ㄥ湪鎻愰珮搴旂敤紼嬪簭鐨勫彲*鎬у拰鎬ц兘銆侾urifyPlus灝嗗唴瀛橀敊璇拰娉勬紡媯嫻嬨佸簲鐢ㄧ▼搴忔ц兘鎻忚堪銆佷唬鐮佽鐩栧垎鏋愮瓑鍔熻兘緇勫悎鍦ㄤ竴涓崟涓銆佸畬鏁寸殑宸ュ叿鍖呬腑銆?/p>
銆銆(5) BoundsChecker
銆銆BoundsChecker鏄竴涓狢++榪愯鏃墮敊璇嫻嬪拰璋冭瘯宸ュ叿銆傚畠閫氳繃鍦╒isual Studio鍐呰嚜鍔ㄥ寲璋冭瘯榪囩▼鍔犻熷紑鍙戝茍涓旂緝鐭笂甯傜殑鍛ㄦ湡銆侭oundsChecker鎻愪緵娓呮錛岃緇嗙殑紼嬪簭閿欒鍒嗘瀽錛岃澶氭槸瀵笴++鐙湁鐨勫茍涓斿湪static錛宻tack鍜宧eap鍐呭瓨涓嫻嬪拰璇婃柇閿欒錛屼互鍙婂彂鐜板唴瀛樺拰璧勬簮鐨勬硠婕忋傘銆
銆銆(6) Insure++
銆銆鍙傝冪珯鐐癸細http://www.parasoft.com/
銆銆涓涓嚜鍔ㄥ寲鐨勮繍琛屾椂紼嬪簭嫻嬭瘯宸ュ叿錛屾鏌ラ毦浠ュ療瑙夌殑閿欒,濡傚唴瀛樿鐩栵紝鍐呭瓨娉勬紡錛屽唴瀛樺垎閰嶉敊璇紝鍙橀噺鍒濆鍖栭敊璇紝鍙橀噺瀹氫箟鍐茬獊錛屾寚閽堥敊璇紝搴撻敊璇紝閫昏緫閿欒鍜岀畻娉曢敊璇瓑銆?/p>
銆銆(7) GlowCode
銆銆鍙傝冪珯鐐癸細http://www.glowcode.com/
銆銆GlowCode鍖呮嫭鍐呭瓨娉勬紡媯鏌ワ紝code profiler錛屽嚱鏁拌皟鐢ㄨ窡韙瓑鍔熻兘銆傜粰C++寮鍙戣呮彁渚涘畬鏁寸殑閿欒璇婃柇錛屽拰榪愯鏃舵ц兘鍒嗘瀽宸ュ叿鍖呫?/p>
銆銆(8) Stack Spy
銆銆鍙傝冪珯鐐癸細http://www.imperioustech.com/
銆銆瀹冭兘鎹曟崏stack corruption, stack over run, stack overflow絳夋湁鍏蟲爤鐨勯敊璇?/p>
------------------------------------------------------------------------
銆5錛屽簱
銆銆鍦–++涓紝搴撶殑鍦頒綅鏄潪甯擱珮鐨勩侰++涔嬬埗 Bjarne Stroustrup鍏堢敓澶氭琛ㄧず浜嗚璁″簱鏉ユ墿鍏呭姛鑳借濂借繃璁捐鏇村鐨勮娉曠殑璦璁恒傜幇瀹炰腑錛孋++鐨勫簱闂ㄧ被綣佸錛岃В鍐崇殑闂涔熸槸鏋佸叾騫挎硾錛屽簱浠庤交閲忕駭鍒伴噸閲忕駭鐨勯兘鏈夈備笉灝戦兘鏄浜虹溂鐣屽ぇ寮錛屼害鎴栨槸鏈涜岀敓鍙圭殑鎬濈淮鏉頒綔銆傜敱浜庡簱鐨勬暟閲忛潪甯稿簽澶э紝鑰屼笖闄愪簬絎旇呮按騫籌紝鍏朵腑寰堝騫朵笉浜嗚В銆傛墍浠ユ枃涓墍鎻愮殑涓浜涘簱閮芥槸姣旇緝钁楀悕鐨勫ぇ鍨嬪簱銆?/p>
銆銆5.1 鏍囧噯搴?/p>
銆銆鏍囧噯搴撲腑鎻愪緵浜咰++紼嬪簭鐨勫熀鏈鏂姐傝櫧鐒禖++鏍囧噯搴撻殢鐫C++鏍囧噯鎶樿吘浜嗚澶氬勾錛岀洿鍒版爣鍑嗙殑鍑哄彴鎵嶆寮忓畾鍨嬶紝浣嗘槸鍦ㄦ爣鍑嗗簱鐨勫疄鐜頒笂鍗村緢浠や漢嬈f叞寰楃湅鍒板縐嶅疄鐜幫紝騫朵笖宸茶瀹炶返璇佹槑涓烘湁宸ヤ笟綰у埆寮哄害鐨勪匠浣溿?/p>
銆銆(1) Dinkumware C++ Library
銆銆鍙傝冪珯鐐癸細http://www.dinkumware.com/
銆銆P.J. Plauger緙栧啓鐨勯珮鍝佽川鐨勬爣鍑嗗簱銆侾.J. Plauger鍗氬+鏄疍r. Dobb's紼嬪簭璁捐鏉板嚭濂栫殑鑾峰緱鑰呫傚叾緙栧啓鐨勫簱闀挎湡琚玀icrosoft閲囩敤錛屽茍涓旀渶榪態orland涔熷彇寰椾簡鍏禣EM鐨刲icense錛屽湪鍏禖/C++鐨勪駭鍝佷腑閲囩敤Dinkumware鐨勫簱銆?/p>
銆銆(2) RogueWave Standard C++ Library
銆銆鍙傝冪珯鐐癸細http://www.roguewave.com/
銆銆榪欎釜搴撳湪Borland C++ Builder鐨勬棭鏈熺増鏈腑鏇劇粡琚噰鐢紝鍚庢潵琚叾浠栫殑搴撶粰鏇挎崲浜嗐傜瑪鑰呬笉鎺ㄨ崘浣跨敤銆?/p>
銆銆(3) SGI STL
銆銆鍙傝冪珯鐐癸細http://www.roguewave.com/
銆銆SGI鍏徃鐨凜++鏍囧噯妯$増搴撱?/p>
銆銆(4) STLport
銆銆鍙傝冪珯鐐癸細http://www.stlport.org/
銆銆SGI STL搴撶殑璺ㄥ鉤鍙板彲縐繪鐗堟湰銆?/p>
銆銆5.2 鈥滃噯鈥濇爣鍑嗗簱 - Boost
銆銆鍙傝冪珯鐐癸細http://www.boost.org/
銆銆鍥藉唴闀滃儚錛?a >http://www.c-view.org/tech/lib/boost/index.htm
銆銆Boost搴撴槸涓涓粡榪囧崈閿ょ櫨鐐箋佸彲縐繪銆佹彁渚涙簮浠g爜鐨凜++搴擄紝浣滀負鏍囧噯搴撶殑鍚庡錛屾槸C++鏍囧噯鍖栬繘紼嬬殑鍙戝姩鏈轟箣涓銆?Boost搴撶敱C++鏍囧噯濮斿憳浼氬簱宸ヤ綔緇勬垚鍛樺彂璧鳳紝鍦–++紺懼尯涓獎鍝嶇敋澶э紝鍏舵垚鍛樺凡榪?000浜恒?Boost搴撲負鎴戜滑甯︽潵浜嗘渶鏂般佹渶閰楓佹渶瀹炵敤鐨勬妧鏈紝鏄笉鎶樹笉鎵g殑鈥滃噯鈥濇爣鍑嗗簱銆?/p>
銆銆Boost涓瘮杈冩湁鍚嶆皵鐨勬湁榪欎箞鍑犱釜搴擄細
銆銆Regex
銆銆姝e垯琛ㄨ揪寮忓簱
銆銆Spirit
銆銆LL parser framework錛岀敤C++浠g爜鐩存帴琛ㄨ揪EBNF
銆銆Graph
銆銆鍥劇粍浠跺拰綆楁硶
銆銆Lambda
銆銆鍦ㄨ皟鐢ㄧ殑鍦版柟瀹氫箟鐭皬鍖垮悕鐨勫嚱鏁板璞★紝寰堝疄鐢ㄧ殑functional鍔熻兘
銆銆concept check
銆銆媯鏌ユ硾鍨嬬紪紼嬩腑鐨刢oncept
聽
銆銆Mpl
銆銆鐢ㄦā鏉垮疄鐜扮殑鍏冪紪紼嬫鏋?/p>
聽
銆銆Thread
銆銆鍙Щ妞嶇殑C++澶氱嚎紼嬪簱
聽
銆銆Python
銆銆鎶奀++綾誨拰鍑芥暟鏄犲皠鍒癙ython涔嬩腑
銆銆Pool
銆銆鍐呭瓨姹犵鐞?/p>
聽
銆銆smart_ptr
銆銆5涓櫤鑳芥寚閽堬紝瀛︿範鏅鴻兘鎸囬拡蹇呰錛屼竴浠戒笉閿欑殑鍙傝冩槸鏉ヨ嚜CUJ鐨勬枃绔狅細
銆銆Smart Pointers in Boost錛屽摝錛岃繖綃囨枃绔犲彲浠ユ煡鍒幫紝CUJ鏄彁渚涘湪綰挎祻瑙堢殑銆備腑鏂囩増瑙佺瑪鑰呭湪銆奃r. Dobb's Journal杞歡鐮斿彂鏉傚織銆嬬7杈戜笂鐨勮瘧鏂囥?/p>
銆銆Boost鎬諱綋鏉ヨ鏄疄鐢ㄤ環鍊煎緢楂橈紝璐ㄩ噺寰堥珮鐨勫簱銆傚茍涓旂敱浜庡叾瀵硅法騫沖彴鐨勫己璋冿紝瀵規爣鍑咰++鐨勫己璋冿紝鏄紪鍐欏鉤鍙版棤鍏籌紝鐜頒唬C++鐨勫紑鍙戣呭繀澶囩殑宸ュ叿銆備絾鏄疊oost涓篃鏈夊緢澶氭槸瀹為獙鎬ц川鐨勪笢瑗匡紝鍦ㄥ疄闄呯殑寮鍙戜腑瀹炵敤闇瑕佽皚鎱庛傚茍涓斿緢澶欱oost涓殑搴撳姛鑳藉牚縐板璇█鍔熻兘鐨勬墿灞曪紝鍏舵瀯閫犵敤灝界簿宸х殑鎵嬫硶錛屼笉瑕佽錘鐒剁殑鑺辮垂鏃墮棿鐮旇銆侭oost鍙﹀涓闈紝姣斿Graph榪欐牱鐨勫簱鍒欐槸鍏鋒湁宸ヤ笟寮哄害錛岀粨鏋勮壇濂斤紝闈炲父鍊煎緱鐮旇鐨勭簿鍝佷唬鐮侊紝騫朵笖涔熷彲浠ユ斁蹇冪殑鍦ㄤ駭鍝佷唬鐮佷腑澶氬鍒╃敤銆?/p>
銆銆5.3 GUI
銆銆鍦ㄤ紬澶欳++鐨勫簱涓紝GUI閮ㄥ垎鐨勫簱綆楁槸姣旇緝綣佽崳錛屼篃姣旇緝寮曚漢娉ㄧ洰鐨勩傚湪瀹為檯寮鍙戜腑錛孏UI搴撶殑閫夋嫨涔熸槸闈炲父閲嶈鐨勪竴浠朵簨鎯咃紝涓嬮潰鎴戜滑緇艱堪涓涓嬪彲閫夋嫨鐨凣UI搴擄紝鍚勮嚜鐨勭壒鐐逛互鍙婄浉鍏沖伐鍏風殑鏀寔銆?/p>
銆銆(1) MFC
銆銆澶у悕榧庨紟鐨勫井杞熀紜綾誨簱錛圡icrosoft Foundation Class錛夈傚ぇ鍑″榪嘨C++鐨勪漢閮藉簲璇ョ煡閬撹繖涓簱銆傝櫧鐒朵粠鎶鏈搴﹁錛孧FC鏄笉澶ф紓浜殑錛屼絾鏄畠鏋勫緩浜嶹indows API 涔嬩笂錛岃兘澶熶嬌紼嬪簭鍛樼殑宸ヤ綔鏇村鏄?緙栫▼鏁堢巼楂橈紝鍑忓皯浜嗗ぇ閲忓湪寤虹珛 Windows 紼嬪簭鏃跺繀欏葷紪鍐欑殑浠g爜錛屽悓鏃跺畠榪樻彁渚涗簡鎵鏈変竴鑸?C++ 緙栫▼鐨勪紭鐐癸紝渚嬪緇ф壙鍜屽皝瑁呫侻FC 緙栧啓鐨勭▼搴忓湪鍚勪釜鐗堟湰鐨刉indows鎿嶄綔緋葷粺涓婃槸鍙Щ妞嶇殑錛屼緥濡傦紝鍦╓indows 3.1涓嬬紪鍐欑殑浠g爜鍙互寰堝鏄撳湴縐繪鍒?Windows NT 鎴?Windows 95 涓娿備絾鏄湪鏈榪戝彂灞曚互鍙婂畼鏂規敮鎸佷笂鏃ユ笎鍔垮井銆?/p>
銆銆(2) QT
銆銆鍙傝冪綉绔欙細http://www.trolltech.com/
銆銆Qt鏄疶rolltech鍏徃鐨勪竴涓騫沖彴鐨凜++鍥懼艦鐢ㄦ埛鐣岄潰搴旂敤紼嬪簭妗嗘灦銆傚畠鎻愪緵緇欏簲鐢ㄧ▼搴忓紑鍙戣呭緩绔嬭壓鏈駭鐨勫浘褰㈢敤鎴風晫闈㈡墍闇鐨勬墍鐢ㄥ姛鑳姐俀t鏄畬鍏ㄩ潰鍚戝璞$殑寰堝鏄撴墿灞曪紝騫朵笖鍏佽鐪熸鍦扮粍浠剁紪紼嬨傝嚜浠?996騫存棭浜涙椂鍊欙紝Qt榪涘叆鍟嗕笟棰嗗煙錛屽畠宸茬粡鎴愪負鍏ㄤ笘鐣岃寖鍥村唴鏁板崈縐嶆垚鍔熺殑搴旂敤紼嬪簭鐨勫熀紜銆俀t涔熸槸嫻佽鐨凩inux妗岄潰鐜KDE 鐨勫熀紜錛屽悓鏃跺畠榪樻敮鎸乄indows銆丮acintosh銆乁nix/X11絳夊縐嶅鉤鍙般?/p>
銆銆(3) WxWindows
銆銆鍙傝冪綉绔欙細http://www.wxwindows.org/
銆銆璺ㄥ鉤鍙扮殑GUI搴撱傚洜涓哄叾綾誨眰嬈℃瀬鍍廙FC錛屾墍浠ユ湁鏂囩珷浠嬬粛浠嶮FC鍒癢xWindows鐨勪唬鐮佺Щ妞嶄互瀹炵幇璺ㄥ鉤鍙扮殑鍔熻兘銆傞氳繃澶氬勾鐨勫紑鍙戜篃鏄竴涓棩瓚嬪畬鍠勭殑GUI搴擄紝鏀寔鍚屾牱涓嶅急浜庡墠闈袱涓簱銆傚茍涓旀槸瀹屽叏寮鏀炬簮浠g爜鐨勩傛柊榪戠殑C++ Builder X鐨凣UI璁捐鍣ㄥ氨鏄熀浜庤繖涓簱鐨勩?/p>
銆銆(4) Fox
銆銆鍙傝冪綉绔欙細http://www.fox-toolkit.org/
銆銆寮鏀炬簮浠g爜鐨凣UI搴撱備綔鑰呬粠鑷繁浜茶韓鐨勫紑鍙戠粡楠屼腑寰楀嚭浜嗕竴涓悊鎯崇殑GUI搴撳簲璇ユ槸浠涔堟牱瀛愮殑鎰熷彈鍑哄彂錛屼粠鑰屽紑濮嬩簡瀵硅繖涓簱鐨勫紑鍙戙傛湁鍏磋叮鐨勫彲浠ュ皾璇曚竴涓嬨?/p>
銆銆(5) WTL
銆銆鍩轟簬ATL鐨勪竴涓簱銆傚洜涓轟嬌鐢ㄤ簡澶ч噺ATL鐨勮交閲忕駭鎵嬫硶錛屾ā鏉跨瓑鎶鏈紝鍦ㄤ唬鐮佸昂瀵革紝浠ュ強閫熷害浼樺寲鏂歸潰鍋氬緱闈炲父鍒頒綅銆備富瑕侀潰鍚戠殑浣跨敤緹や綋鏄紑鍙慍OM杞婚噺綰т緵緗戠粶涓嬭澆鐨勫彲瑙嗗寲鎺т歡鐨勫紑鍙戣呫?/p>
銆銆(6) GTK
銆銆鍙傝冪綉绔欙細http://gtkmm.sourceforge.net/
銆銆GTK鏄竴涓ぇ鍚嶉紟榧庣殑C鐨勫紑婧怗UI搴撱傚湪Linux涓栫晫涓湁Gnome榪欐牱鐨勬潃鎵嬪簲鐢ㄣ傝孏TK灝辨槸榪欎釜搴撶殑C++灝佽鐗堟湰銆?/p>
銆銆5.4 緗戠粶閫氫俊
銆銆(1) ACE
銆銆鍙傝冪綉绔欙細http://www.cs.wustl.edu/~schmidt/ACE.html
銆銆C++搴撶殑浠h〃錛岃秴閲嶉噺綰х殑緗戠粶閫氫俊寮鍙戞鏋躲侫CE鑷傞厤閫氫俊鐜錛圓daptiveCommunication Environment錛夋槸鍙互鑷敱浣跨敤銆佸紑鏀炬簮浠g爜鐨勯潰鍚戝璞℃鏋訛紝鍦ㄥ叾涓疄鐜頒簡璁稿鐢ㄤ簬騫跺彂閫氫俊杞歡鐨勬牳蹇冩ā寮忋侫CE鎻愪緵浜嗕竴緇勪赴瀵岀殑鍙鐢–++鍖呰澶栬錛圵rapper Facade錛夊拰妗嗘灦緇勪歡錛屽彲璺ㄨ秺澶氱騫沖彴瀹屾垚閫氱敤鐨勯氫俊杞歡浠誨姟錛屽叾涓寘鎷細浜嬩歡澶氳礬鍒嗙鍜屼簨浠跺鐞嗗櫒鍒嗘淳銆佷俊鍙峰鐞嗐佹湇鍔″垵濮嬪寲銆佽繘紼嬮棿閫?br />淇°佸叡浜唴瀛樼鐞嗐佹秷鎭礬鐢便佸垎甯冨紡鏈嶅姟鍔ㄦ侊紙閲嶏級閰嶇疆銆佸茍鍙戞墽琛屽拰鍚屾錛岀瓑絳夈?/p>
銆銆(2) StreamModule
銆銆鍙傝冪綉绔欙細http://www.omnifarious.org/StrMod/
銆銆璁捐鐢ㄤ簬綆鍖栫紪鍐欏垎甯冨紡紼嬪簭鐨勫簱銆傚皾璇曠潃浣垮緱緙栧啓澶勭悊寮傛琛屼負鐨勭▼搴忔洿瀹規槗錛岃屼笉鏄敤鍚屾鐨勫澹沖寘璧峰紓姝ョ殑鏈川銆?/p>
銆銆(3) SimpleSocket
銆銆鍙傝冪綉绔欙細http://home.hetnet.nl/~lcbokkers/simsock.htm
銆銆榪欎釜綾誨簱璁╃紪鍐欏熀浜巗ocket鐨勫鎴?鏈嶅姟鍣ㄧ▼搴忔洿鍔犲鏄撱?/p>
銆銆(4) A Stream Socket API for C++
銆銆鍙傝冪綉绔欙細http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.h
tml
銆銆鍙堜竴涓Socket鐨勫皝瑁呭簱銆?/p>
銆銆5.5 XML
銆銆(1) Xerces
銆銆鍙傝冪綉绔欙細http://xml.apache.org/xerces-c/
銆銆Xerces-C++ 鏄竴涓潪甯稿仴澹殑XML瑙f瀽鍣紝瀹冩彁渚涗簡楠岃瘉錛屼互鍙奡AX鍜孌OM API銆俋ML楠岃瘉鍦ㄦ枃妗g被鍨嬪畾涔?Document Type Definition錛孌TD)鏂歸潰鏈夊緢濂界殑鏀寔錛屽茍涓斿湪2001騫?2鏈堝鍔犱簡鏀寔W3C XML Schema 鐨勫熀鏈畬鏁寸殑寮鏀炬爣鍑嗐?/p>
銆銆(2) XMLBooster
銆銆鍙傝冪綉绔欙細http://www.xmlbooster.com/
銆銆榪欎釜搴撻氳繃浜х敓鐗瑰埗鐨刾arser鐨勫姙娉曟瀬澶х殑鎻愰珮浜哫ML瑙f瀽鐨勯熷害錛屽茍涓旇兘澶熶駭鐢熺浉搴旂殑GUI紼嬪簭鏉ヤ慨鏀硅繖涓猵arser銆傚湪DOM鍜孲AX涓ゅぇ涓繪祦XML瑙f瀽鍔炴硶涔嬪鎻愪緵浜嗗彟澶栦竴涓彲琛岀殑瑙e喅鏂規銆?/p>
銆銆(3) Pull Parser
銆銆鍙傝冪綉绔欙細http://www.extreme.indiana.edu/xgws/xsoap/xpp/
銆銆榪欎釜搴撻噰鐢╬ull鏂規硶鐨刾arser銆傚湪姣忎釜SAX鐨刾arser搴曞眰閮芥湁涓涓猵ull鐨刾arser錛岃繖涓獂pp鎶婅繖灞傛毚闇插嚭鏉ョ洿鎺ョ粰澶у浣跨敤銆傚湪瑕佸厖鍒嗚冭檻閫熷害鐨勬椂鍊欏煎緱灝濊瘯銆?br />
銆銆(4) Xalan
銆銆鍙傝冪綉绔欙細http://xml.apache.org/xalan-c/
銆銆Xalan鏄竴涓敤浜庢妸XML鏂囨。杞崲涓篐TML錛岀函鏂囨湰鎴栬呭叾浠朮ML綾誨瀷鏂囨。鐨刋SLT澶勭悊鍣ㄣ?/p>
銆銆(5) CMarkup
銆銆鍙傝冪綉绔欙細http://www.firstobject.com/xml.htm
銆銆榪欐槸涓縐嶄嬌鐢‥DOM鐨刋ML瑙f瀽鍣ㄣ傚湪寰堝鎬濊礬涓婇潰闈炲父鐏墊椿瀹炵敤銆傚煎緱澶у鍦―OM鍜孲AX涔嬪瀵繪眰涓鐐圭伒鎰熴?/p>
銆銆(6) libxml++
銆銆http://libxmlplusplus.sourceforge.net/
銆銆libxml++鏄钁楀悕鐨刲ibxml XML瑙f瀽鍣ㄧ殑C++灝佽鐗堟湰
銆銆5.6 縐戝璁$畻
銆銆(1) Blitz++
銆銆鍙傝冪綉绔欙細http://www.oonumerics.org/blitz/
銆銆Blitz++ 鏄竴涓珮鏁堢巼鐨勬暟鍊艱綆楀嚱鏁板簱錛屽畠鐨勮璁$洰鐨勬槸甯屾湜寤虹珛涓濂楁棦鍏峰儚C++ 涓鏍鋒柟渚匡紝鍚屾椂鍙堟瘮Fortran閫熷害鏇村揩鐨勬暟鍊艱綆楃幆澧冦傞氬父錛岀敤C++鎵鍐欏嚭鐨勬暟鍊肩▼搴忥紝姣?Fortran鎱?0%宸﹀彸錛屽洜姝litz++姝f槸瑕佹敼鎺夎繖涓己鐐廣傛柟娉曟槸鍒╃敤C++鐨則emplate鎶鏈紝紼嬪簭鎵ц鐢氳嚦鍙互姣擣ortran鏇村揩銆侭litz++鐩墠浠嶅湪鍙戝睍涓紝瀵逛簬甯歌鐨凷VD錛孎FTs錛孮MRES絳夊父瑙佺殑綰挎т唬鏁版柟娉曞茍涓嶆彁渚涳紝涓嶈繃浣跨敤鑰呭彲浠ュ緢瀹規槗鍦板埄鐢˙litz++鎵鎻愪緵鐨勫嚱鏁版潵鏋勫緩銆?/p>
銆銆(2) POOMA
銆銆鍙傝冪綉绔欙細http://www.codesourcery.com/pooma/pooma
銆銆POOMA鏄竴涓厤璐圭殑楂樻ц兘鐨凜++搴擄紝鐢ㄤ簬澶勭悊騫惰寮忕瀛﹁綆椼侾OOMA鐨勯潰鍚戝璞¤璁℃柟渚夸簡蹇熺殑紼嬪簭寮鍙戯紝瀵瑰茍琛屾満鍣ㄨ繘琛屼簡浼樺寲浠ヨ揪鍒版渶楂樼殑鏁堢巼錛屾柟渚垮湪宸ヤ笟鍜岀爺絀剁幆澧冧腑浣跨敤銆?/p>
銆銆(3) MTL
銆銆鍙傝冪綉绔欙細http://www.osl.iu.edu/research/mtl/
銆銆Matrix Template Library(MTL)鏄竴涓珮鎬ц兘鐨勬硾鍨嬬粍浠跺簱錛屾彁渚涗簡鍚勭鏍煎紡鐭╅樀鐨勫ぇ閲忕嚎鎬т唬鏁版柟闈㈢殑鍔熻兘銆傚湪鏌愪簺搴旂敤浣跨敤楂樻ц兘緙栬瘧鍣ㄧ殑鎯呭喌涓嬶紝姣斿Intel鐨勭紪璇戝櫒錛屼粠浜х敓鐨勬眹緙栦唬鐮佸彲浠ョ湅鍑哄叾涓庢墜鍐欏嚑涔庢病鏈変袱鏍風殑鏁堣兘銆?/p>
銆銆(4) CGAL
銆銆鍙傝冪綉绔欙細http://www.cgal.org/
銆銆Computational Geometry Algorithms Library鐨勭洰鐨勬槸鎶婂湪璁$畻鍑犱綍鏂歸潰鐨勫ぇ閮ㄥ垎閲嶈鐨勮В鍐蟲柟妗堝拰鏂規硶浠++搴撶殑褰㈠紡鎻愪緵緇欏伐涓氬拰瀛︽湳鐣岀殑鐢ㄦ埛銆?/p>
銆銆5.7 娓告垙寮鍙?/p>
銆銆(1) Audio/Video 3D C++ Programming Library
銆銆鍙傝冪綉绔欙細http://www.galacticasoftware.com/products/av/
銆銆AV3D鏄竴涓法騫沖彴錛岄珮鎬ц兘鐨凜++搴撱備富瑕佺殑鐗規ф槸鎻愪緵3D鍥懼艦錛屽0鏁堟敮鎸侊紙SB,浠ュ強S3M錛夛紝鎺у埗鎺ュ彛錛堥敭鐩橈紝榧犳爣鍜岄仴鎰燂級錛孹MS銆?/p>
銆銆(2) KlayGE
銆銆鍙傝冪綉绔欙細http://home.g365.net/enginedev/
銆銆鍥藉唴娓告垙寮鍙戦珮鎵嬭嚜宸辯敤C++寮鍙戠殑娓告垙寮曟搸銆侹layGE鏄竴涓紑鏀炬簮浠g爜銆佽法騫沖彴鐨勬父鎴忓紩鎿庯紝騫朵嬌鐢≒ython浣滆剼鏈璦銆侹layGE鍦↙GPL鍗忚涓嬪彂琛屻傛劅璋㈤練鏁忔晱鍏堢敓涓轟腑鍥芥父鎴忓紑鍙戜簨涓氭墍鍋氬嚭鐨勮礎鐚?/p>
銆銆(3) OGRE
銆銆鍙傝冪綉绔欙細http://www.ogre3d.org/
銆銆OGRE錛堥潰鍚戝璞$殑鍥懼艦娓叉煋寮曟搸錛夋槸鐢–++寮鍙戠殑錛屼嬌鐢ㄧ伒媧葷殑闈㈠悜瀵硅薄3D寮曟搸銆傚畠鐨勭洰鐨勬槸璁╁紑鍙戣呰兘鏇存柟渚垮拰鐩存帴鍦板紑鍙戝熀浜?D紜歡璁懼鐨勫簲鐢ㄧ▼搴忔垨娓告垙銆傚紩鎿庝腑鐨勭被搴撳鏇村簳灞傜殑緋葷粺搴擄紙濡傦細Direct3D鍜孫penGL錛夌殑鍏ㄩ儴浣跨敤緇嗚妭榪涜浜嗘娊璞★紝騫舵彁渚涗簡鍩轟簬鐜板疄涓栫晫瀵硅薄鐨勬帴鍙e拰鍏跺畠綾匯?/p>
銆銆5.8 綰跨▼
銆銆(1) C++ Threads
銆銆鍙傝冪綉绔欙細http://threads.sourceforge.net/
銆銆榪欎釜搴撶殑鐩爣鏄粰紼嬪簭鍛樻彁渚涙槗浜庝嬌鐢ㄧ殑綾伙紝榪欎簺綾昏緇ф壙浠ユ彁渚涘湪Linux鐜涓緢闅劇湅鍒扮殑澶ч噺鐨勭嚎紼嬫柟闈㈢殑鍔熻兘銆?/p>
銆銆(2) ZThreads
銆銆鍙傝冪綉绔欙細http://zthread.sourceforge.net/
銆銆涓涓厛榪涚殑闈㈠悜瀵硅薄錛岃法騫沖彴鐨凜++綰跨▼鍜屽悓姝ュ簱銆?br />
銆銆5.9 搴忓垪鍖?/p>
銆銆(1) s11n
銆銆鍙傝冪綉绔欙細http://s11n.net/
銆銆涓涓熀浜嶴TL鐨凜++搴擄紝鐢ㄤ簬搴忓垪鍖朠OD錛孲TL瀹瑰櫒浠ュ強鐢ㄦ埛瀹氫箟鐨勭被鍨嬨?/p>
銆銆(2) Simple XML Persistence Library
銆銆鍙傝冪綉绔欙細http://sxp.sourceforge.net/
銆銆榪欐槸涓涓妸瀵硅薄搴忓垪鍖栦負XML鐨勮交閲忕駭鐨凜++搴撱?/p>
銆銆5.10 瀛楃涓?/p>
銆銆(1) C++ Str Library
銆銆鍙傝冪綉绔欙細http://www.utilitycode.com/str/
銆銆鎿嶄綔瀛楃涓插拰瀛楃鐨勫簱錛屾敮鎸乄indows鍜屾敮鎸乬cc鐨勫縐嶅鉤鍙般傛彁渚涢珮搴︿紭鍖栫殑浠g爜錛屽茍涓旀敮鎸佸綰跨▼鐜鍜孶nicode錛屽悓鏃惰繕鏈夋鍒欒〃杈懼紡鐨勬敮鎸併?/p>
銆銆(2) Common Text Transformation Library
銆銆鍙傝冪綉绔欙細http://cttl.sourceforge.net/
銆銆榪欐槸涓涓В鏋愬拰淇敼STL瀛楃涓茬殑搴撱侰TTL substring綾誨彲浠ョ敤鏉ユ瘮杈冿紝鎻掑叆錛屾浛鎹互鍙婄敤EBNF鐨勮娉曡繘琛岃В鏋愩?/p>
銆銆(3) GRETA
銆銆鍙傝冪綉绔欙細http://research.microsoft.com/projects/greta/
銆銆榪欐槸鐢卞井杞爺絀墮櫌鐨勭爺絀朵漢鍛樺紑鍙戠殑澶勭悊姝e垯琛ㄨ揪寮忕殑搴撱傚湪灝忓瀷鍖歸厤鐨勬儏鍐典笅鏈夐潪甯鎬紭縐鐨勮〃鐜般?/p>
銆銆5.11 緇煎悎
銆銆(1) P::Classes
銆銆鍙傝冪綉绔欙細http://pclasses.com/
銆銆涓涓珮搴﹀彲縐繪鐨凜++搴旂敤紼嬪簭妗嗘灦銆傚綋鍓嶅叧娉ㄧ被鍨嬪拰綰跨▼瀹夊叏鐨剆ignal/slot鏈哄埗錛宨/o緋葷粺鍖呮嫭鍩轟簬鎻掍歡鐨勭綉緇滃崗璁忔槑鐨刬/o鏋舵瀯錛屽熀浜庢彃浠剁殑搴旂敤紼嬪簭娑堟伅鏃ュ織妗嗘灦錛岃闂畇ql鏁版嵁搴撶殑綾葷瓑絳夈?/p>
銆銆(2) ACDK - Artefaktur Component Development Kit
銆銆鍙傝冪綉绔欙細http://acdk.sourceforge.net/
銆銆榪欐槸涓涓鉤鍙版棤鍏崇殑C++緇勪歡妗嗘灦錛岀被浼間簬Java鎴栬?NET涓殑妗嗘灦錛堝弽灝勬満鍒訛紝綰跨▼錛孶nicode錛屽簾鏂欐敹闆嗭紝I/O錛岀綉緇滐紝瀹炵敤宸ュ叿錛孹ML錛岀瓑絳夛級錛屼互鍙婂Java, Perl, Python, TCL, Lisp, COM 鍜?CORBA鐨勯泦鎴愩?/p>
銆銆(3) dlib C++ library
銆銆鍙傝冪綉绔欙細http://www.cis.ohio-state.edu/~kingd/dlib/
銆銆鍚勭鍚勬牱鐨勭被鐨勪竴涓患鍚堛傚ぇ鏁存暟錛孲ocket錛岀嚎紼嬶紝GUI錛屽鍣ㄧ被,浠ュ強嫻忚鐩綍鐨凙PI絳夌瓑銆?/p>
銆銆(4) Chilkat C++ Libraries
銆銆鍙傝冪綉绔欙細http://www.chilkatsoft.com/cpp_libraries.asp
銆銆榪欐槸鎻愪緵zip錛宔-mail錛岀紪鐮侊紝S/MIME錛孹ML絳夋柟闈㈢殑搴撱?/p>
銆銆(5) C++ Portable Types Library (PTypes)
銆銆鍙傝冪綉绔欙細http://www.melikyan.com/ptypes/
銆銆榪欐槸STL鐨勬瘮杈冪畝鍗曠殑鏇夸唬鍝侊紝浠ュ強鍙Щ妞嶇殑澶氱嚎紼嬪拰緗戠粶搴撱?/p>
銆銆(6) LFC
銆銆鍙傝冪綉绔欙細http://lfc.sourceforge.net/
銆銆鍝︼紝榪欏張鏄竴涓皾璇曟彁渚涗竴鍒囩殑C++搴?/p>
銆銆5.12 鍏朵粬搴?/p>
銆銆(1) Loki
銆銆鍙傝冪綉绔欙細http://www.moderncppdesign.com/
銆銆鍝︼紝浣犲彲鑳芥姳鎬ㄦ垜鏃╄鍜孊oost涓璧蜂粙緇嶅畠錛屼竴涓疄楠屾ц川鐨勫簱銆備綔鑰呭湪loki涓妸C++妯℃澘鐨勫姛鑳藉彂鎸ュ埌浜嗘瀬鑷淬傚茍涓斿皾璇曟妸綾諱技璁捐妯″紡榪欐牱鎬濇兂灞傞潰鐨勪笢瑗塊氳繃搴撴潵鎻愪緵銆傚悓鏃惰繕鎻愪緵浜嗘櫤鑳芥寚閽堣繖鏍鋒瘮杈冨疄鐢ㄧ殑鍔熻兘銆?/p>
銆銆(2) ATL
銆銆ATL(Active Template Library)
銆銆鏄竴緇勫皬宸с侀珮鏁堛佺伒媧葷殑綾伙紝榪欎簺綾諱負鍒涘緩鍙簰鎿嶄綔鐨凜OM緇勪歡鎻愪緵浜嗗熀鏈殑璁炬柦銆?/p>
銆銆(3) FC++: The Functional C++ Library
銆銆榪欎釜搴撴彁渚涗簡涓浜涘嚱鏁板紡璇█涓墠鏈夌殑瑕佺礌銆傚睘浜庣敤搴撴潵鎵╁厖璇█鐨勪竴涓唬琛ㄤ綔銆傚鏋滄兂瑕佸湪OOP涔嬪瀵繪壘鍙︿竴鍒嗙殑涔愯叮錛屽彲浠ュ幓鐪嬬湅鍑芥暟寮忕▼搴忚璁$殑涓栫晫銆傚ぇ甯圥eter Norvig鍦?鈥淭each Yourself rogramming in Ten Years鈥濅竴鏂囦腑灝卞皢鍑芥暟寮忚璦鍒椾負鑷沖皯搴斿綋瀛︿範鐨?綾葷紪紼嬭璦涔嬩竴銆?/p>
銆銆(4) FACT!
銆銆鍙傝冪綉绔欙細http://www.kfa-juelich.de/zam/FACT/start/index.html
銆銆鍙﹀涓涓疄鐜板嚱鏁板紡璇█鐗規х殑搴?/p>
銆銆(5) Crypto++
銆銆鎻愪緵澶勭悊瀵嗙爜錛屾秷鎭獙璇侊紝鍗曞悜hash錛屽叕鍖欏姞瀵嗙郴緇熺瓑鍔熻兘鐨勫厤璐瑰簱銆?/p>
銆銆榪樻湁寰堝闈炲父嬋鍔ㄤ漢蹇冩垨鑰呮槸鏋佸叾瀹炵敤鐨凜++搴擄紝闄愪簬鎴戜滑鐨勬按騫充互鍙婃枃绔犵殑綃囧箙涓嶈兘鍖呮嫭榪涙潵銆傚湪瀵逛簬榪欎簺宸茬粡鍖呭惈榪戞潵鐨勫簱鐨勪粙緇嶄腑錛岀敱浜庡茍涓嶆槸姣忎竴涓垜浠兘浣跨敤榪囷紝鎵浠ラ毦鍏嶆湁鍋忛涔嬪錛岃璇昏呰璋呫?/p>
--------------------------------------------------------------------------------
銆銆6錛屼功綾?/p>
銆銆浠ュ墠鐔婅妭鍏堢敓鏇炬挵鏂囪瘎璁虹浉瀵逛簬Java紼嬪簭璁捐璇█錛孋++鐨勫ソ涔﹀濡傜墰姣涖傝崳鑰鍏堢敓鍦ㄣ婄▼搴忓憳銆嬫潅蹇椾笂鎾版枃銆奀++紼嬪簭璁捐涔嬪洓涔︿簲緇忋嬩篃灝嗘湰棰嗗煙鍐呭嚑涔庢墍鏈夌殑緇忓吀涔︾睄浣滀簡鍏ㄩ潰鐨勪粙緇?浠諱綍鍏充簬涔︾殑璇勮姝ゆ椂鐪嬫潵渚挎槸寰堝浣欑殑浜嗐備釜浜烘祬瑙侊紝闄ら潪浣犳墦綆椾互C++浣滀負鍞竴鍏磋叮鎴栬呯敓瀛樹箣鏈紝涓鑸鑰呯‘瀹炴病鏈夎凍澶熺殑鏃墮棿鍜屽繀瑕佸皢20浣欐湰涔︾睄鍏ㄩ儴闃呰銆傛洿鏈夊弬鑰冧環鍊肩殑鏄崳鑰鍏堢敓鐨勫彟涓綃囨枃绔狅細銆婅嚦灝戝簲璇ラ槄
璇葷殑涔濇湰C++钁椾綔銆嬶紝鍙互浠庝笅闈㈢殑鍦板潃嫻忚鍒版鏂囷細
銆銆http://www.royaloo.com/articles/articles_2003/9CppBooks.htm
銆銆涓嬮潰鍑犳湰涔﹀浜庤蛋鍦–++鍒濆涔嬭礬涓婄殑璇昏呮槸鎴戜滑鏈鎰挎剰鎺ㄨ崘緇欏ぇ瀹剁殑錛?/p>
銆銆(1) 銆奀++ Primer銆?/p>
銆銆鍝︼紝涔熻浣犱細鎶辨ㄦ垜浠負浠涔堜笉鍏堜粙緇峊CPL,浣嗗浜庤蛋鍦ㄥ涔犱箣璺笂鐨勫叆闂ㄨ咃紝鏈功鍐呭鏇翠負鍏ㄩ潰錛屾洿涓鴻緇嗘槗鎳傦紝鎴戜滑縐板畠涓衡淐++鐨勮秴綰у疂鍏糕濆茍涓嶈繃鍒嗐傞厤鏈変竴鏈笉閿欑殑涔犻瑙g瓟銆奀++ Primer Answer Book銆嬪彲浠ヨ緟鍔╀綘鐨勫涔犱箣璺?/p>
銆銆(2) 銆奅ssential C++銆?/p>
銆銆濡傛灉璇淬奀++ Primer銆嬫槸C++棰嗗煙鐨勮秴綰у疂鍏革紝閭d箞姝や功浣滀負鎺屾彙C++鐨勫ぇ灞瑙傚綋涔嬫棤鎰с傛濡傘?NET澶у眬瑙傘嬩竴涔﹁兘澶熻璇昏呭叏鎻?NET錛屾湰涔﹁榪頒簡C++涓渶鏍稿績鐨勫叏閮ㄤ富棰樸備功铏戒笉鍘氾紝鍐呭綺劇偧錛屼笉澶變負銆奀++ Primer銆嬭鑰呰尪浣欓キ鍚庣殑涓婚鍥為【涔嬩綔銆?/p>
銆銆(3) 銆奣he C++ Programming Language銆?/p>
銆銆Bjarne涓轟綘甯︽潵鐨凜++鏁欑▼錛岀湡姝h兘澶熷憡璇変綘鎬庝箞鐢ㄦ墠鍙湡姝g殑C++鐨勫敮涓涓鏈功銆傝櫧鐒跺鍚屸滄煇鏌愮▼搴忚璁¤璦鈥濊繖鏍風殑涔︾睄浼氱粰澶у涓涓唴瀹瑰叏鎻斤紝鍏ラ棬鍒扮簿閫氱殑鎰熻錛屼絾鏈功紜疄涓嶅お閫傚悎鍒濆鑰呴槄璇匯傚鏋滀綘鑷涓烘槸涓鍚嶅緢鏈夌粡楠岀殑C++紼嬪簭鍛橈紝閭h嚦灝戜篃瑕佸弽澶嶅拃鍤糂jarne鍏堢敓鎵寮鴻皟鐨勮嫢騫插唴瀹廣?/p>
銆銆(4) 銆奅ffective C++銆嬶紝銆奙ore Effective C++銆?/p>
銆銆鏄殑錛屾濡備竴浜汣++鐖卞ソ鑰呯粡甯鎬互璇昏繃涓庢病鏈夎榪囦笂榪頒袱鏈綔鍝佹潵鍖哄垎浣犳槸鍚︽槸C++楂樻墜銆傛垜浠篃鏋佸姏鎺ㄥ磭榪欎袱鏈憲浣溿傚湪鍚勭浠嬬粛C++涓撳緇忛獙鐨勪功綾嶉噷闈紝榪欎袱鏈槸鏈璐磋繎璇█鏈川錛岀湅鍚庢渶鑳藉鏈夎劚鑳庢崲楠ㄦ劅瑙夌殑涔︼紝璇繪涔︿綘闇姣忔棩涓夌渷姹濊韓銆?/p>
銆銆鎶鏈功綾嶄粊鑰呰浠侊紝榪囧鐨勮瘎璁哄弽鏃犲お澶氭剰涔夛紝鐢辮鑰呭枩濂介夋嫨鏈閫傚悎鑷繁鐨勪功鏂逛負涓婄瓥銆?/p>
--------------------------------------------------------------------------------
銆銆7錛岃祫婧愮綉绔?/p>
銆銆姝e鎴戜滑鍙互閫氳繃璁$畻鏈哄巻鍙蹭笂鐨勯噸瑕佷漢鐗╀簡瑙h綆楁満鍙茬殑鍙戝睍錛孋++鐩稿叧浜虹墿鐨勭綉绔欎篃鍙互浣挎垜浠緱鍒版渶鏈変環鍊肩殑鍙傝冧笌鍊熼壌錛屼笅闈㈢殑浜虹墿鎴戜滑璁や負娌℃湁浠嬬粛鐨勫繀瑕侊紝鍙洜涓嬮潰鐨勪漢鐗╁湪C++棰嗗煙鐨勫湴浣嶄紬鎵鍛ㄧ煡錛屾垜浠彧灝嗙浉鍏崇殑璧勬簮榪涜緗楀垪浠ヤ緵璇昏呭涔狅紝浠栦滑鏈夌殑宸ヤ綔浜庤礉灝斿疄楠屽錛屾湁鐨勫伐浣滀簬鐭ュ悕緙栬瘧鍣ㄥ巶鍟嗭紝鏈夌殑鍦ㄤ笉鏂帹榪涜璦鐨勬爣鍑嗗寲錛屾湁鐨勪負璇昏呮挵鍐欎簡澶氶儴鍗冨彜濂囦綔鈥︹?br />銆銆(1) Bjarne Stroustrup
銆銆http://www.research.att.com/~bs/
銆銆(2) Stanley B. Lippman
銆銆http://blogs.msdn.com/slippman/
銆銆涓枃鐗?http://www.zengyihome.net/slippman/index.htm
銆銆(3) Scott Meyers
銆銆http://www.aristeia.com/
銆銆(4) David Musser
銆銆http://www.cs.rpi.edu/~musser/
銆銆(5) Bruce Eckel
銆銆http://www.bruceeckel.com/
銆銆(6) Nicolai M. Josuttis
銆銆http://www.josuttis.com/
銆銆(7) Herb Sutter
銆銆http://www.gotw.ca/
銆銆(8) Andrei Alexandrescu
銆銆http://www.coderncppdesign.com/
銆銆(9) 渚嵎鍏堢敓
銆銆http://www.jjhou.com/
銆銆(10) 瀛熷博鍏堢敓
銆銆鍏堢敓綣佸繖浜庡伐浣滐紝鐥磋糠浜庢妧鏈紝鏆傛棤涓漢涓婚〉錛屽叧浜庡厛鐢熺殑浣滃搧鍙互閫氳繃CSDN鐨勪笓鏍忓拰渚厛鐢熺殑涓婚〉璁塊棶鍒般?/p>
銆銆(11) 鑽h鍏堢敓
銆銆http://www.royaloo.com/
銆銆(12) 娼樼埍姘戝厛鐢?br />銆銆http://www.icst.pku.edu.cn/panaimin/pam_homepage.htm
銆銆闄や簡涓婅堪澶у笀鐨勪富欏靛錛屼互涓嬬殑緇煎悎綾籆++瀛︿範鍙傝冪珯鐐規槸鎴戜滑闈炲父鎰挎剰鍚戝ぇ瀹舵帹鑽愮殑錛?/p>
銆銆(1) CodeProject
銆銆http://www.codeproject.com/
銆銆(2) CodeGuru
銆銆http://www.codeguru.com/
銆銆(3) Dr. Dobb's Journal
銆銆http://www.ddj.com/
銆銆(4) C/C++ Users Journal
銆銆http://www.cuj.com/
銆銆(5) C緇磋鐐?br />銆銆http://www.c-view.org/
銆銆(6) allaboutprogram
銆銆http://www.allaboutprogram.com/
銆銆鍏朵粬璧勬枡
銆銆(1) ISO IEC JTC1/SC22/WG21 - C++錛氭爣鍑咰++鐨勬潈濞佸弬鑰?br />銆銆http://anubis.dkuug.dk/jtc1/sc22/wg21/
銆銆(2) C++ FAQ LITE 鈥?Frequently Asked Questions: 鏈涓哄叏闈㈢殑C++FAQ
銆銆http://www.sunistudio.com/cppfaq/index.html
銆銆C/C++ 鏂伴椈緇勶細
銆銆浣犱笉濡ㄥ皾璇曚粠榪欓噷鎻愰棶鍜屽洖絳旈棶棰橈紝寰堝涓嶉敊鐨凲&A璧勬簮......
銆銆(1) .alt.comp.lang.learn.c-c++
銆銆榪欎釜綆鍗曚簺錛屽鏋滀綘鍜屾垜涓鏍鋒槸涓彍楦?/p>
銆銆(2) .comp.lang.c++.moderated
聽 鍡紝榪欎釜鏄劇劧姘村鉤楂樹竴浜?/p>
銆銆(3) .comp.std.c++
銆銆濡傛灉浣犻渶瑕佽璁烘爣鍑咰++鐩稿叧璇濋鐨勮瘽
--------------------------------------------------------------------------------
銆銆8錛屼笉寰椾笉鍐欑殑緇撴潫璇?/p>
銆銆緇撴潫鐨勬椂鍊欎篃鏄葷粨鐜扮姸錛屽睍鏈涙湭鏉ョ殑鏃跺欍傝櫧鐒禖++浠庤劚鑳庝簬C寮濮嬶紝涓璺壈闅懼潕鍧風殑璧拌繃鏉ワ紝浣嗘槸鏃犺濡備綍C++宸茬粡鍙栧緱浜嗗伐涓氬熀紜鐨勫湴浣嶃傛枃绔犲垪涓劇殑澶ч噺鐩稿叧璧勬簮灝辨槸鏈濂界殑璇佹槑錛岃屼笟鐣岀殑澶ч噺鐢–++鍐欐垚鐨勪駭鍝佷唬鐮佷互鍙婂ぇ閲忕殑C++鑱屼笟宸ョ▼甯堝垯鏄渶鐩存帴鐨勮瘉鏄庛傚悓鏃訛紝鎴戜滑鍙互鐪嬪埌鍚勪釜楂樻牎鐨勮綆楁満涓撲笟閮藉紑璁炬湁C++榪欓棬璇劇▼錛岀綉緇滀笂瀵逛簬C++鐨勫涔犺璁轟篃浠庢潵閮芥病鏈夊仠榪囥備絾鏄紝鍦↗ava鍜?NET涓ゅぇ浼佷笟寮鍙戝鉤鍙扮殑鍥存敾涓嬶紝緇欎漢鐨勬劅瑙夋槸C++瓚婃潵瓚娾滀笉琛屸濅簡銆?/p>
銆銆C++鍦ㄩ潰鍚戜紒涓氱殑杞歡寮鍙戜腑錛屽湪寮鍙戜究鎹鋒х瓑鏂歸潰鐨勭‘瑕佹瘮Java鍜孋#宸緢澶氾紝鍏朵腑涓涓棶棰樻槸C++璇█鏈韓姣旇緝澶嶆潅錛屽涔犳洸綰挎瘮杈冮櫋宄紝鍙﹀涓涓棶棰樻槸C++鏍囧噯鍖栫殑鏃墮棿澶暱錛屼撫澶變簡寰堝鐨勫.澶ф満浼氾紝鑰楄垂浜嗗緢澶氱簿鍔涘湪鍘傚晢鐨勪箣闂寸殑鏂椾簤涓婏紝鑰孋++鐨勬爣鍑嗗簱紱諱竴涓畬鍠勭殑紼嬪簭寮鍙戞鏋惰繕緙哄皯澶澶鐨勫唴瀹癸紝鍚勪釜絎笁鏂圭殑綾誨簱鍜屾鏋跺張鍦ㄤ竴鑷存у拰瀹屾暣鎬т笂娌℃硶鍜岄殢騫沖彴鎻愪緵鐨勬鏋剁浉鎻愬茍璁恒傞毦閬揅++鐪熺殑瑕侀鍑哄巻鍙茶垶鍙頒簡錛?/p>
銆銆浠嶤++鐩墠鐨勬椿璺冪▼搴︼紝浠ュ強搴旂敤鐜扮姸鏉ヨ鏄畬鍏ㄨ兘澶熻偗瀹欳++浠嶇劧鏄蔣浠跺伐涓氱殑鍩虹錛屼篃涓嶄細閫鍑哄巻鍙茶垶鍙扮殑銆傚彟澶栦粠Boost錛孡oki榪欎簺搴撲腑鎴戜滑涔熻兘澶熺湅鍒癈++鐨勫彂灞曢潪甯告椿璺冿紝瀵逛簬鏂版妧鏈柊鎬濈淮闈炲父嬋榪涳紝C++浠嶇劧騫挎硾鍙楀埌鍏蟲敞銆備粠ACE鍦ㄩ珮鎬ц兘閫氫俊棰嗗煙鐨勫簲鐢紝浠ュ強MTL榪欐牱鐨勫簱鍦ㄦ暟鍊艱綆楅鍩熺殑鍑鴻壊琛ㄧ幇錛屾垜浠彲浠ョ湅鍒癈++鍦ㄩ珮鎬ц兘搴旂敤鍦哄悎涓嬬殑涓嶅彲鏇夸唬鐨勪綔鐢紝鑰屽祵鍏ュ紡緋葷粺榪欐牱鐨勫唴瀛樺彈闄愬紑鍙戝鉤鍙?br />錛屾瘮濡係ymbian OS涓婏紝C++宸茬粡鍙戞尌鐫騫朵笖灝嗗彂鎸ユ洿澶х殑浣滅敤銆傚彲浠ラ瑙佺殑鏄互鍚庣殑杞歡鏃犺涓婂眰鐨勫簲鐢ㄦ庝箞鍙橈紝瀹冪殑搴曞眰鏍稿績閮戒細鏄敱C/C++榪欐牱鐨勭郴緇熺駭杞歡緙栧啓鐨勶紝姣斿Java铏氭嫙鏈猴紝.NET Framwork銆傚洜涓哄彧鏈夎繖鏍風殑緋葷粺綰ц蔣浠舵墠鑳藉畬鍏ㄥ交搴曠殑鍙戞尌鏈哄櫒鐨勫姛鑳姐?/p>
銆銆闇瑕佺湅鍒扮殑鏄袱涓秼鍔匡紝涓涓秼鍔挎槸C++鍙樺緱鏇村姞澶嶆潅錛屾洿鍔犲闄㈡淳錛岄氳繃妯℃澘絳夋湁娼滃姏鐨勮娉曞洜绱犳瀯閫犺秺鏉ヨ秺綺懼閥鐨勫簱鎴愪負浜嗙幇浠++鐨勭儹鐐癸紝铏界劧鍦ㄥ埄鐢ㄥ簱瀹炵幇鏂扮殑緙栫▼鑼冨紡錛屼箖鑷寵璁℃ā寮忕瓑鏂歸潰寰堟湁寮鍒涙剰涔夛紝涔熺‘瀹炰駭鐢熶簡涓浜涜兘澶熶究鎹峰紑鍙戠殑宸ュ叿錛屼絾鏄洿澶氱殑鏄妸C++鍙樺緱鏇村姞寮哄ぇ錛屾洿鍔犲鏉傦紝涔熸洿鍔犻毦鎳傦紝浼間箮涔熸洿鍔犲闄㈡淳錛屼笉寰椾笉璇村畠姝e湪鍚戣竟緙樺寲閬撹礬鍙戝睍銆傚彟涓涓秼鍔挎槸C++鍦ㄤ富嫻佺殑浼佷笟搴旂敤寮
鍙戜腑宸茬粡閫愭笎閫鍑轟簡錛孍RP榪欐牱鐨勪紒涓氳蔣浠跺紑鍙戜腑鍩烘湰涓婁笉浼氳冭檻C++錛岄櫎闈為渶瑕佽冭檻鎬ц兘鎴栬呭拰閬楃暀浠g爜鐨勯泦鎴愯繖浜涘洜绱犮侰++閫瀹堝埌緋葷粺綰у埆璇█錛屾垚涓鴻蔣浠跺伐涓氱殑鍩虹鏄ぇ鍔挎墍瓚嬨傜劧鑰屽弽鎬濅竴涓嬶紝鐪熺殑鏄瀹堜箞錛熻嚜浠嶴TL鍑虹幇錛屾棤鏁扮殑浜洪璧蜂簯娑岀殑寮濮嬫敮鎸丆++,浠栦滑鐙傚懠鈥滄垜鐪嬪埌娣卞娑堝け浜嗭紝鐩爣杞歡宸ョ▼鐨勫嚭鐜般傛垜鐪嬪埌浜嗗彲緇存姢鐨勪唬鐮併傗濇槸鐨勶紝STL鍦ㄥ彲緇存姢鎬т笅鍋氬緱濡傛鍑鴻壊銆備絾鏄張鎬庢牱鍛紵STL涓篊++閾哄鉤浜嗙幇浠h蔣浠跺伐紼嬬殑閬撹礬錛岃屽湪涓婂眰搴旂敤紼嬪簭杞歡寮鍙戦鍩熻繖鍧楀満鍦版棭涓嶅崟鐙睘浜嶤++,寰堝紼嬪簭璁捐璇█閮藉仛寰楀緢鍑鴻壊錛岀柉鐙傜殑鏀寔鑰呬細姣笉鐘硅鮑鍦拌鎴戜滑搴斿綋鏀寔C++,鍥犱負瀹冩槸涓栫晫涓婃渶媯掔殑璇█銆傝屽潶鐜囧湴璇達紝浣犵殑鑵版潌鐪熺殑閭d箞紜箞錛熶篃璁稿彧鏄湪閫冮伩涓浜涗簨瀹炪侰++鏄紭縐鐨勶紝榪欎笉鍙惁璁わ紝STL鐨勫嚭鐜拌C++涓搴﹁蛋涓婁簡鏈杈夌厡鐨勬椂鍒伙紝鐒惰岀幇鍦ㄧ湅鏉モ︹︽垜鐨勪竴浣嶆仼甯堟浘璦錛氱湡姝h兘澶熷皢STL搴旂敤寰楁穻婕撳敖鑷寸殑浜哄緢
淇濆畧鍦拌鍥藉唴涔熶笉瓚呰繃200浜猴紝鎴栬涓嶅姞鍏TL鑳藉浣緾++鍚戠潃瀹冨簲褰撳彂灞曠殑鏂瑰悜鍙戝睍鐨勬洿濂斤紝鑰岀幇鍦ㄧ湅鏉ワ紝C++涔熷簲褰撳洖棣栧埌鐪熸灞炰簬浠栫殑閭d竴鐗囧湥鍦頒笂鈥︹?/p>
| SOCKET socket(int family,int type,int protocol)顎? |
| SOCKRET s;顎?br />s=socket(AF_INET,SOCK_DGRAM,0);顎?br />鎴杝=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)顎?/td> |
| int bind(SOCKET s,struct sockaddr_in*name,int namelen)顎?/td> |
| //璁劇疆鏈夊叧鐨勫叏灞鍙橀噺顎?br />SOCKET sr,ss;顎?br />HPSTR sockBufferS,sockBufferR;顎?br />HANDLE hSendData,hReceiveData;顎?br />DWROD dwDataSize=1024*4;顎?br />struct sockaddr_in therel.there2;顎?br />#DEFINE LOCAL_HOST_ADDR 200.200.200.201顎?br />#DEFINE REMOTE_HOST-ADDR 200.200.200.202顎?br />#DEFINE LOCAL_HOST_PORT 2000顎?br />#DEFINE LOCAL_HOST_PORT 2001顎?br />//濂楁帴瀛楀緩绔嬪嚱鏁邦? BOOL make_skt(HWND hwnd)顎?br />{顎?br />struct sockaddr_in here,here1;顎?br />ss=socket(AF_INET,SOCK_DGRAM,0);顎?br />sr=socket(AF_INET,SOCK_DGRAM,0);顎?br />if((ss==INVALID_SOCKET)||(sr==INVALID_SOCKET))顎?br />{顎?br />MessageBox(hwnd,鈥滃鎺ュ瓧寤虹珛澶辮觸!鈥濓紝鈥溾?MB_OK);顎?br />return(FALSE);顎?br />}顎?br />here.sin_family=AF_INET;顎?br />here.sin_addr.s_addr=inet_addr(LOCAL_HOST_ADDR);顎?br />here.sin_port=htons(LICAL_HOST_PORT);顎?br />//another socket顎?br />herel.sin_family=AF_INET;顎?br />herel.sin_addr.s_addr(LOCAL_HOST_ADDR);顎?br />herel.sin_port=htons(LOCAL_HOST_PORT1);顎?br />SocketBuffer();//濂楁帴瀛楃紦鍐插尯鐨勯攣瀹氳緗?br />setsockopt(ss,SOL_SOCKET,SO_SNDBUF,(char FAR*)sockBufferS,dwDataSize); if(bind(ss,(LPSOCKADDR)&here,sizeof(here))) { MessageBox(hwnd,鈥滃彂閫佸鎺ュ瓧緇戝畾澶辮觸!鈥濓紝鈥溾濓紝MB_OK); return(FALSE); } setsockopt(sr SQL_SOCKET,SO_RCVBUF|SO_REUSEADDR,(char FAR*) sockBufferR,dwDataSize); if(bind(sr,(LPSOCKADDR)&here1,sizeof(here1))) { MessageBox(hwnd,鈥滄帴鏀跺鎺ュ瓧緇戝畾澶辮觸!鈥濓紝鈥溾濓紝MB_OK); return(FALSE); } return(TRUE); } //濂楁帴瀛楃紦鍐插尯璁劇疆 void sockBuffer(void) { hSendData=GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,dwDataSize); if(!hSendData) { MessageBox(hwnd,鈥滃彂閫佸鎺ュ瓧緙撳啿鍖哄畾浣嶅け璐?鈥濓紝NULL, MB_OK|MB_ICONEXCLAMATION); return; } if((sockBufferS=GlobalLock(hSendData)==NULL) { MessageBox(hwnd,鈥滃彂閫佸鎺ュ瓧緙撳啿鍖洪攣瀹氬け璐?鈥濓紝NULL, MB_OK|MB_ICONEXCLAMATION); GlobalFree(hRecordData[0]; return; } hReceiveData=globalAlloc(GMEM_MOVEABLE|GMEM_SHARE,dwDataSize); if(!hReceiveData) { MessageBox(hwnd,"鈥滄帴鏀跺鎺ュ瓧緙撳啿鍖哄畾浣嶈觸!鈥濓紝NULL MB_OK|MB_ICONEXCLAMATION); return; } if((sockBufferT=Globallock(hReceiveData))=NULL) MessageBox(hwnd,"鍙戦佸鎺ュ瓧緙撳啿鍖洪攣瀹氬け璐?鈥濓紝NULL, MB_OK|MB_ICONEXCLAMATION); GlobalFree(hRecordData[0]); return; } { |
| int sendto(SOCKET s.char*buf,int len,int flags,struct sockaddr_in to,int tolen);顎?br />int recvfrom(SOCKET s.char*buf,int len,int flags,struct sockaddr_in fron,int*fromlen) |
| void CloseSocket(void)顎?br />{顎?br />GlobalUnlock(hSendData);顎?br />GlobalFree(hSenddata);顎?br />GlobalUnlock(hReceiveData);顎?br />GlobalFree(hReceiveDava);顎?br />if(WSAAysncSelect(ss,hwnd,0,0)=SOCKET_ERROR)顎?br />{顎?br />MessageBos(hwnd,鈥滃彂閫佸鎺ュ瓧鍏抽棴澶辮觸!鈥濓紝鈥溾濓紝MB_OK);顎?br />return;顎?br />}顎?br />if(WSAAysncSelect(sr,hwnd,0,0)==SOCKET_ERROR)顎?br />{顎? MessageBox(hwnd,鈥滄帴鏀跺鎺ュ瓧鍏抽棴澶辮觸!鈥濓紝鈥溾濓紝MB_OK);顎?br />return;顎?br />}顎?br />WSACleanup();顎?br />closesockent(ss);顎?br />closesockent(sr);顎?br />return;顎?br />}顎?/td> |
| int ok=sizeof(SOCKADDR);顎?br />case wMsg;顎?br />switch(1Param)顎?br />{顎?br />case FD_READ:顎?br />//濂楁帴瀛椾笂璇繪暟鎹?br />if(recvfrom(sr.lpPlayData[j],dwDataSize,0,(struct sockaddr FAR*)&there1, 顎?br />(int FAR*)&ok)==SOCKET_ERROR0顎?br />{顎?br />MessageBox)hwnd,鈥滄暟鎹帴鏀跺け璐?鈥濓紝鈥溾濓紝MB_OK);顎?br />return(FALSE);顎?br />}顎?br />case FD_WRITE:顎?br />//濂楁帴瀛椾笂鍐欐暟鎹?br />}顎?br />break錛涱?/td> |
| void OnServerOpen() //寮鍚湇鍔″櫒鍔熻兘 { 銆WSADATA wsaData; 銆int iErrorCode; 銆char chInfo[64]; 銆if (WSAStartup(WINSOCK_VERSION, &wsaData)) //璋冪敤Windows Sockets DLL 銆銆{ MessageBeep(MB_ICONSTOP); 銆銆銆MessageBox("Winsock鏃犳硶鍒濆鍖?", AfxGetAppName(), MB_OK|MB_ICONSTOP); 銆銆銆WSACleanup(); 銆銆銆return; } 銆else 銆銆WSACleanup(); 銆銆if (gethostname(chInfo, sizeof(chInfo))) 銆銆{ ReportWinsockErr("\n鏃犳硶鑾峰彇涓繪満!\n "); 銆銆銆return; } 銆銆CString csWinsockID = "\n==>>鏈嶅姟鍣ㄥ姛鑳藉紑鍚湪绔彛錛歂o. "; 銆銆csWinsockID += itoa(m_pDoc->m_nServerPort, chInfo, 10); 銆銆csWinsockID += "\n"; 銆銆PrintString(csWinsockID); //鍦ㄧ▼搴忚鍥炬樉紺烘彁紺轟俊鎭殑鍑芥暟錛岃鑰呭彲鑷鍒涘緩 銆銆m_pDoc->m_hServerSocket=socket(PF_INET, SOCK_STREAM, DEFAULT_PROTOCOL); 銆銆//鍒涘緩鏈嶅姟鍣ㄧSocket錛岀被鍨嬩負SOCK_STREAM錛岄潰鍚戣繛鎺ョ殑閫氫俊 銆銆if (m_pDoc->m_hServerSocket == INVALID_SOCKET) 銆銆{ ReportWinsockErr("鏃犳硶鍒涘緩鏈嶅姟鍣╯ocket!"); 銆銆銆return;} 銆銆m_pDoc->m_sockServerAddr.sin_family = AF_INET; 銆銆m_pDoc->m_sockServerAddr.sin_addr.s_addr = INADDR_ANY; 銆銆m_pDoc->m_sockServerAddr.sin_port = htons(m_pDoc->m_nServerPort); 銆銆if (bind(m_pDoc->m_hServerSocket, (LPSOCKADDR)&m_pDoc->m_sockServerAddr, 銆銆 銆銆銆銆 sizeof(m_pDoc->m_sockServerAddr)) == SOCKET_ERROR) //涓庨夊畾鐨勭鍙g粦瀹?br />銆銆銆{ReportWinsockErr("鏃犳硶緇戝畾鏈嶅姟鍣╯ocket!"); 銆銆銆銆return;} 銆銆銆iErrorCode=WSAAsyncSelect(m_pDoc->m_hServerSocket,m_hWnd, 銆銆銆WM_SERVER_ACCEPT, FD_ACCEPT); 銆銆銆//璁懼畾鏈嶅姟鍣ㄧ浉搴旂殑緗戠粶浜嬩歡涓篎D_ACCEPT錛屽嵆榪炴帴璇鋒眰錛?br />銆銆銆// 浜х敓鐩稿簲浼犻掔粰紿楀彛鐨勬秷鎭負WM_SERVER_ACCEPT 銆銆if (iErrorCode == SOCKET_ERROR) 銆銆銆{ ReportWinsockErr("WSAAsyncSelect璁懼畾澶辮觸!"); 銆銆銆銆return;} 銆銆if (listen(m_pDoc->m_hServerSocket, QUEUE_SIZE) == SOCKET_ERROR) //寮濮嬬洃鍚鎴瘋繛鎺ヨ姹?br />銆銆銆{ReportWinsockErr("鏈嶅姟鍣╯ocket鐩戝惉澶辮觸!"); 銆銆銆銆m_pParentMenu->EnableMenuItem(ID_SERVER_OPEN, MF_ENABLED); 銆銆銆銆return;} 銆銆m_bServerIsOpen = TRUE; //鐩戣鏈嶅姟鍣ㄦ槸鍚︽墦寮鐨勫彉閲?br />銆return; } |
| LRESULT OnClientRead(WPARAM wParam, LPARAM lParam) { 銆int iRead; 銆int iBufferLength; 銆int iEnd; 銆int iRemainSpace; 銆char chInBuffer[1024]; 銆int i; 銆for(i=0;(i 銆銆//MAXClient鏄湇鍔″櫒鍙搷搴旇繛鎺ョ殑鏈澶ф暟鐩?br />銆銆{} 銆if(i==MAXClient) return 0L; 銆銆iBufferLength = iRemainSpace = sizeof(chInBuffer); 銆銆iEnd = 0; 銆銆iRemainSpace -= iEnd; 銆銆iBytesRead = recv(m_aClientSocket[i], (LPSTR)(chInBuffer+iEnd), iSpaceRemaining, NO_FLAGS); 銆銆//鐢ㄥ彲鎺х紦鍐叉帴鏀跺嚱鏁皉ecv()鏉ユ帴鏀跺瓧絎?br />銆銆iEnd+=iRead; 銆if (iBytesRead == SOCKET_ERROR) 銆銆ReportWinsockErr("recv鍑洪敊!"); 銆銆chInBuffer[iEnd] = '\0'; 銆if (lstrlen(chInBuffer) != 0) 銆銆{PrintString(chInBuffer); //鏈嶅姟鍣ㄧ鏂囧瓧鏄劇ず 銆銆銆OnServerBroadcast(chInBuffer); //鑷繁緙栧啓鐨勫嚱鏁幫紝鍚戞墍鏈夎繛鎺ョ殑瀹㈡埛騫挎挱榪欎釜瀹㈡埛鐨勮亰澶╂枃瀛?br />銆銆} 銆return(0L); } |
| void OnSocketConnect() { WSADATA wsaData; 銆DWORD dwIPAddr; 銆SOCKADDR_IN sockAddr; 銆if(WSAStartup(WINSOCK_VERSION,&wsaData)) //璋冪敤Windows Sockets DLL 銆{MessageBox("Winsock鏃犳硶鍒濆鍖?",NULL,MB_OK); 銆銆return; 銆} 銆m_hSocket=socket(PF_INET,SOCK_STREAM,0); //鍒涘緩闈㈠悜榪炴帴鐨剆ocket 銆sockAddr.sin_family=AF_INET; //浣跨敤TCP/IP鍗忚 銆sockAddr.sin_port=m_iPort; //瀹㈡埛绔寚瀹氱殑IP鍦板潃 銆sockAddr.sin_addr.S_un.S_addr=dwIPAddr; 銆int nConnect=connect(m_hSocket,(LPSOCKADDR)&sockAddr,sizeof(sockAddr)); //璇鋒眰榪炴帴 銆if(nConnect) 銆銆ReportWinsockErr("榪炴帴澶辮觸!"); 銆else 銆銆MessageBox("榪炴帴鎴愬姛!",NULL,MB_OK); 銆銆int iErrorCode=WSAAsyncSelect(m_hSocket,m_hWnd,WM_SOCKET_READ,FD_READ); 銆銆//鎸囧畾鍝嶅簲鐨勪簨浠訛紝涓烘湇鍔″櫒鍙戦佹潵瀛楃 銆if(iErrorCode==SOCKET_ERROR) 銆MessageBox("WSAAsyncSelect璁懼畾澶辮觸!"); } |
![]() 銆銆銆銆銆銆銆銆闈㈠悜榪炴帴鐨勬祦寮忓鎺ュ瓧緙栫▼嫻佺▼紺烘剰鍥? |
| socket()->bind()->listen->accept()->recv()/send()->closesocket() |
| socket()->connect()->send()/recv()->closesocket() |
| sock=socket(AF_INET,SOCK_STREAM,0); |
| sockin.sin_family=AF_INET; sockin.sin_addr.s_addr=0; sockin.sin_port=htons(USERPORT); bind(sock,(LPSOCKADDR)&sockin,sizeof(sockin))); |
| //榪炴帴璇鋒眰闃熷垪闀垮害涓?錛屽嵆鍙厑璁告湁涓涓姹?鑻ユ湁澶氫釜璇鋒眰, //鍒欏嚭鐜伴敊璇紝緇欏嚭閿欒浠g爜WSAECONNREFUSED銆?br />listen(sock,1); //寮鍚嚎紼嬮伩鍏嶄富紼嬪簭鐨勯樆濉?br />AfxBeginThread(Server,NULL); 鈥︹?br />UINT Server(LPVOID lpVoid) { 鈥︹?br />int nLen=sizeof(SOCKADDR); pView->newskt=accept(pView->sock,(LPSOCKADDR)& pView->sockin,(LPINT)& nLen); 鈥︹? WSAAsyncSelect(pView->newskt,pView->m_hWnd,WM_SOCKET_MSG,FD_READ|FD_CLOSE); return 1; } |
| void CNetServerView::OnSocket(WPARAM wParam,LPARAM lParam) { int iReadLen=0; int message=lParam & 0x0000FFFF; switch(message) { case FD_READ://璇諱簨浠跺彂鐢熴傛鏃舵湁瀛楃鍒拌揪錛岄渶瑕佽繘琛屾帴鏀跺鐞?br />char cDataBuffer[MTU*10]; //閫氳繃濂楁帴瀛楁帴鏀朵俊鎭?br />iReadLen = recv(newskt,cDataBuffer,MTU*10,0); //灝嗕俊鎭繚瀛樺埌鏂囦歡 if(!file.Open("ServerFile.txt",CFile::modeReadWrite)) file.Open("E:ServerFile.txt",CFile::modeCreate|CFile::modeReadWrite); file.SeekToEnd(); file.Write(cDataBuffer,iReadLen); file.Close(); break; case FD_CLOSE://緗戠粶鏂紑浜嬩歡鍙戠敓銆傛鏃跺鎴鋒満鍏抽棴鎴栭鍑恒?br />鈥︹?/榪涜鐩稿簲鐨勫鐞?br />break; default: break; } } |
| //{{AFX_MSG(CNetServerView) //}}AFX_MSG void OnSocket(WPARAM wParam,LPARAM lParam); DECLARE_MESSAGE_MAP() |
| BEGIN_MESSAGE_MAP(CNetServerView, CView) //{{AFX_MSG_MAP(CNetServerView) //}}AFX_MSG_MAP ON_MESSAGE(WM_SOCKET_MSG,OnSocket) END_MESSAGE_MAP() |
| WSAAsyncSelect(s,hwnd,wMsg1,FD_READ); WSAAsyncSelect(s,hwnd,wMsg2,FD_CLOSE); |
| sockin.sin_family=AF_INET; //鍦板潃鏃?br />sockin.sin_addr.S_un.S_addr=IPaddr; //鎸囧畾鏈嶅姟鍣ㄧ殑IP鍦板潃 sockin.sin_port=m_Port; //鎸囧畾榪炴帴鐨勭鍙e彿 int nConnect=connect(sock,(LPSOCKADDR)&sockin,sizeof(sockin)); |
| int setsockopt( SOCKET s, int level, int optname, const char FAR *optval, int optlen );鍑芥暟鍏抽棴瀹? |
| SOCKET sConnect; sConnect=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); int bNodelay = 1; int err; err = setsockopt( sConnect, IPPROTO_TCP, TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));//涓嶉噰鐢ㄥ歡鏃剁畻娉? if (err != NO_ERROR) TRACE ("setsockopt failed for some reason\n");; |
| LONG lPort=3024; struct sockaddr_in ServerHostAddr;//鏈嶅姟涓繪満鍦板潃 ServerHostAddr.sin_family=AF_INET; ServerHostAddr.sin_port=::htons(u_short(lPort)); ServerHostAddr.sin_addr.s_addr=::inet_addr("192.168.1.3"); HOSTENT* pResult=gethostbyaddr((const char *) & (ServerHostAddr.sin_addr.s_addr),4,AF_INET); if(NULL==pResult) { int nErrorCode=WSAGetLastError(); TRACE("gethostbyaddr errorcode=%d",nErrorCode); } else { TRACE("gethostbyaddr %s\n",pResult->h_name);; } |
| TIMEVAL tv01 = {0, 1};//1ms閽熷歡榪?瀹為檯涓?-10姣 int nSelectRet; int nErrorCode; FD_SET fdr = {1, sConnect}; nSelectRet=::select(0, &fdr, NULL, NULL, &tv01);//媯鏌ュ彲璇葷姸鎬? if(SOCKET_ERROR==nSelectRet) { nErrorCode=WSAGetLastError(); TRACE("select read status errorcode=%d",nErrorCode); ::closesocket(sConnect); goto 閲嶆柊榪炴帴錛堝鎴鋒柟錛夛紝鎴栨湇鍔$嚎紼嬮鍑猴紙鏈嶅姟鏂癸級; } if(nSelectRet==0)//瓚呮椂鍙戠敓錛屾棤鍙鏁版嵁 { 緇х畫鏌ヨ鐘舵佹垨鍚戝鏂逛富鍔ㄥ彂閫? } else { 璇繪暟鎹? } |
| TIMEVAL tv01 = {0, 1};//1ms閽熷歡榪?瀹為檯涓?-10姣 int nSelectRet; int nErrorCode; FD_SET fdw = {1, sConnect}; nSelectRet=::select(0, NULL, NULL,&fdw, &tv01);//媯鏌ュ彲鍐欑姸鎬? if(SOCKET_ERROR==nSelectRet) { nErrorCode=WSAGetLastError(); TRACE("select write status errorcode=%d",nErrorCode); ::closesocket(sConnect); //goto 閲嶆柊榪炴帴錛堝鎴鋒柟錛夛紝鎴栨湇鍔$嚎紼嬮鍑猴紙鏈嶅姟鏂癸級; } if(nSelectRet==0)//瓚呮椂鍙戠敓錛岀紦鍐叉弧鎴栫綉緇滃繖 { //緇х畫鏌ュ啓鐘舵佹垨鏌ヨ鐘舵? } else { //鍙戦? } |
| SOCKET sConnect; sConnect=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); int nrcvbuf=1024*20; int err=setsockopt( sConnect, SOL_SOCKET, SO_SNDBUF,//鍐欑紦鍐詫紝璇葷紦鍐蹭負SO_RCVBUF (char *)&nrcvbuf, sizeof(nrcvbuf)); if (err != NO_ERROR) { TRACE("setsockopt Error!\n"); } 鍦ㄨ緗紦鍐叉椂錛屾鏌ユ槸鍚︾湡姝h緗垚鍔熺敤 int getsockopt( SOCKET s, int level, int optname, char FAR *optval, int FAR *optlen ); |
| SOCKET hServerSocket_DS=INVALID_SOCKET; struct sockaddr_in HostAddr_DS;//鏈嶅姟鍣ㄤ富鏈哄湴鍧 LONG lPort=3024; HostAddr_DS.sin_family=AF_INET; HostAddr_DS.sin_port=::htons(u_short(lPort)); HostAddr_DS.sin_addr.s_addr=htonl(INADDR_ANY); hServerSocket_DS=::socket( AF_INET, SOCK_STREAM,IPPROTO_TCP); if(hServerSocket_DS==INVALID_SOCKET) { AfxMessageBox("寤虹珛鏁版嵁鏈嶅姟鍣⊿OCKET 澶辮觸!"); return FALSE; } if(SOCKET_ERROR==::bind(hServerSocket_DS,(struct sockaddr *)(&(HostAddr_DS)),sizeof(SOCKADDR))) { int nErrorCode=WSAGetLastError (); TRACE("bind error=%d\n",nErrorCode); AfxMessageBox("Socket Bind 閿欒!"); return FALSE; } if(SOCKET_ERROR==::listen(hServerSocket_DS,10))//10涓鎴? { AfxMessageBox("Socket listen 閿欒!"); return FALSE; } AfxBeginThread(ServerThreadProc,NULL,THREAD_PRIORITY_NORMAL); |
| int PASCAL FAR listen( SOCKET s, int backlog ); 鍙?鏁幫細 s錛氶渶瑕佸緩绔嬬洃鍚殑Socket錛?br />backlog錛氭渶澶ц繛鎺ヤ釜鏁幫紱 |
| int PASCAL FAR WSAAsyncSelect( SOCKET s, HWND hWnd,unsigned int wMsg, long lEvent ); 鍙傛暟錛?s錛歋ocket 瀵硅薄錛?br />hWnd 錛氭帴鏀舵秷鎭殑紿楀彛鍙ユ焺錛?br />wMsg錛氫紶緇欑獥鍙g殑娑堟伅錛?br />lEvent錛氳娉ㄥ唽鐨勭綉緇滀簨浠訛紝涔熷嵆鏄簲鐢ㄧ▼搴忓悜紿楀彛鍙戦佹秷鎭殑緗戣礬浜嬩歡錛岃鍊間負涓嬪垪鍊糉D_READ銆丗D_WRITE銆丗D_OOB銆丗D_ACCEPT銆丗D_CONNECT銆丗D_CLOSE鐨勭粍鍚堬紝鍚勪釜鍊肩殑鍏蜂綋鍚剰涓篎D_READ錛氬笇鏈涘湪濂楁帴瀛桽鏀跺埌鏁版嵁鏃舵敹鍒版秷鎭紱FD_WRITE錛氬笇鏈涘湪濂楁帴瀛桽涓婂彲浠ュ彂閫佹暟鎹椂鏀跺埌娑堟伅錛汧D_ACCEPT錛氬笇鏈涘湪濂楁帴瀛桽涓婃敹鍒拌繛鎺ヨ姹傛椂鏀跺埌娑堟伅錛汧D_CONNECT錛氬笇鏈涘湪濂楁帴瀛桽涓婅繛鎺ユ垚鍔熸椂鏀跺埌娑堟伅錛汧D_CLOSE錛氬笇鏈涘湪濂楁帴瀛桽涓婅繛鎺ュ叧闂椂鏀跺埌娑堟伅錛汧D_OOB錛氬笇鏈涘湪濂楁帴瀛桽涓婃敹鍒板甫澶栨暟鎹椂鏀跺埌娑堟伅銆? |
| switch(lParam)銆 銆 {case FD_READ: 銆銆銆 鈥︺銆 銆 break; case FD_WRITE銆?br />銆銆銆 鈥?br />銆 break; 銆銆銆 鈥?br />} |
| SOCKET PASCAL FAR accept( SCOKET s, struct sockaddr FAR *addr,int FAR *addrlen ); 鍙傛暟錛歴錛歋ocket鐨勮瘑鍒爜錛?br />addr錛氬瓨鏀炬潵榪炴帴鐨勫鎴風鐨勫湴鍧錛?br />addrlen錛歛ddr鐨勯暱搴?/td> |
| int PASCAL FAR closesocket( SOCKET s ); 鍙?鏁幫細s錛歋ocket 鐨勮瘑鍒爜錛?br />int PASCAL FAR WSACleanup( void ); 鍙?鏁幫細 鏃?/td> |
| int PASCAL FAR connect( SOCKET s, const struct sockaddr FAR *name, int namelen ); 鍙?鏁幫細s錛歋ocket 鐨勮瘑鍒爜錛?br />name錛歋ocket鎯寵榪炴帴鐨勫鏂瑰湴鍧錛?br />namelen錛歯ame鐨勯暱搴?/td> |
| int PASCAL FAR send( SOCKET s, const char FAR *buf,int len, int flags ); 鍙傛暟錛歴錛歋ocket 鐨勮瘑鍒爜 buf錛氬瓨鏀捐浼犻佺殑璧勬枡鐨勬殏瀛樺尯 len buf錛氱殑闀垮害 flags錛氭鍑芥暟琚皟鐢ㄧ殑鏂瑰紡 |
| int PASCAL FAR recv( SOCKET s, char FAR *buf, int len, int flags ); 鍙傛暟錛歴錛歋ocket 鐨勮瘑鍒爜 buf錛氬瓨鏀炬帴鏀跺埌鐨勮祫鏂欑殑鏆傚瓨鍖?br />len buf錛氱殑闀垮害 flags錛氭鍑芥暟琚皟鐢ㄧ殑鏂瑰紡 |
| ////////////////////////////////////// CMySocket::CMySocket() : file://綾葷殑鏋勯犲嚱鏁?br />{ 銆WSADATA wsaD; 銆memset( m_LastError, 0, ERR_MAXLENGTH ); 銆// m_LastError鏄被鍐呭瓧絎︿覆鍙橀噺,鍒濆鍖栫敤鏉ュ瓨鏀炬渶鍚庨敊璇鏄庣殑瀛楃涓詫紱 銆// 鍒濆鍖栫被鍐卻ockaddr_in緇撴瀯鍙橀噺錛屽墠鑰呭瓨鏀懼鎴風鍦板潃錛屽悗鑰呭搴斾簬鏈嶅姟鍣ㄧ鍦板潃; 銆memset( &m_sockaddr, 0, sizeof( m_sockaddr ) ); 銆memset( &m_rsockaddr, 0, sizeof( m_rsockaddr ) ); 銆int result = WSAStartup((WORD)((1<<8|1)錛?&wsaD);//鍒濆鍖朩inSocket鍔ㄦ佽繛鎺ュ簱; 銆if( result != 0 ) // 鍒濆鍖栧け璐ワ紱 銆{ set_LastError( "WSAStartup failed!", WSAGetLastError() ); 銆銆return; 銆} } ////////////////////////////// CMySocket::~CMySocket() { WSACleanup(); }//綾葷殑鏋愭瀯鍑芥暟錛?br />//////////////////////////////////////////////////// int CMySocket::Create( void ) 銆{// m_hSocket鏄被鍐匰ocket瀵硅薄錛屽垱寤轟竴涓熀浜嶵CP/IP鐨凷ocket鍙橀噺錛屽茍灝嗗艱祴緇欒鍙橀噺錛?br />銆銆if ( (m_hSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP )) == INVALID_SOCKET ) 銆銆{ 銆銆銆set_LastError( "socket() failed", WSAGetLastError() ); 銆銆銆return ERR_WSAERROR; 銆銆} 銆銆return ERR_SUCCESS; 銆} /////////////////////////////////////////////// int CMySocket::Close( void )//鍏抽棴Socket瀵硅薄錛?br />{ 銆if ( closesocket( m_hSocket ) == SOCKET_ERROR ) 銆{ 銆銆set_LastError( "closesocket() failed", WSAGetLastError() ); 銆銆return ERR_WSAERROR; 銆} 銆file://閲嶇疆sockaddr_in 緇撴瀯鍙橀噺錛?br />銆memset( &m_sockaddr, 0, sizeof( sockaddr_in ) ); 銆memset( &m_rsockaddr, 0, sizeof( sockaddr_in ) ); 銆return ERR_SUCCESS; } ///////////////////////////////////////// int CMySocket::Connect( char* strRemote, unsigned int iPort )//瀹氫箟榪炴帴鍑芥暟錛?br />{ 銆if( strlen( strRemote ) == 0 || iPort == 0 ) 銆銆return ERR_BADPARAM; 銆hostent *hostEnt = NULL; 銆long lIPAddress = 0; 銆hostEnt = gethostbyname( strRemote );//鏍規嵁璁$畻鏈哄悕寰楀埌璇ヨ綆楁満鐨勭浉鍏沖唴瀹癸紱 銆if( hostEnt != NULL ) 銆{ 銆銆lIPAddress = ((in_addr*)hostEnt->h_addr)->s_addr; 銆銆m_sockaddr.sin_addr.s_addr = lIPAddress; 銆} 銆else 銆{ 銆銆m_sockaddr.sin_addr.s_addr = inet_addr( strRemote ); 銆} 銆m_sockaddr.sin_family = AF_INET; 銆m_sockaddr.sin_port = htons( iPort ); 銆if( connect( m_hSocket, (SOCKADDR*)&m_sockaddr, sizeof( m_sockaddr ) ) == SOCKET_ERROR ) 銆{ 銆銆set_LastError( "connect() failed", WSAGetLastError() ); 銆銆return ERR_WSAERROR; 銆} 銆return ERR_SUCCESS; } /////////////////////////////////////////////////////// int CMySocket::Bind( char* strIP, unsigned int iPort )//緇戝畾鍑芥暟錛?br />{ 銆if( strlen( strIP ) == 0 || iPort == 0 ) 銆銆return ERR_BADPARAM; 銆memset( &m_sockaddr,0, sizeof( m_sockaddr ) ); 銆m_sockaddr.sin_family = AF_INET; 銆m_sockaddr.sin_addr.s_addr = inet_addr( strIP ); 銆m_sockaddr.sin_port = htons( iPort ); 銆if ( bind( m_hSocket, (SOCKADDR*)&m_sockaddr, sizeof( m_sockaddr ) ) == SOCKET_ERROR ) 銆{ 銆銆set_LastError( "bind() failed", WSAGetLastError() ); 銆銆return ERR_WSAERROR; 銆} 銆return ERR_SUCCESS; } ////////////////////////////////////////// int CMySocket::Accept( SOCKET s )//寤虹珛榪炴帴鍑芥暟錛孲涓虹洃鍚琒ocket瀵硅薄鍚嶏紱 { 銆int Len = sizeof( m_rsockaddr ); 銆memset( &m_rsockaddr, 0, sizeof( m_rsockaddr ) ); 銆if( ( m_hSocket = accept( s, (SOCKADDR*)&m_rsockaddr, &Len ) ) == INVALID_SOCKET ) 銆{ 銆銆set_LastError( "accept() failed", WSAGetLastError() ); 銆銆return ERR_WSAERROR; 銆} 銆return ERR_SUCCESS; } ///////////////////////////////////////////////////// int CMySocket::asyncSelect( HWND hWnd, unsigned int wMsg, long lEvent ) file://浜嬩歡閫夋嫨鍑芥暟錛?br />{ 銆if( !IsWindow( hWnd ) || wMsg == 0 || lEvent == 0 ) 銆銆return ERR_BADPARAM; 銆if( WSAAsyncSelect( m_hSocket, hWnd, wMsg, lEvent ) == SOCKET_ERROR ) 銆{ 銆銆set_LastError( "WSAAsyncSelect() failed", WSAGetLastError() ); 銆銆return ERR_WSAERROR; 銆} 銆return ERR_SUCCESS; } //////////////////////////////////////////////////// int CMySocket::Listen( int iQueuedConnections )//鐩戝惉鍑芥暟錛?br />{ 銆if( iQueuedConnections == 0 ) 銆銆return ERR_BADPARAM; 銆if( listen( m_hSocket, iQueuedConnections ) == SOCKET_ERROR ) 銆{ 銆銆set_LastError( "listen() failed", WSAGetLastError() ); 銆銆return ERR_WSAERROR; 銆} 銆return ERR_SUCCESS; } //////////////////////////////////////////////////// int CMySocket::Send( char* strData, int iLen )//鏁版嵁鍙戦佸嚱鏁幫紱 { 銆if( strData == NULL || iLen == 0 ) 銆銆return ERR_BADPARAM; 銆if( send( m_hSocket, strData, iLen, 0 ) == SOCKET_ERROR ) 銆{ 銆銆set_LastError( "send() failed", WSAGetLastError() ); 銆銆return ERR_WSAERROR; 銆} 銆return ERR_SUCCESS; } ///////////////////////////////////////////////////// int CMySocket::Receive( char* strData, int iLen )//鏁版嵁鎺ユ敹鍑芥暟錛?br />{ 銆if( strData == NULL ) 銆銆return ERR_BADPARAM; 銆int len = 0; 銆int ret = 0; 銆ret = recv( m_hSocket, strData, iLen, 0 ); 銆if ( ret == SOCKET_ERROR ) 銆{ 銆銆set_LastError( "recv() failed", WSAGetLastError() ); 銆銆return ERR_WSAERROR; 銆} 銆return ret; } void CMySocket::set_LastError( char* newError, int errNum ) file://WinSock API鎿嶄綔閿欒瀛楃涓茶緗嚱鏁幫紱 { 銆memset( m_LastError, 0, ERR_MAXLENGTH ); 銆memcpy( m_LastError, newError, strlen( newError ) ); 銆m_LastError[strlen(newError)+1] = '\0'; } |
銆銆浜屻佷富瑕佹墿鍏呰鏄?/b>
銆銆1銆佸紓姝ラ夋嫨鏈哄埗錛?br />
銆銆Windows Sockets 鐨勫紓姝ラ夋嫨鍑芥暟鎻愪緵浜嗘秷鎭満鍒剁殑緗戠粶浜嬩歡閫夋嫨錛屽綋浣跨敤瀹冪櫥璁扮綉緇滀簨浠跺彂鐢熸椂錛屽簲鐢ㄧ▼搴忕浉搴旂獥鍙e嚱鏁板皢鏀跺埌涓涓秷鎭紝娑堟伅涓寚紺轟簡鍙戠敓鐨勭綉緇滀簨浠訛紝浠ュ強涓庝簨浠剁浉鍏崇殑涓浜涗俊鎭?br />
銆銆Windows Sockets 鎻愪緵浜嗕竴涓紓姝ラ夋嫨鍑芥暟 WSAAsyncSelect()錛岀敤瀹冩潵娉ㄥ唽搴旂敤紼嬪簭鎰熷叴瓚g殑緗戠粶浜嬩歡錛屽綋榪欎簺浜嬩歡鍙戠敓鏃訛紝搴旂敤紼嬪簭鐩稿簲鐨勭獥鍙e嚱鏁板皢鏀跺埌涓涓秷鎭?br />
銆銆鍑芥暟緇撴瀯濡備笅錛?/p>
| int PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent); |
銆銆鍙傛暟璇存槑錛?br />
銆銆銆hWnd錛氱獥鍙e彞鏌?br />
銆銆銆wMsg錛氶渶瑕佸彂閫佺殑娑堟伅
銆銆銆lEvent錛氫簨浠訛紙浠ヤ笅涓轟簨浠剁殑鍐呭錛?br />
| 鍊鹼細 | 鍚箟錛?/td> |
| FD_READ | 鏈熸湜鍦ㄥ鎺ュ瓧涓婃敹鍒版暟鎹紙鍗寵鍑嗗濂斤級鏃舵帴鍒伴氱煡 |
| FD_WRITE | 鏈熸湜鍦ㄥ鎺ュ瓧涓婂彲鍙戦佹暟鎹紙鍗沖啓鍑嗗濂斤級鏃舵帴鍒伴氱煡 |
| FD_OOB | 鏈熸湜鍦ㄥ鎺ュ瓧涓婃湁甯﹀鏁版嵁鍒拌揪鏃舵帴鍒伴氱煡 |
| FD_ACCEPT | 鏈熸湜鍦ㄥ鎺ュ瓧涓婃湁澶栨潵榪炴帴鏃舵帴鍒伴氱煡 |
| FD_CONNECT | 鏈熸湜鍦ㄥ鎺ュ瓧榪炴帴寤虹珛瀹屾垚鏃舵帴鍒伴氱煡 |
| FD_CLOSE | 鏈熸湜鍦ㄥ鎺ュ瓧鍏抽棴鏃舵帴鍒伴氱煡 |
銆銆渚嬪錛氭垜浠鍦ㄥ鎺ュ瓧璇誨噯澶囧ソ鎴栧啓鍑嗗濂芥椂鎺ュ埌閫氱煡錛岃鍙ュ涓嬶細
| rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE); |
銆銆濡傛灉鎴戜滑闇瑕佹敞閿瀵瑰鎺ュ瓧緗戠粶浜嬩歡鐨勬秷鎭彂閫侊紝鍙灝?lEvent 璁劇疆涓?
銆銆2銆佸紓姝ヨ姹傚嚱鏁?br />
銆銆鍦?Berkeley Sockets 涓姹傛湇鍔℃槸闃誨鐨勶紝WINDOWS SICKETS 闄や簡鏀寔榪欎竴綾誨嚱鏁板錛岃繕澧炲姞浜嗙浉搴旂殑寮傛璇鋒眰鍑芥暟(WSAAsyncGetXByY();)銆?
銆銆3銆侀樆濉炲鐞嗘柟娉?br />
銆銆Windows Sockets 涓轟簡瀹炵幇褰撲竴涓簲鐢ㄧ▼搴忕殑濂楁帴瀛楄皟鐢ㄥ浜庨樆濉炴椂錛岃兘澶熸斁寮僀PU璁╁叾瀹冨簲鐢ㄧ▼搴忚繍琛岋紝瀹冨湪璋冪敤澶勪簬闃誨鏃朵究榪涘叆涓涓彨鈥淗OOK鈥濈殑渚嬬▼錛屾渚嬬▼璐熻矗鎺ユ敹鍜屽垎閰峎INDOWS娑堟伅錛屼嬌寰楀叾瀹冨簲鐢ㄧ▼搴忎粛鐒惰兘澶熸帴鏀跺埌鑷繁鐨勬秷鎭茍鍙栧緱鎺у埗鏉冦?br />
銆銆WINDOWS 鏄潪鎶㈠厛鐨勫浠誨姟鐜錛屽嵆鑻ヤ竴涓▼搴忎笉涓誨姩鏀懼純鍏舵帶鍒舵潈錛屽埆鐨勭▼搴忓氨涓嶈兘鎵ц銆傚洜姝ゅ湪璁捐Windows Sockets 紼嬪簭鏃訛紝灝界緋葷粺鏀寔闃誨鎿嶄綔錛屼絾榪樻槸鍙嶅紼嬪簭鍛樹嬌鐢ㄨ鎿嶄綔銆備絾鐢變簬 SUN 鍏徃涓嬬殑 Berkeley Sockets 鐨勫鎺ュ瓧榛樿鎿嶄綔鏄樆濉炵殑錛學INDOWS 浣滀負縐繪鐨?SOCKETS 涔熶笉鍙伩鍏嶅榪欎釜鎿嶄綔鏀寔銆?br />
銆銆鍦╓indows Sockets 瀹炵幇涓紝瀵逛簬涓嶈兘绔嬪嵆瀹屾垚鐨勯樆濉炴搷浣滃仛濡備笅澶勭悊錛欴LL鍒濆鍖栤啋寰幆鎿嶄綔銆傚湪寰幆涓紝瀹冨彂閫佷換浣?WINDOWS 娑堟伅錛屽茍媯鏌ヨ繖涓?Windows Sockets 璋冪敤鏄惁瀹屾垚錛屽湪蹇呰鏃訛紝瀹冨彲浠ユ斁寮僀PU璁╁叾瀹冨簲鐢ㄧ▼搴忔墽琛岋紙褰撶劧浣跨敤瓚呯嚎紼嬬殑CPU灝變笉浼氭湁榪欎釜楹葷儲浜哵_^錛夈傛垜浠彲浠ヨ皟鐢?WSACancelBlockingCall() 鍑芥暟鍙栨秷姝ら樆濉炴搷浣溿?br />
銆銆鍦?Windows Sockets 涓紝鏈変竴涓粯璁ょ殑闃誨澶勭悊渚嬬▼ BlockingHook() 綆鍗曞湴鑾峰彇騫跺彂閫?WINDOWS 娑堟伅銆傚鏋滆瀵瑰鏉傜▼搴忚繘琛屽鐞嗭紝Windows Sockets 涓繕鏈?WSASetBlockingHook() 鎻愪緵鐢ㄦ埛瀹夎鑷繁鐨勯樆濉炲鐞嗕緥紼嬭兘鍔涳紱涓庤鍑芥暟鐩稿搴旂殑鍒欐槸 SWAUnhookBlockingHook()錛屽畠鐢ㄤ簬鍒犻櫎鍏堝墠瀹夎鐨勪換浣曢樆濉炲鐞嗕緥紼嬶紝騫墮噸鏂板畨瑁呴粯璁ょ殑澶勭悊渚嬬▼銆傝娉ㄦ剰錛岃璁¤嚜宸辯殑闃誨澶勭悊渚嬬▼鏃訛紝闄や簡鍑芥暟 WSACancelBlockingHook() 涔嬪錛屽畠涓嶈兘浣跨敤鍏跺畠鐨?Windows Sockets API 鍑芥暟銆傚湪澶勭悊渚嬬▼涓皟鐢?WSACancelBlockingHook()鍑芥暟灝嗗彇娑堝浜庨樆濉炵殑鎿嶄綔錛屽畠灝嗙粨鏉熼樆濉炲驚鐜?/p>
銆銆4銆佸嚭閿欏鐞?br />
銆銆Windows Sockets 涓轟簡鍜屼互鍚庡綰跨▼鐜錛圵INDOWS/UNIX錛夊吋瀹癸紝瀹冩彁渚涗簡涓や釜鍑洪敊澶勭悊鍑芥暟鏉ヨ幏鍙栧拰璁劇疆褰撳墠綰跨▼鐨勬渶榪戦敊璇彿銆傦紙WSAGetLastEror()鍜學SASetLastError()錛?/p>
銆銆5銆佸惎鍔ㄤ笌緇堟
銆銆浣跨敤鍑芥暟 WSAStartup() 鍜?WSACleanup() 鍚姩鍜岀粓姝㈠鎺ュ瓧銆?br />
涓夈乄indows Sockets緗戠粶紼嬪簭璁捐鏍稿績
銆銆鎴戜滑緇堜簬鍙互寮濮嬬湡姝g殑 Windows Sockets 緗戠粶紼嬪簭璁捐浜嗐備笉榪囨垜浠繕鏄厛鐪嬩竴鐪嬫瘡涓?Windows Sockets 緗戠粶紼嬪簭閮借娑夊強鐨勫唴瀹廣傝鎴戜滑涓姝ユ鎱㈡參璧般?/p>
銆銆1銆佸惎鍔ㄤ笌緇堟
銆銆鍦ㄦ墍鏈?Windows Sockets 鍑芥暟涓紝鍙湁鍚姩鍑芥暟 WSAStartup() 鍜岀粓姝㈠嚱鏁?WSACleanup() 鏄繀欏諱嬌鐢ㄧ殑銆?br />
銆銆鍚姩鍑芥暟蹇呴』鏄涓涓嬌鐢ㄧ殑鍑芥暟錛岃屼笖瀹冨厑璁告寚瀹?Windows Sockets API 鐨勭増鏈紝騫惰幏寰?SOCKETS鐨勭壒瀹氱殑涓浜涙妧鏈粏鑺傘傛湰緇撴瀯濡備笅錛?br />
| int PASCAL FAR WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); |
銆銆鍏朵腑 wVersionRequested 淇濊瘉 SOCKETS 鍙甯歌繍琛岀殑 DLL 鐗堟湰錛屽鏋滀笉鏀寔錛屽垯榪斿洖閿欒淇℃伅銆?br />鎴戜滑鐪嬩竴涓嬩笅闈㈣繖孌典唬鐮侊紝鐪嬩竴涓嬪浣曡繘琛?WSAStartup() 鐨勮皟鐢?br />
| WORD wVersionRequested;// 瀹氫箟鐗堟湰淇℃伅鍙橀噺 WSADATA wsaData;//瀹氫箟鏁版嵁淇℃伅鍙橀噺 int err;//瀹氫箟閿欒鍙峰彉閲?br />wVersionRequested = MAKEWORD(1,1);//緇欑増鏈俊鎭祴鍊?br />err = WSAStartup(wVersionRequested, &wsaData);//緇欓敊璇俊鎭祴鍊?br />if(err!=0) { return;//鍛婅瘔鐢ㄦ埛鎵句笉鍒板悎閫傜殑鐗堟湰 } //紜 Windows Sockets DLL 鏀寔 1.1 鐗堟湰 //DLL 鐗堟湰鍙互楂樹簬 1.1 //緋葷粺榪斿洖鐨勭増鏈彿濮嬬粓鏄渶浣庤姹傜殑 1.1錛屽嵆搴旂敤紼嬪簭涓嶥LL 涓彲鏀寔鐨勬渶浣庣増鏈彿 if(LOBYTE(wsaData.wVersion)!= 1|| HIBYTE(wsaData.wVersion)!=1) { WSACleanup();//鍛婅瘔鐢ㄦ埛鎵句笉鍒板悎閫傜殑鐗堟湰 return; } //Windows Sockets DLL 琚繘紼嬫帴鍙楋紝鍙互榪涘叆涓嬩竴姝ユ搷浣?/td> |
銆銆鍏抽棴鍑芥暟浣跨敤鏃訛紝浠諱綍鎵撳紑騫跺凡榪炴帴鐨?SOCK_STREAM 濂楁帴瀛楄澶嶄綅錛屼絾閭d簺宸茬敱 closesocket() 鍑芥暟鍏抽棴鐨勪絾浠嶆湁鏈彂閫佹暟鎹殑濂楁帴瀛椾笉鍙楀獎鍝嶏紝鏈彂閫佺殑鏁版嵁浠嶅皢琚彂閫併傜▼搴忚繍琛屾椂鍙兘浼氬嬈¤皟鐢?WSAStartuo() 鍑芥暟錛屼絾蹇呴』淇濊瘉姣忔璋冪敤鏃剁殑 wVersionRequested 鐨勫兼槸鐩稿悓鐨勩?/p>
銆銆2銆佸紓姝ヨ姹傛湇鍔?br />
銆銆Windows Sockets 闄ゆ敮鎸?Berkeley Sockets 涓悓姝ヨ姹傦紝榪樺鍔犱簡浜嗕竴綾誨紓姝ヨ姹傛湇鍔″嚱鏁?WSAAsyncGerXByY()銆傝鍑芥暟鏄樆濉炶姹傚嚱鏁扮殑寮傛鐗堟湰銆傚簲鐢ㄧ▼搴忚皟鐢ㄥ畠鏃訛紝鐢?Windows Sockets DLL 鍒濆鍖栬繖涓鎿嶄綔騫惰繑鍥炶皟鐢ㄨ咃紝姝ゅ嚱鏁拌繑鍥炰竴涓紓姝ュ彞鏌勶紝鐢ㄦ潵鏍囪瘑榪欎釜鎿嶄綔銆傚綋緇撴灉瀛樺偍鍦ㄨ皟鐢ㄨ呮彁渚涚殑緙撳啿鍖猴紝騫朵笖鍙戦佷竴涓秷鎭埌搴旂敤紼嬪簭鐩稿簲紿楀彛銆傚父鐢ㄧ粨鏋勫涓嬶細
| HANDLE taskHnd; char hostname="rs6000"; taskHnd = WSAAsyncBetHostByName(hWnd,wMsg,hostname,buf,buflen); |
銆銆闇瑕佹敞鎰忕殑鏄紝鐢變簬 Windows 鐨勫唴瀛樺鍍忓彲浠ヨ緗負鍙Щ鍔ㄥ拰鍙涪寮冿紝鍥犳鍦ㄦ搷浣滃唴瀛樺璞℃槸錛屽繀欏諱繚璇?WIindows Sockets DLL 瀵硅薄鏄彲鐢ㄧ殑銆?
銆銆3銆佸紓姝ユ暟鎹紶杈?br />
銆銆浣跨敤 send() 鎴?sendto() 鍑芥暟鏉ュ彂閫佹暟鎹紝浣跨敤 recv() 鎴杛ecvfrom() 鏉ユ帴鏀舵暟鎹俉indows Sockets 涓嶉紦鍔辯敤鎴蜂嬌鐢ㄩ樆濉炴柟寮忎紶杈撴暟鎹紝鍥犱負閭f牱鍙兘浼氶樆濉炴暣涓?Windows 鐜銆備笅闈㈡垜浠湅涓涓紓姝ユ暟鎹紶杈撳疄渚嬶細
銆銆鍋囪濂楁帴瀛?s 鍦ㄨ繛鎺ュ緩绔嬪悗錛屽凡緇忎嬌鐢ㄤ簡鍑芥暟 WSAAsyncSelect() 鍦ㄥ叾涓婃敞鍐屼簡緗戠粶浜嬩歡 FD_READ 鍜?FD_WRITE錛屽茍涓?wMsg 鍊間負 UM_SOCK錛岄偅涔堟垜浠彲浠ュ湪 Windows 娑堟伅寰幆涓鍔犲涓嬬殑鍒嗘敮璇彞錛?/p>
| case UM_SOCK: switch(lParam) { case FD_READ: len = recv(wParam,lpBuffer,length,0); break; case FD_WRITE: while(send(wParam,lpBuffer,len,0)!=SOCKET_ERROR) break; } break; |
銆銆4銆佸嚭閿欏鐞?br />
銆銆Windows 鎻愪緵浜嗕竴涓嚱鏁版潵鑾峰彇鏈榪戠殑閿欒鐮?WSAGetLastError()錛屾帹鑽愮殑緙栧啓鏂瑰紡濡備笅錛?
| len = send (s,lpBuffer,len,0); of((len==SOCKET_ERROR)&&(WSAGetLastError()==WSAWOULDBLOCK)){...} |
銆銆棣栧厛鏈嶅姟鍣ㄦ柟瑕佸厛鍚姩錛屽茍鏍規嵁璇風ず鎻愪緵鐩稿簲鏈嶅姟錛氾紙榪囩▼濡備笅錛?br />
銆銆1銆佹墦寮涓閫氫俊閫氶亾騫跺憡鐭ユ湰鍦頒富鏈猴紝瀹冩効鎰忓湪鏌愪竴涓叕璁ゅ湴鍧涓婃帴鏀跺鎴瘋姹傘?br />
銆銆2銆佺瓑寰呭鎴瘋姹傚埌杈捐绔彛銆?br />
銆銆3銆佹帴鏀跺埌閲嶅鏈嶅姟璇鋒眰錛屽鐞嗚璇鋒眰騫跺彂閫佸簲絳斾俊鍙楓?br />
銆銆4銆佽繑鍥炵浜屾錛岀瓑寰呭彟涓瀹㈡埛璇鋒眰
銆銆5銆佸叧闂湇鍔″櫒銆?br />
銆銆瀹㈡埛鏂癸細
銆銆1銆佹墦寮涓閫氫俊閫氶亾錛屽茍榪炴帴鍒版湇鍔″櫒鎵鍦ㄤ富鏈虹殑鐗瑰畾绔彛銆?br />
銆銆2銆佸悜鏈嶅姟鍣ㄥ彂閫佹湇鍔¤姹傛姤鏂囷紝絳夊緟騫舵帴鏀跺簲絳旓紱緇х畫鎻愬嚭璇鋒眰鈥︹?br />
銆銆3銆佽姹傜粨鏉熷悗鍏抽棴閫氫俊閫氶亾騫剁粓姝€?/p>
銆銆浜屻佸熀鏈鎺ュ瓧
銆銆涓轟簡鏇村ソ璇存槑濂楁帴瀛楃紪紼嬪師鐞嗭紝緇欏嚭鍑犱釜鍩烘湰鐨勫鎺ュ瓧錛屽湪浠ュ悗鐨勭瘒騫呬腑浼氱粰鍑烘洿璇︾粏鐨勪嬌鐢ㄨ鏄庛?br />
銆銆1銆佸垱寤哄鎺ュ瓧鈥斺攕ocket()
銆銆鍔熻兘錛氫嬌鐢ㄥ墠鍒涘緩涓涓柊鐨勫鎺ュ瓧
銆銆鏍煎紡錛歋OCKET PASCAL FAR socket(int af,int type,int procotol);
銆銆鍙傛暟錛歛f: 閫氫俊鍙戠敓鐨勫尯鍩?br />
銆銆type: 瑕佸緩绔嬬殑濂楁帴瀛楃被鍨?br />
銆銆procotol: 浣跨敤鐨勭壒瀹氬崗璁?/p>
銆銆2銆佹寚瀹氭湰鍦板湴鍧鈥斺攂ind()
銆銆鍔熻兘錛氬皢濂楁帴瀛楀湴鍧涓庢墍鍒涘緩鐨勫鎺ュ瓧鍙瘋仈緋昏搗鏉ャ?br />
銆銆鏍煎紡錛歩nt PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);
銆銆鍙傛暟錛歴: 鏄敱socket()璋冪敤榪斿洖鐨勫茍涓旀湭浣滆繛鎺ョ殑濂楁帴瀛楁弿榪扮錛堝鎺ュ瓧鍙鳳級銆?br />
銆銆鍏跺畠錛氭病鏈夐敊璇紝bind()榪斿洖0錛屽惁鍒橲OCKET_ERROR
銆銆鍦板潃緇撴瀯璇存槑錛?br />
struct sockaddr_in
{
short sin_family;//AF_INET
u_short sin_port;//16浣嶇鍙e彿錛岀綉緇滃瓧鑺傞『搴?br />struct in_addr sin_addr;//32浣岻P鍦板潃錛岀綉緇滃瓧鑺傞『搴?br />char sin_zero[8];//淇濈暀
}
銆銆3銆佸緩绔嬪鎺ュ瓧榪炴帴鈥斺攃onnect()鍜宎ccept()
銆銆鍔熻兘錛氬叡鍚屽畬鎴愯繛鎺ュ伐浣?br />
銆銆鏍煎紡錛歩nt PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);
銆銆SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR * addrlen);
銆銆鍙傛暟錛氬悓涓?/p>
銆銆4銆佺洃鍚繛鎺モ斺攍isten()
銆銆鍔熻兘錛氱敤浜庨潰鍚戣繛鎺ユ湇鍔″櫒錛岃〃鏄庡畠鎰挎剰鎺ユ敹榪炴帴銆?br />
銆銆鏍煎紡錛歩nt PASCAL FAR listen(SOCKET s, int backlog);
銆銆5銆佹暟鎹紶杈撯斺攕end()涓巖ecv()
銆銆鍔熻兘錛氭暟鎹殑鍙戦佷笌鎺ユ敹
銆銆鏍煎紡錛歩nt PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);
銆銆int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);
銆銆鍙傛暟錛歜uf:鎸囧悜瀛樻湁浼犺緭鏁版嵁鐨勭紦鍐插尯鐨勬寚閽堛?
銆銆6銆佸璺鐢ㄢ斺攕elect()
銆銆鍔熻兘錛氱敤鏉ユ嫻嬩竴涓垨澶氫釜濂楁帴瀛楃姸鎬併?br />
銆銆鏍煎紡錛歩nt PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds,
fd_set FAR * exceptfds,const struct timeval FAR * timeout);
銆銆鍙傛暟錛歳eadfds:鎸囧悜瑕佸仛璇繪嫻嬬殑鎸囬拡
銆銆銆銆銆writefds:鎸囧悜瑕佸仛鍐欐嫻嬬殑鎸囬拡
銆銆銆銆銆exceptfds:鎸囧悜瑕佹嫻嬫槸鍚﹀嚭閿欑殑鎸囬拡
銆銆銆銆銆timeout:鏈澶х瓑寰呮椂闂?/p>
銆銆7銆佸叧闂鎺ュ瓧鈥斺攃losesocket()
銆銆鍔熻兘錛氬叧闂鎺ュ瓧s
銆銆鏍煎紡錛欱OOL PASCAL FAR closesocket(SOCKET s);
涓夈佸吀鍨嬭繃紼嬪浘
銆銆2.1 闈㈠悜榪炴帴鐨勫鎺ュ瓧鐨勭郴緇熻皟鐢ㄦ椂搴忓浘

銆銆2.2 鏃犺繛鎺ュ崗璁殑濂楁帴瀛楄皟鐢ㄦ椂搴忓浘
聽 銆2.3 闈㈠悜榪炴帴鐨勫簲鐢ㄧ▼搴忔祦紼嬪浘
銆銆1銆乀CP/IP浣撶郴緇撴瀯
銆銆TCP/IP鍗忚瀹為檯涓婂氨鏄湪鐗╃悊緗戜笂鐨勪竴緇勫畬鏁寸殑緗戠粶鍗忚銆傚叾涓璗CP鏄彁渚涗紶杈撳眰鏈嶅姟錛岃孖P鍒欐槸鎻愪緵緗戠粶灞傛湇鍔°俆CP/IP鍖呮嫭浠ヤ笅鍗忚錛氾紙緇撴瀯濡傚浘1.1錛?/p>
(鍥?.1)
銆銆IP錛?緗戦棿鍗忚(Internet Protocol) 璐熻矗涓繪満闂存暟鎹殑璺敱鍜岀綉緇滀笂鏁版嵁鐨勫瓨鍌ㄣ傚悓鏃朵負ICMP錛孴CP錛屻銆銆UDP鎻愪緵鍒嗙粍鍙戦佹湇鍔°傜敤鎴瘋繘紼嬮氬父涓嶉渶瑕佹秹鍙婅繖涓灞傘?br />
銆銆ARP錛?鍦板潃瑙f瀽鍗忚(Address Resolution Protocol)
銆銆銆姝ゅ崗璁皢緗戠粶鍦板潃鏄犲皠鍒扮‖浠跺湴鍧銆?br />
銆銆RARP錛?鍙嶅悜鍦板潃瑙f瀽鍗忚(Reverse Address Resolution Protocol)
銆銆銆姝ゅ崗璁皢紜歡鍦板潃鏄犲皠鍒扮綉緇滃湴鍧
銆銆ICMP錛?緗戦棿鎶ユ枃鎺у埗鍗忚(Internet Control Message Protocol)
銆銆銆姝ゅ崗璁鐞嗕俊鍏沖拰涓繪満鐨勫樊閿欏拰浼犻佹帶鍒躲?br />
銆銆TCP錛?浼犻佹帶鍒跺崗璁?Transmission Control Protocol)
銆銆銆榪欐槸涓縐嶆彁渚涚粰鐢ㄦ埛榪涚▼鐨勫彲闈犵殑鍏ㄥ弻宸ュ瓧鑺傛祦闈㈠悜榪炴帴鐨勫崗璁傚畠瑕佷負鐢ㄦ埛榪涚▼鎻愪緵铏氱數璺湇鍔★紝騫朵負鏁版嵁鍙潬浼犺緭寤虹珛媯鏌ャ傦紙娉細澶у鏁扮綉緇滅敤鎴風▼搴忎嬌鐢═CP錛?br />
銆銆UDP錛?鐢ㄦ埛鏁版嵁鎶ュ崗璁?User Datagram Protocol)
銆銆銆榪欐槸鎻愪緵緇欑敤鎴瘋繘紼嬬殑鏃犺繛鎺ュ崗璁紝鐢ㄤ簬浼犻佹暟鎹屼笉鎵ц姝g‘鎬ф鏌ャ?br />
銆銆FTP錛?鏂囦歡浼犺緭鍗忚(File Transfer Protocol)
銆銆銆鍏佽鐢ㄦ埛浠ユ枃浠舵搷浣滅殑鏂瑰紡錛堟枃浠剁殑澧炪佸垹銆佹敼銆佹煡銆佷紶閫佺瓑錛変笌鍙︿竴涓繪満鐩鎬簰閫氫俊銆?br />
銆銆SMTP錛?綆鍗曢偖浠朵紶閫佸崗璁?Simple Mail Transfer Protocol)
銆銆銆SMTP鍗忚涓虹郴緇熶箣闂翠紶閫佺數瀛愰偖浠躲?br />
銆銆TELNET錛氱粓绔崗璁?Telnet Terminal Procotol)
銆銆銆鍏佽鐢ㄦ埛浠ヨ櫄緇堢鏂瑰紡璁塊棶榪滅▼涓繪満
銆銆HTTP錛?瓚呮枃鏈紶杈撳崗璁?Hypertext Transfer Procotol)
銆銆
銆銆TFTP: 綆鍗曟枃浠朵紶杈撳崗璁?Trivial File Transfer Protocol)
銆銆2銆乀CP/IP鐗圭偣
銆銆TCP/IP鍗忚鐨勬牳蹇冮儴鍒嗘槸浼犺緭灞傚崗璁?TCP銆乁DP)錛岀綉緇滃眰鍗忚(IP)鍜岀墿鐞嗘帴鍙e眰錛岃繖涓夊眰閫氬父鏄湪鎿嶄綔緋葷粺鍐呮牳涓疄鐜般傚洜姝ょ敤鎴蜂竴鑸笉娑夊強銆傜紪紼嬫椂錛岀紪紼嬬晫闈㈡湁涓ょ褰㈠紡錛氫竴銆佹槸鐢卞唴鏍稿績鐩存帴鎻愪緵鐨勭郴緇熻皟鐢紱浜屻佷嬌鐢ㄤ互搴撳嚱鏁版柟寮忔彁渚涚殑鍚勭鍑芥暟銆傚墠鑰呬負鏍稿唴瀹炵幇錛屽悗鑰呬負鏍稿瀹炵幇銆傜敤鎴鋒湇鍔¤閫氳繃鏍稿鐨勫簲鐢ㄧ▼搴忔墠鑳藉疄鐜幫紝鎵浠ヨ浣跨敤濂楁帴瀛?socket)鏉ュ疄鐜般?br />
銆銆鍥?.2鏄疶CP/IP鍗忚鏍稿績涓庡簲鐢ㄧ▼搴忓叧緋誨浘銆?br />
(鍥?.2)
銆銆浜屻佷笓鐢ㄦ湳璇?/b>
銆銆1銆佸鎺ュ瓧
銆銆濂楁帴瀛楁槸緗戠粶鐨勫熀鏈瀯浠躲傚畠鏄彲浠ヨ鍛藉悕鍜屽鍧鐨勯氫俊绔偣錛屼嬌鐢ㄤ腑鐨勬瘡涓涓鎺ュ瓧閮芥湁鍏剁被鍨嬪拰涓涓笌涔嬬浉榪炲惉榪涚▼銆傚鎺ュ瓧瀛樺湪閫氫俊鍖哄煙錛堥氫俊鍖哄煙鍙堢О鍦板潃綈囷級涓傚鎺ュ瓧鍙笌鍚屼竴鍖哄煙涓殑濂楁帴瀛椾氦鎹㈡暟鎹紙璺ㄥ尯鍩熸椂錛岄渶瑕佹墽琛屾煇鍜岃漿鎹㈣繘紼嬫墠鑳藉疄鐜幫級銆俉INDOWS 涓殑濂楁帴瀛楀彧鏀寔涓涓煙鈥斺旂綉闄呭煙銆傚鎺ュ瓧鍏鋒湁綾誨瀷銆?br />
銆銆WINDOWS SOCKET 1.1 鐗堟湰鏀寔涓ょ濂楁帴瀛楋細嫻佸鎺ュ瓧(SOCK_STREAM)鍜屾暟鎹姤濂楁帴瀛?SOCK_DGRAM)
銆銆2銆乄INDOWS SOCKETS 瀹炵幇
銆銆涓涓猈INDOWS SOCKETS 瀹炵幇鏄寚瀹炵幇浜哤INDOWS SOCKETS瑙勮寖鎵鎻忚堪鐨勫叏閮ㄥ姛鑳界殑涓濂楄蔣浠躲備竴鑸氳繃DLL鏂囦歡鏉ュ疄鐜?/p>
銆銆3銆侀樆濉炲鐞嗕緥紼?br />
銆銆闃誨澶勭悊渚嬬▼(blocking hook,闃誨閽╁瓙)鏄疻INDOWS SOCKETS瀹炵幇涓轟簡鏀寔闃誨濂楁帴瀛楀嚱鏁拌皟鐢ㄨ屾彁渚涚殑涓縐嶆満鍒躲?/p>
銆銆4銆佸鍧騫挎挱錛坢ulticast錛屽鐐逛紶閫佹垨緇勬挱錛?br />
銆銆鏄竴縐嶄竴瀵瑰鐨勪紶杈撴柟寮忥紝浼犺緭鍙戣搗鑰呴氳繃涓嬈′紶杈撳氨灝嗕俊鎭紶閫佸埌涓緇勬帴鏀惰咃紝涓庡崟鐐逛紶閫?br />(unicast)鍜屽箍鎾?Broadcast)鐩稿搴斻?/p>