锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美三级电影精品,欧美日本一道本,欧美一区二区福利在线http://m.shnenglu.com/eday/瀹夊叏鐗規(guī)т笉絳変簬瀹夊叏鐨勭壒鎬?/description>zh-cnSun, 16 Nov 2025 19:44:04 GMTSun, 16 Nov 2025 19:44:04 GMT60鍒╃敤瀹忔潵鐢熸垚C++鍑芥暟鐨勬敞閲? 鍑忓皯鍐欎唬鐮佹椂閲嶅杈撳叆鐨勭儲鎭?/title><link>http://m.shnenglu.com/eday/archive/2007/07/15/28079.html</link><dc:creator>鐙涔?jié)鍓?/dc:creator><author>鐙涔?jié)鍓?/author><pubDate>Sun, 15 Jul 2007 14:47:00 GMT</pubDate><guid>http://m.shnenglu.com/eday/archive/2007/07/15/28079.html</guid><description><![CDATA[     鎽樿:         鍦ㄥ畾涔夊嚱鏁版椂錛屼竴鐩翠互鏉ラ兘鏄墜宸ュ姞鍏ュ嚱鏁版敞閲婏紝铏界劧姣忎釜鍑芥暟鐨勬敞閲婂唴瀹瑰茍涓嶆槸澶錛屼絾鎬繪槸浼?xì)鏈夊緢澶氶噸澶嶆х殑宸ヤ綔錛屽搸銆傝繖涓ゅぉ鏈夌偣鏃墮棿鐪嬬湅鏈変粈涔堟柟娉曚簡錛屾槰澶╁彂鐜板師鏉?Vistual Studio 2005閲屾湁涓畯IDE宸ュ叿鍙互瀹炵幇鎴戠殑鐩殑錛堝樋鍢胯絎戯紝鎬庝箞鏃╂病鍙戠幇錛夛紝鐮旂┒涓涓嬩簡...錛屾檿姝繪槸Basic璇█錛岃繕濂借瀹炵幇鎴戠殑鍔熻兘...  <a href='http://m.shnenglu.com/eday/archive/2007/07/15/28079.html'>闃呰鍏ㄦ枃</a><img src ="http://m.shnenglu.com/eday/aggbug/28079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/eday/" target="_blank">鐙涔?jié)鍓?/a> 2007-07-15 22:47 <a href="http://m.shnenglu.com/eday/archive/2007/07/15/28079.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鐢╒S2005涔熻兘鍒朵綔浣撶Н寰堝皬鐨刉in32紼嬪簭(2KB - 3KB)http://m.shnenglu.com/eday/archive/2007/05/23/24707.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Wed, 23 May 2007 11:51:00 GMThttp://m.shnenglu.com/eday/archive/2007/05/23/24707.html璇濆氨涓嶅璇翠簡錛屼綘涓瀹氳兘鐪嬫噦銆傝繖閲岃繍琛屾椂搴撲竴瀹氳鎸囧畾涓?澶氱嚎紼?MT"錛屽惁鍒欐渶鍚嶳elease鐗堟湰鐨勭▼搴忓湪鍏朵粬鏈哄櫒涓婃棤娉曡繍琛岋紟
鍛戒護(hù)琛?/MT  鎴?


榪欓噷鎸囧畾鑷畾涔夊叆鍙e嚱鏁板悕 鍛戒護(hù)琛?/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
//----------------------------------------------

#include "stdafx.h"

HANDLE hStdIn;
HANDLE hStdOut;

BOOL __stdcall CtrlHandler(DWORD CtrlType)
{
    
if(CtrlType==CTRL_C_EVENT || CtrlType==CTRL_BREAK_EVENT)
        CloseHandle(hStdIn);
    
return TRUE;
}

void Start()
{
    hStdIn 
= GetStdHandle(STD_INPUT_HANDLE);
    hStdOut 
= GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleMode(hStdIn,ENABLE_LINE_INPUT
|ENABLE_ECHO_INPUT|ENABLE_PROCESSED_INPUT);
    SetConsoleCtrlHandler(CtrlHandler,TRUE);

    HANDLE hHeap 
= GetProcessHeap();
    PVOID szBuffer 
= HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1024);
    DWORD dwBytesRead,dwBytesWrite;
    
while(TRUE){
        
if(!ReadConsole(hStdIn,szBuffer,1024,&dwBytesRead,NULL) || ((char*)szBuffer)[0== 'q' )
            
break;
        WriteConsole(hStdOut,szBuffer,dwBytesRead,
&dwBytesWrite,NULL);
    }
    HeapFree(hHeap,HEAP_NO_SERIALIZE,szBuffer);
    ExitProcess(
0);
}


//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
//----------------------------------------------------

#include "stdafx.h"

void __stdcall Start()
{
    MessageBoxA(NULL,
"Hello World!","?",MB_OK);
    ExitProcess(
0);
}

// Release鐗堟湰


//鍒朵綔Win32 - DLL鏂囦歡鐨勬柟娉曚笌鍓嶉潰鐩稿悓

浠ヤ笂浠呬嬌鐢?span style="COLOR: #ff0000">Windows鏍囧噯搴?/span>錛屾渶鍚庣敓鎴愮殑紼嬪簭鍙湁 3KB澶у皬錛屽熀鏈笂鍜屾眹緙栧啓鐨勭▼搴忓ぇ灝忓樊涓嶅浜嗭紟銆
 
濡傛灉瑕佸啀灝忕偣錛屾垜浠彲浠ユ妸 鍙鏁版嵁銆佸鍏ヨ〃浠ュ強(qiáng)瀵煎嚭琛ㄨ妭.rdata涓庝唬鐮佽妭.text鍚堝茍銆?榪欓噷鎻愬埌鐨勮妭鍖烘槸浠C緙栬瘧鍣ㄤ負(fù)鍑嗭紝涓嶅悓鐨勭紪璇戝櫒瀵硅妭鐨勫懡鍚嶄篃璁鎬細(xì)鏈変簺涓嶅悓)
榪炴帴鍣ㄥ懡浠よ娣誨姞 /merge:.rdata=.text 鎴?


鐜板湪鍐嶇湅鐪嬪ぇ灝?:(  2KB 浜嗐?br>

]]>
浠嶣MP寰楀埌ICON鍙ユ焺鏈綆鍗曠殑鏂規(guī)硶http://m.shnenglu.com/eday/archive/2007/05/05/23459.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Sat, 05 May 2007 12:37:00 GMThttp://m.shnenglu.com/eday/archive/2007/05/05/23459.html
    HBITMAP newimg = (HBITMAP)LoadImage(AfxGetInstanceHandle(),_T("f:\\1.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    
if(newimg)
    {
        CBitmap 
*pBitmap = CBitmap::FromHandle(newimg);
        BITMAP bmpData;
        
if(pBitmap->GetBitmap(&bmpData))
        {
            ICONINFO iconInfo 
= { true, bmpData.bmWidth/2, bmpData.bmHeight/2, newimg, newimg  };
            HICON bIcon 
= CreateIconIndirect(&iconInfo);
            
if(bIcon)
            {
                CClientDC dc(
this);
                dc.DrawIcon(
0,0,bIcon);
                ::DestroyIcon(bIcon);
            }
        }
    }

鏄劇ずICON浠呬粎涓轟簡婕旂ず錛?榪欓噷涓昏鐨勭洰鐨勬槸寰楀埌 HICON 鍙ユ焺銆?

]]>
鍦–Wnd媧劇敓紿楀彛涓姩鎬佸垱寤篊heckBox,RadioButton, 鍘婚櫎鎺т歡鑳屾櫙(WM_PAINT)http://m.shnenglu.com/eday/archive/2007/04/19/22263.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Wed, 18 Apr 2007 18:04:00 GMThttp://m.shnenglu.com/eday/archive/2007/04/19/22263.html
template<class BASE_CLASS>
class CTransparentButton : public BASE_CLASS
{
public:
    
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
        
switch (message)
        {
        
case WM_PAINT:
            {
                CPaintDC dc(
this);
                CString iText;
                CRect boxRc, textRc;
                
int wh = 14;
                boxRc.SetRectEmpty();
                GetClientRect(
&textRc);
                textRc.bottom = 20;
                boxRc.top 
= ((int)textRc.Height()/2)-7;
                textRc.left 
= boxRc.right = boxRc.bottom = boxRc.top+wh;
                textRc.left 
+= 2;
                
switch(GetButtonStyle())
                {
                
case BS_AUTOCHECKBOX:
                    {
                        
if(GetCheck())
                            dc.DrawFrameControl(
&boxRc,DFC_BUTTON,DFCS_CHECKED);            
                        
else
                            dc.DrawFrameControl(
&boxRc,DFC_BUTTON,DFCS_BUTTONCHECK);
                    }
                    
break;
                
case BS_AUTORADIOBUTTON:
                    {
                        
if(GetCheck())
                        {
                            dc.DrawFrameControl(
&boxRc,DFC_BUTTON,DFCS_BUTTONRADIO);
                            boxRc.DeflateRect(
6,5);
                            CBrush bkBrush(RGB(
0,0,0));
                            dc.SelectObject(
&bkBrush);
                            dc.RoundRect(
&boxRc,CPoint(boxRc.Width()/2,boxRc.Height()/2));
                        }
                        
else
                            dc.DrawFrameControl(
&boxRc,DFC_BUTTON,DFCS_BUTTONRADIO);
                    }
                    
break;
                }
                GetWindowText(iText);
                dc.SelectStockObject(DEFAULT_GUI_FONT);
                dc.DrawText(iText,
&textRc,DT_VCENTER|DT_SINGLELINE);
            }
            
break;
        }
        
return BASE_CLASS::WindowProc(message, wParam, lParam);
    }
};

浣跨敤鏂規(guī)硶錛?br>protected:
        CTransparentButton<CButton>  m_checkbox;
        CTransparentButton<CButton>  m_radiobtn1;
        CTransparentButton<CButton>  m_radiobtn2;

//-----------------------------------------------------------------
CCustomWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        if (CWnd::OnCreate(lpCreateStruct) == -1)
                return -1;
         //鍒涘緩鎺т歡
         m_checkbox.Create(_T("CheckBox"),WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,
                CRect(0,20,80,40), this, IDC_CHECKBOX1);
         m_radiobtn1.Create(_T("RadioButton1"),WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON ,
                CRect(0,50,80,70), this, IDC_RADIOBTN1);
         m_radiobtn2.Create(_T("RadioButton2"),WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON ,
                CRect(0,80,80,100), this, IDC_RADIOBTN2);
         //....................
}
      

]]>
Win32 璋冪敤緋葷粺鍛戒護(hù)鍙栧緱緇撴灉http://m.shnenglu.com/eday/archive/2007/03/29/20811.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Wed, 28 Mar 2007 16:16:00 GMThttp://m.shnenglu.com/eday/archive/2007/03/29/20811.html
// ----------------------------------------------------------------------------------
//  Use:> 
//         CString resultContext;
//         ExecuteCmdEx( (LPTSTR)(LPCTSTR)CString("net help"), resultContext);
// ----------------------------------------------------------------------------------
BOOL ExecuteCmdEx(LPTSTR cmdline, CString &  outputResult)
{
    SECURITY_ATTRIBUTES sa;
    sa.nLength 
=   sizeof (SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor 
=  NULL;
    sa.bInheritHandle 
=  TRUE;
    HANDLE hInput,hOutput;
    
if  ( ! CreatePipe( & hInput, & hOutput, & sa, 0 )) 
        
return  FALSE;

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( 
& si,  sizeof (si) );
    ZeroMemory( 
& pi,  sizeof (pi) );
    si.cb 
=   sizeof (si);
    si.hStdError 
=  hOutput;
    si.hStdOutput 
=  hOutput;
    si.wShowWindow 
=  SW_HIDE;
    si.dwFlags 
=  STARTF_USESHOWWINDOW  |  STARTF_USESTDHANDLES;   
    
if  ( ! CreateProcess(NULL,cmdline,NULL,NULL,TRUE,NULL,NULL,NULL, & si, & pi)){
        CloseHandle(hInput);
        CloseHandle(hOutput);
        
return  FALSE;
    }
    WaitForSingleObject( pi.hProcess, INFINITE );
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

    DWORD rByte 
=   4095 ;
    
char  outputBuffer[ 4096 ];
    
while (rByte == 4095 ){
        ZeroMemory(outputBuffer,
sizeof ( char ) * 4096 );
        ReadFile(hInput,outputBuffer,
sizeof ( char ) * 4095 , & rByte, NULL);
        outputResult 
+=  outputBuffer;
    }
    CloseHandle(hInput);
    CloseHandle(hOutput);

    
return  TRUE;
}


]]>
瑙e喅紿楀彛鍒鋒柊闂儊http://m.shnenglu.com/eday/archive/2007/03/19/20106.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Sun, 18 Mar 2007 16:14:00 GMThttp://m.shnenglu.com/eday/archive/2007/03/19/20106.html涓鑸殑windows 澶嶆潅鐨勭晫闈㈤渶瑕佷嬌鐢ㄥ灞傜獥鍙h屼笖瑕佺敤璐村浘鏉ョ編鍖栵紝鎵浠ヤ笉鍙伩鍏嶅湪紿楀彛縐誨姩鎴栬呮敼鍙樺ぇ灝忕殑鏃跺欏嚭鐜伴棯鐑併?/p>

鍏堟潵璋堣皥闂儊浜х敓鐨勫師鍥?/p>

鍘熷洜涓錛?br />濡傛灉鐔熸?zhèn)夋槕謲″師鐞嗙殑璇濆Q岃皟鐢℅DI鍑芥暟鍚戝睆騫曡緭鍑虹殑鏃跺欏茍涓嶆槸绔嬪埢灝辨樉紺哄湪灞忓箷
涓婂彧鏄啓鍒頒簡鏄懼瓨閲岋紝鑰屾樉鍗℃瘡闅斾竴孌墊椂闂存妸鏄懼瓨鐨勫唴瀹硅緭鍑哄埌灞忓箷涓婏紝榪欏氨鏄埛鏂板懆鏈熴?/p>

涓鑸樉鍗$殑鍒鋒柊鍛ㄦ湡鏄?1/80縐掑乏鍙籌紝鍏蜂綋鏁板瓧鍙互鑷繁璁劇疆鐨勩?/p>

榪欐牱闂灝辨潵浜嗭紝涓鑸敾鍥鵑兘鏄厛鐢昏儗鏅壊錛岀劧鍚庡啀鎶婂唴瀹圭敾涓婂幓錛屽鏋滆繖涓ゆ鎿嶄綔涓嶅湪鍚屼竴涓?br />鍒鋒柊鍛ㄦ湡鍐呭畬鎴愶紝閭d箞緇欎漢鐨勮瑙夋劅鍙楀氨鏄紝鍏堢湅鍒板彧鏈夎儗鏅壊鐨勫浘鍍忥紝鐒跺悗鐪嬪埌鐢諱笂鍐呭鐨勫浘鍍忥紝
榪欐牱灝變細(xì)鎰熻闂儊浜嗐?/p>

瑙e喅鏂規(guī)硶錛氬敖閲忓揩鐨勮緭鍑哄浘鍍忥紝浣胯緭鍑哄湪涓涓埛鏂板懆鏈熷唴瀹屾垚錛屽鏋滆緭鍑哄唴瀹瑰緢澶氭瘮杈冩參錛岄偅涔堥噰鐢?br />鍐呭瓨緙撳啿鐨勬柟娉曪紝鍏堟妸瑕佽緭鍑虹殑鍐呭鍦ㄥ唴瀛樺噯澶囧ソ錛岀劧鍚庝竴嬈¤緭鍑哄埌鏄懼瓨銆傝鐭ラ亾涓嬈PI璋冪敤涓鑸彲浠?br />鍦ㄤ竴涓埛鏂板懆鏈熷唴瀹屾垚銆?/p>

瀵逛簬GDI錛岀敤鍒涘緩鍐呭瓨DC鐨勬柟娉曞氨鍙互浜?/p>

鍘熷洜浜岋細(xì)

澶嶆潅鐨勭晫闈㈡湁澶氬眰紿楀彛緇勬垚錛屽綋windows鍦ㄧ獥鍙f敼鍙樺ぇ灝忕殑鏃跺欐槸鍏堥噸鐢葷埗紿楀彛錛岀劧鍚庨噸鐢誨瓙紿楀彛錛屽瓙鐖?br />紿楀彛閲嶇敾鐨勮繃紼嬩竴鑸棤娉曞湪涓涓埛鏂板懆鏈熷唴瀹屾垚錛屾墍浠ヤ細(xì)鍛堢幇闂儊銆?/p>

鎴戜滑鐭ラ亾鐖剁獥鍙d笂琚瓙紿楀彛鎸′綇鐨勯儴鍒嗗叾瀹炴病蹇呰閲嶇敾鐨?/p>

瑙e喅鏂規(guī)硶錛氱粰紿楀彛鍔犱釜椋庢牸 WS_CLIPCHILDREN ,榪欐牱鐖剁獥鍙d笂琚瓙紿楀彛鎸′綇鐨勯儴鍒嗗氨涓嶄細(xì)閲嶇敾浜嗐?/p>

濡傛灉鍚岀駭紿楀彛涔嬮棿鏈夐噸鍙狅紝閭d箞闇瑕佸啀鍔犱笂 WS_CLIPSIBLINGS 椋庢牸

鍘熷洜涓夛細(xì)

鏈夋椂鍊欓渶瑕佸湪紿楀彛涓婁嬌鐢ㄤ竴浜涙帶浠訛紝姣斿IE錛屽綋浣犵殑紿楀彛鏀瑰彉澶у皬鐨勬椂鍊橧E浼?xì)闂儊锛屽嵆鋴射綘鏈変簡WS_CLIPCHILDREN
涔熸病鐢ㄣ傚師鍥犲湪浜庣獥鍙g殑綾婚鏍兼湁CS_HREDRAW 鎴栬?CS_VREDRAW錛岃繖涓や釜椋庢牸琛ㄧず紿楀彛鍦ㄥ搴︽垨鑰呴珮搴﹀彉鍖栫殑鏃跺?br />閲嶇敾錛屼絾鏄繖鏍峰氨浼?xì)寮曡捣IE闂儊

瑙e喅鏂規(guī)硶錛氭敞鍐岀獥鍙g被鐨勬椂鍊欎笉瑕佷嬌鐢ㄨ繖涓や釜椋庢牸錛屽鏋滅獥鍙i渶瑕佸湪鏀瑰彉澶у皬鐨勬椂鍊欓噸鐢伙紝閭d箞鍙互鍦╓M_SIZE鐨勬椂鍊?br />璋冪敤RedrawWindow銆?/p>

鍘熷洜鍥涳細(xì)

鐣岄潰涓婄獥鍙e緢澶氾紝鑰屼笖鏀瑰彉澶у皬鏃跺緢澶氱獥鍙i兘瑕佺Щ鍔ㄥ拰鏀瑰彉澶у皬錛屽鏋滀嬌鐢∕oveWindow鎴栬匰etWindowPos涓や釜API鏉?br />鏀瑰彉紿楀彛鐨勫ぇ灝忓拰浣嶇疆錛岀敱浜庝粬浠槸絳夊緟紿楀彛閲嶇敾瀹屾垚鍚庢墠榪斿洖錛屾墍浠ヨ繃紼嬪緢鎱紝榪欐牱瑙嗚鏁堟灉灝卞彲鑳戒細(xì)闂儊銆?/p>

瑙e喅鏂規(guī)硶錛?/p>

浣跨敤浠ヤ笅API鏉ュ鐞嗙獥鍙gЩ鍔紝BeginDeferWindowPos, DeferWindowPos錛孍ndDeferWindowPos
鍏堣皟鐢?BeginDeferWindowPos 璁懼畾闇瑕佺Щ鍔ㄧ殑紿楀彛鐨勪釜鏁?br />浣跨敤DeferWindowPos錛屾潵縐誨姩紿楀彛錛岃繖涓狝PI騫朵笉鐪熺殑閫犳垚紿楀彛縐誨姩
EndDeferWindowPos 涓嬈℃у畬鎴愭墍鏈夌獥鍙g殑澶у皬鍜屼綅緗殑鏀瑰彉銆?/p>

鏈変釜鍦版柟瑕佺壒鍒敞鎰忥紝瑕佷粩緇嗚綆楁竻妤氳縐誨姩澶氬皯涓獥鍙o紝BeginDeferWindowPos璁懼畾
鐨勪釜鏁頒竴瀹氳鍜屽疄闄呯殑涓暟涓鑷達(dá)紝鍚﹀垯鍦╓in9x涓嬶紝濡傛灉瀹為檯縐誨姩鐨勭獥鍙f暟澶氫簬璋冪敤BeginDeferWindowPos
鏃惰瀹氱殑涓暟錛屽彲鑳戒細(xì)閫犳垚緋葷粺宕╂簝銆傚湪Windows NT緋誨垪涓嬩笉浼?xì)鏈墭q欐牱鐨勯棶棰樸?/p>

濡傛灉浣犲湪灞炴ч噷璁劇疆浜?鎷栧姩紿楀彛鏄劇ず紿楀彛鍐呭鐨勮瘽錛屽睆騫曠湅璧鋒潵浼?xì)闂澶氥備綘鍙互閫氳繃api SystemParameters錛堬級 錛屾妸瀹冨幓鎺夊湪浣犵殑搴旂敤紼嬪簭閲屻傝繖鏍峰湪鐢ㄦ埛鐪嬫潵浼?xì)濂戒竴鐐廣傝繖鍙槸鎴戜釜浜哄緩璁?/p>

----------------------------

聽聽聽聽聽聽聽 1銆佸皢Invalidate()鏇挎崲涓篒nvalidateRect()

銆銆Invalidate()浼?xì)瀵艰嚧鏁翠釜绐楀彛鐨勫浘璞¢噸鐢诲Q岄渶瑕佺殑鏃墮棿姣旇緝闀匡紝鑰孖nvalidateRect()浠呬粎閲嶇敾Rect鍖哄煙鍐呯殑鍐呭錛屾墍浠ユ墍闇鏃墮棿浼?xì)灏戜竴浜涖傝櫕铏互鍓嶅緢鎳掞紝緇忓父涓轟竴灝忓潡鍖哄煙鐨勯噸鐢誨氨璋冪敤Invalidate()錛屼笉鎰挎剰鑷繁鍘昏綆楅渶瑕侀噸鐢葷殑Rect錛屼絾鏄簨瀹炴槸錛屽鏋滀綘紜疄闇瑕佹敼鍠勯棯鐑佺殑鎯呭喌錛岃綆椾竴涓猂ect鎵鐢ㄧ殑鏃墮棿姣旇搗閲嶇敾閭d簺涓嶉渶瑕侀噸鐢葷殑鍐呭鎵闇瑕佺殑鏃墮棿瑕佸皯寰楀銆?

銆銆2銆佺姝㈢郴緇熸惤闄や綘鐨勭獥鍙?br />
銆銆緋葷粺鍦ㄩ渶瑕侀噸鐢葷獥鍙g殑鏃跺欎細(xì)甯綘鐢ㄦ寚瀹氱殑鑳屾櫙鑹叉潵鎼介櫎紿楀彛銆傚彲鏄紝涔熻闇瑕侀噸鐢葷殑鍖哄煙涔熻闈炲父灝忋傛垨鑰咃紝鍦ㄤ綘閲嶇敾榪欎簺涓滆タ涔嬮棿榪樿緇忚繃澶ч噺鐨勮綆楁墠鑳藉紑濮嬨傝繖涓椂鍊欎綘鍙互紱佹緋葷粺鎼芥帀鍘熸潵鐨勫浘璞°傜洿鍒頒綘宸茬粡璁$畻濂戒簡鎵鏈夌殑鏁版嵁錛岃嚜宸辨妸閭d簺闇瑕佹惤鎺夌殑閮ㄥ垎鐢ㄨ儗鏅壊瑕嗙洊鎺夛紙濡傦細(xì)dc.FillRect(rect,&brush);rect鏄渶瑕佹惤闄ょ殑鍖哄煙錛宐rush鏄甫鑳屾櫙鑹茬殑鍒峰瓙錛夛紝鍐嶇敾涓婃柊鐨勫浘褰€傝紱佹緋葷粺鎼介櫎浣犵殑紿楀彛錛屽彲浠ラ噸杞絆nEraseBkgnd()鍑芥暟錛岃鍏剁洿鎺ヨ繑鍥瀙UE灝卞彲浠ヤ簡銆傚

BOOL CMyWin::OnEraseBkgnd(CDC* pDC)
{
銆return pUE;
銆//return CWnd::OnEraseBkgnd(pDC);//鎶婄郴緇熷師鏉ョ殑榪欐潯璇彞娉ㄩ噴鎺夈?
}

銆銆3銆佹湁鏁堢殑榪涜鎼介櫎

銆銆鎼介櫎鑳屾櫙鐨勬椂鍊欙紝涓嶈璇ユ惤涓嶈鎼界殑鍦版柟閮芥惤銆傛瘮濡傦紝浣犲湪涓涓獥鍙d笂鏀句簡涓涓緢澶х殑Edit妗嗭紝鍑犱箮鍗犱簡鏁翠釜紿楀彛錛岄偅涔堜綘棰戠箒鐨勬惤闄ゆ暣涓獥鍙h儗鏅皢瀵艱嚧Edit涓嶅仠閲嶇敾褰㈡垚鍓х儓鐨勯棯鐑併備簨瀹炰笂浣犲彲浠Rgn鍒涘緩涓涓渶瑕佹惤闄ょ殑鍖哄煙錛屽彧鎼介櫎榪欎竴閮ㄥ垎銆傚

GetClientRect(rectClient);
rgn1.CreateRectRgnIndirect(rectClient);
rgn2.CreateRectRgnIndirect(m_rectEdit);
if(rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR) == ERROR)//澶勭悊鍚庣殑rgn1鍙寘鎷簡Edit妗嗕箣澶栫殑瀹㈡埛鍖哄煙錛岃繖鏍鳳紝Edit灝嗕笉浼?xì)琚垜鐨勮儗鏅鐩栬屽鑷撮噸鐢匯?
{
銆ASSERT(FALSE);
銆return ;
}
brush.CreateSolidBrush(m_clrBackgnd);
pDC->FillRgn(&rgn1,&brush);
brush.DeleteObject();

銆銆娉ㄦ剰錛氬湪浣跨敤榪欎釜鏂規(guī)硶鐨勬椂鍊欒鍚屾椂浣跨敤鏂規(guī)硶浜屻傚埆蹇樹簡錛屽埌鏃跺欏張璇磋櫕铏殑鍔炴硶涓嶇伒銆?

銆銆4銆佷嬌鐢∕emoryDC鍏堝湪鍐呭瓨閲屾妸鍥劇敾濂斤紝鍐嶅鍒跺埌灞忓箷涓?br />
銆銆榪欏浜庝竴嬈$敾鍥捐繃紼嬪緢闀跨殑鎯呭喌姣旇緝綆$敤銆傛瘯绔熷唴瀛樻搷浣滄瘮杈冨揩錛岃屼笖澶嶅埗鍒板睆騫曞張鏄竴嬈℃х殑錛岃嚦灝戜笉浼?xì)鍑虹幇鍙互鏄庢槃嬪囖Z竴涓笢涓滀粠宸︾敾鍒板彸鐨勬儏鍐點?

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
}

浜夎

銆銆涓婅堪鏂規(guī)硶紜疄鏈夋晥錛屼絾鍦ㄦ湁寰堝鎺т歡鐨勬儏鍐典笅錛岃綆椾竴涓獥鍙d腑闇瑕佹摝闄ゅ茍閲嶇粯鐨勨滅┖鐧藉尯鍩熲濇槸涓浠跺緢楹葷儲鐨勪簨鎯呫備負(fù)浜嗘柟渚胯繖縐嶆柟娉曠殑瀹為檯搴旂敤錛屾垜鍐欎簡涓緇勫畯鏉ュ畬鎴愨濊綆楃┖鐧藉尯鍩熲滅殑鍔熻兘錛?br />

/************************************************************************/
/* MFC鐗?br />/* 瀹忓姛鑳? 鐣岄潰鍒鋒柊鏃朵粎鍒鋒柊鎸囧畾鎺т歡浠ュ鐨勭┖鐧藉尯鍩?鍙湁鏁堥伩鍏嶇獥鍙i棯鐑?br />/* 浣跨敤浜? WM_ERASEBKGND 娑堟伅澶勭悊鍑芥暟/************************************************************************/
#define ERASE_BKGND_BEGIN \
CRect bgRect;\
GetClientRect(&bgRect);\
CRgn bgRgn;\
bgRgn.CreateRectRgnIndirect(bgRect);
//#define ERASE_BKGND_BEGIN
// Marco parameter 'IDC' specifies the identifier of the control
#define ADD_NOERASE_CONTROL(IDC)\
{\
銆CRect controlRect;\
銆GetDlgItem(IDC)->GetWindowRect(&controlRect);\
銆CRgn controlRgn;\
銆controlRgn.CreateRectRgnIndirect(controlRect);\
銆if(bgRgn.CombineRgn(&bgRgn, &controlRgn, RGN_XOR)==ERROR)\
銆銆return false;\
}

// Marco parameter 'noEraseRect' specifies a screen coordinates based RECT,
// which needn't erase.
#define ADD_NOERASE_RECT(noEraseRect)\
{\
銆CRgn noEraseRgn;\
銆noEraseRgn.CreateRectRgnIndirect(noEraseRect);\
銆if(bgRgn.CombineRgn(&bgRgn, &noEraseRgn, RGN_XOR)==ERROR)\
銆銆return false;\
}

// Marco parameter 'pDC' is a kind of (CDC *) type.
// Marco parameter 'clBrushColor' specifies the color to brush the area.
#define ERASE_BKGND_END(pDC, clBrushColor)\
CBrush brush;\
brush.CreateSolidBrush(clBrushColor);\
CPoint saveOrg = (pDC)->GetWindowOrg();\
(pDC)->SetWindowOrg(bgRect.TopLeft());\
(pDC)->FillRgn(&bgRgn, &brush);\
(pDC)->SetWindowOrg(saveOrg);\
brush.DeleteObject();\
//#define ERASE_BKGND_END
/*************************************************/


/************************************************************************/
/* WTL鐗?br />/* 瀹忓姛鑳? 鐣岄潰鍒鋒柊鏃朵粎鍒鋒柊鎸囧畾鎺т歡浠ュ鐨勭┖鐧藉尯鍩?鍙湁鏁堥伩鍏嶇獥鍙i棯鐑?br />/* 浣跨敤浜? WM_ERASEBKGND 娑堟伅澶勭悊鍑芥暟
/************************************************************************/
#define ERASE_BKGND_BEGIN \
聽CRect bgRect;\
聽GetClientRect(&bgRect);\
聽CRgn bgRgn;\
聽bgRgn.CreateRectRgnIndirect(bgRect);
//#define ERASE_BKGND_BEGIN
// Marco parameter 'IDC' specifies the identifier of the control
#define ADD_NOERASE_CONTROL(IDC)\
{\
聽CRect controlRect;\
聽GetDlgItem(IDC)->GetWindowRect(&controlRect);\
聽CRgn controlRgn;\
聽controlRgn.CreateRectRgnIndirect(controlRect);\
聽if(bgRgn.CombineRgn(&bgRgn, &controlRgn, RGN_XOR)==ERROR)\
聽聽return false;\
}

// Marco parameter 'noEraseRect' specifies a screen coordinates based RECT,
// which needn't erase.
#define ADD_NOERASE_RECT(noEraseRect)\
{\
聽CRgn noEraseRgn;\
聽noEraseRgn.CreateRectRgnIndirect(noEraseRect);\
聽if(bgRgn.CombineRgn(bgRgn.m_hRgn, noEraseRgn.m_hRgn, RGN_XOR)==ERROR)\
聽聽return false;\
}

// Marco parameter 'pDC' is a kind of (CDC *) type.
// Marco parameter 'clBrushColor' specifies the color to brush the area.
#define ERASE_BKGND_END(pDC, clBrushColor)\
聽CBrush brush;\
聽brush.CreateSolidBrush(clBrushColor);\
聽CPoint saveOrg;\
聽(pDC)->GetWindowOrg(&saveOrg);\
聽(pDC)->SetWindowOrg(bgRect.TopLeft());\
聽(pDC)->FillRgn(bgRgn.m_hRgn, brush.m_hBrush);\
聽(pDC)->SetWindowOrg(saveOrg);\
聽brush.DeleteObject();\
//#define ERASE_BKGND_END
/*************************************************/


銆銆璇存槑錛?br />
銆銆1)瀹?ERASE_BKGND_BEGIN 鍜?ERASE_BKGND_END(pDC, clBrushColor) 鎼厤浣跨敤銆?br />
銆銆2)瀹?ADD_NOERASE_CONTROL(IDC) 鍜?ADD_NOERASE_RECT(noEraseRect) 鏍規(guī)嵁闇瑕佹斁鍦ㄤ笂闈袱涓畯鐨勪腑闂達(dá)紝鐢ㄦ潵娣誨姞涓嶉渶瑕侀噸緇樿儗鏅殑鍖哄煙(姝f槸榪欎簺鍖哄煙瀵艱嚧浜嗛棯鐑?錛屼嬌鐢ㄦ鏁頒笉闄愩傚叾涓弬鏁皀oEraseRect鏄竴涓睆騫曞潗鏍囩郴鐨凴ECT綾誨瀷鎴朇Rect綾誨瀷銆?br />
銆銆浣跨敤涓句緥1錛?br />
銆銆鍦ㄥ綋鍓嶇獥浣撶殑綾諱腑閲嶅啓WM_ERASEBKGND娑堟伅澶勭悊鍑芥暟濡備笅錛?br />
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;
}

銆銆涓婇潰鐨処DC_BUTTON2錛孖DC_BUTTON1錛孖DC_LIST_STAT鍗崇獥浣撲笂鐨勬帶浠躲?br />
銆銆浣犲彲浠ユ寚瀹氬叾浠栧凡瀛樺湪鐨勬帶浠躲?br />
銆銆榪欐牱錛岀獥鍙e湪鎿﹂櫎鑳屾櫙鏃訛紝灝嗗彧瀵逛笂榪版帶浠朵互鍚庣殑鈥濈┖鐧藉尯鍩熲滀嬌鐢ㄧ郴緇熻壊閲嶇粯錛屾湁鏁堥伩鍏嶄簡闂儊銆?br />
銆銆澶囨敞錛?br />
銆銆閲嶈澆WM_ERASEBKGND娑堟伅澶勭悊鍑芥暟OnEraseBkgnd鐨勬柟娉曪紝閫夋嫨View->ClassWizard->classinfo閫夐」鍗?message filter涓嬫媺妗?

銆銆閫夋嫨window,鐒跺悗鍐嶉夋嫨message maps閫夐」鍗?鍦╩essages涓嬫媺妗嗗簲璇ュ彲浠ユ壘鍒皐m_erasebkgnd.鍙屽嚮娣誨姞.

銆銆浣跨敤涓句緥2錛氶槻姝ListCtrl鍦ㄦ媺鍔ㄧ獥鍙f椂闂儊銆?br />
/* * 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;
}

銆銆璇存槑錛欳ListCtrl鍦ㄦ媺鍔ㄧ殑鏃跺欙紝浼?xì)鍓嶄互鑳屾櫙鑹查噸鍒疯儗鏅Q屽啀鍦ㄤ笂闈㈢粯鍒舵湁鏁版嵁鐨処tems錛?鑰屾病鏈夋暟鎹殑鍖哄煙鍒欎繚鎸佽儗鏅壊銆傚洜姝わ紝濡傛灉鍦˙OOL CExListCtrl::OnEraseBkgnd(CDC* pDC) 鍑芥暟涓畝鍗曠殑return false錛岄偅涔堟病鏈夋暟鎹殑鍖哄煙灝嗘樉紺轟笉姝e父銆?鏁呬婦渚?涓厛璁$畻鍑烘湁鏁版嵁鐨刬tems鐨勫尯鍩燂紝榪欐槸涓嶉渶瑕佷互鑳屾櫙閲嶅埛鐨勫尯鍩熴?鍐嶄嬌鐢ㄦ湰鏂囩殑瀹忥紝灝卞彲浠ユ湁鏁堥伩鍏岰ListCtrl鍦ㄦ媺鍔ㄦ椂鍊欑殑闂儊銆?img src ="http://m.shnenglu.com/eday/aggbug/20106.html" width = "1" height = "1" />

]]>
榧犳爣灞忓箷鍙栬瘝鎶鏈殑鍘熺悊鍜屽疄鐜?/title><link>http://m.shnenglu.com/eday/archive/2007/02/28/19065.html</link><dc:creator>鐙涔?jié)鍓?/dc:creator><author>鐙涔?jié)鍓?/author><pubDate>Wed, 28 Feb 2007 12:44:00 GMT</pubDate><guid>http://m.shnenglu.com/eday/archive/2007/02/28/19065.html</guid><description><![CDATA[鈥滈紶鏍囧睆騫曞彇璇嶁濇妧鏈槸鍦ㄧ數(shù)瀛愬瓧鍏鎬腑寰楀埌騫挎硾鍦板簲鐢ㄧ殑錛屽鍥涢氬埄鏂瑰拰閲戝北璇嶉湼絳夎蔣浠訛紝榪欎釜鎶鏈湅浼肩畝鍗曪紝鍏跺疄鍦╓INDOWS緋葷粺涓疄鐜板嵈鏄潪甯稿鏉傜殑錛屾葷殑鏉ヨ鏈変袱縐嶅疄鐜版柟寮忥細(xì)<br />聽聽聽 絎竴縐嶏細(xì)閲囩敤鎴幏瀵歸儴鍒咷DI鐨凙PI璋冪敤鏉ュ疄鐜?濡俆extOut,TextOutA絳夈?br />聽聽聽 絎簩縐嶏細(xì)瀵規(guī)瘡涓澶囦笂涓嬫枃(DC)鍋氫竴鍒咰opy,騫惰窡韙墍鏈変慨鏀逛笂涓嬫枃(DC)鐨勬搷浣溿偮犅犅犅犅犅?br />聽<br />聽聽 絎簩縐嶆柟娉曟洿寮哄ぇ,浣嗗吋瀹規(guī)т笉濂斤紝鑰岀涓縐嶆柟娉曚嬌鐢ㄧ殑鎴幏WindowsAPI鐨勮皟鐢紝榪欓」鎶鏈殑寮哄ぇ鍙兘榪滆繙瓚呭嚭浜嗘?zhèn)ㄧ殑鎯宠薄锛屾涓嶅じ寮犵殑璇村Q屽埄鐢╓indowsAPI鎷︽埅鎶鏈紝浣犲彲浠ユ敼閫犳暣涓搷浣滅郴緇燂紝浜嬪疄涓婂緢澶氬鎸傚紡Windows涓枃騫沖彴灝辨槸榪欎箞瀹炵幇鐨勶紒鑰岃繖欏規(guī)妧鏈篃姝f槸榪欑瘒鏂囩珷鐨勪富棰樸?br /><br />聽聽聽 鎴猈indowsAPI鐨勮皟鐢紝鍏蜂綋鐨勮鏉ヤ篃鍙互鍒嗕負(fù)涓ょ鏂規(guī)硶錛?br />聽聽聽 絎竴縐嶆柟娉曢氳繃鐩存帴鏀瑰啓WinAPI 鍦ㄥ唴瀛樹腑鐨勬槧鍍忥紝宓屽叆姹囩紪浠g爜錛屼嬌涔嬭璋冪敤鏃惰煩杞埌鎸囧畾鐨勫湴鍧榪愯鏉ユ埅鑾鳳紱絎簩縐嶆柟娉曞垯鏀瑰啓IAT錛圛mport Address Table 杈撳叆鍦板潃琛級錛岄噸瀹氬悜WinAPI鍑芥暟鐨勮皟鐢ㄦ潵瀹炵幇瀵筗inAPI鐨勬埅鑾楓?br /><br />聽聽聽 絎竴縐嶆柟娉曠殑瀹炵幇杈冧負(fù)綣佺悙錛岃屼笖鍦╓in95銆?8涓嬮潰鏇存湁闅懼害錛岃繖鏄洜涓鴻櫧鐒跺井杞WIN16鐨凙PI鍙槸涓轟簡鍏煎鎬ф墠淇濈暀涓嬫潵錛岀▼搴忓憳搴旇灝藉彲鑳藉湴璋冪敤32浣嶇殑API,瀹為檯涓婃牴鏈氨涓嶆槸榪欐牱錛乄IN 9X鍐呴儴鐨勫ぇ閮ㄥ垎32浣岮PI緇忚繃鍙樻崲璋冪敤浜嗗悓鍚嶇殑16浣岮PI錛屼篃灝辨槸璇存垜浠渶瑕佸湪鎷︽埅鐨勫嚱鏁頒腑宓屽叆16浣嶆眹緙栦唬鐮侊紒<br /><br />聽聽聽 鎴戜滑灝嗚浠嬬粛鐨勬槸絎簩縐嶆嫤鎴柟娉曪紝榪欑鏂規(guī)硶鍦╓in95銆?8鍜孨T涓嬮潰榪愯閮芥瘮杈冪ǔ瀹氾紝鍏煎鎬ц緝濂姐傜敱浜庨渶瑕佺敤鍒板叧浜嶹indows铏氭嫙鍐呭瓨鐨勭鐞嗐佹墦鐮磋繘紼嬭竟鐣屽銆佸悜搴旂敤紼嬪簭鐨勮繘紼嬬┖闂翠腑娉ㄥ叆浠g爜銆丳E錛圥ortable Executable錛夋枃浠舵牸寮忓拰IAT錛堣緭鍏ュ湴鍧琛級絳夎緝搴曞眰鐨勭煡璇嗭紝鎵浠ユ垜浠厛瀵規(guī)秹鍙?qiáng)鍒扮殑杩欎簺鐭ヨ瘑澶ф鍦板仛涓涓粙緇嶏紝鏈鍚庝細(xì)緇欏嚭鎷︽埅閮ㄥ垎鐨勫叧閿唬鐮併?br /><br />聽聽聽聽聽 鍏堣Windows铏氭嫙鍐呭瓨鐨勭鐞嗐俉indows9X緇欐瘡涓涓繘紼嬪垎閰嶄簡4GB鐨勫湴鍧絀洪棿錛屽浜嶯T鏉ヨ錛岃繖涓暟瀛楁槸2GB錛岀郴緇熶繚鐣欎簡2GB鍒?4GB涔嬮棿鐨勫湴鍧絀洪棿紱佹榪涚▼璁塊棶錛岃屽湪Win9X涓紝2GB鍒?GB榪欓儴鍒嗚櫄鎷熷湴鍧絀洪棿瀹為檯涓婃槸鐢辨墍鏈夌殑WIN32榪涚▼鎵鍏變韓鐨勶紝榪欓儴鍒嗗湴鍧絀洪棿鍔犺澆浜嗗叡浜玏in32 DLL銆佸唴瀛樻槧灝勬枃浠跺拰VXD銆佸唴瀛樼鐞嗗櫒鍜屾枃浠剁郴緇熺爜錛學(xué)in9X涓繖閮ㄥ垎瀵逛簬姣忎竴涓繘紼嬮兘鏄彲瑙佺殑錛岃繖涔熸槸Win9X鎿嶄綔緋葷粺涓嶅鍋ュ.鐨勫師鍥犮俉in9X涓負(fù)16浣嶆搷浣滅郴緇熶繚鐣欎簡0鍒?MB鐨勫湴鍧絀洪棿錛岃屽湪4MB鍒?GB涔嬮棿涔熷氨鏄疻in32榪涚▼縐佹湁鐨勫湴鍧絀洪棿錛岀敱浜?姣忎釜榪涚▼鐨勫湴鍧絀洪棿閮芥槸鐩稿鐙珛鐨勶紝涔熷氨鏄錛屽鏋滅▼搴忔兂鎴幏鍏跺畠榪涚▼涓殑API璋冪敤錛屽氨蹇呴』鎵撶牬榪涚▼杈圭晫澧欙紝鍚戝叾瀹冪殑榪涚▼涓敞鍏ユ埅鑾稟PI璋冪敤鐨勪唬鐮侊紝榪欓」宸ヤ綔鎴戜滑浜ょ粰閽╁瓙鍑芥暟錛圫etWindowsHookEx錛夋潵瀹屾垚錛屽叧浜庡浣曞垱寤轟竴涓寘鍚郴緇熼挬瀛愮殑鍔ㄦ侀摼鎺ュ簱錛屻婄數(shù)鑴戦珮鎵嬫潅蹇椼嬪湪絎紵鏈熷凡緇忔湁榪囦笓棰樹粙緇嶄簡錛岃繖閲屽氨涓嶈禈榪頒簡銆傛墍鏈夌郴緇熼挬瀛愮殑鍑芥暟蹇呴』瑕佸湪鍔ㄦ佸簱閲岋紝榪欐牱鐨勮瘽錛屽綋榪涚▼闅愬紡鎴栨樉寮忚皟鐢ㄤ竴涓姩鎬佸簱閲岀殑鍑芥暟鏃訛紝緋葷粺浼?xì)鎶姌q欎釜鍔ㄦ佸簱鏄犲皠鍒拌繖涓繘紼嬬殑铏氭嫙鍦板潃絀洪棿閲岋紝榪欎嬌寰桪LL鎴愪負(fù)榪涚▼鐨勪竴閮ㄥ垎錛屼互榪欎釜榪涚▼鐨勮韓浠芥墽琛岋紝浣跨敤榪欎釜榪涚▼鐨勫爢鏍堬紝涔熷氨鏄鍔ㄦ侀摼鎺ュ簱涓殑浠g爜琚挬瀛愬嚱鏁版敞鍏ヤ簡鍏跺畠GUI榪涚▼鐨勫湴鍧絀洪棿錛堥潪GUI榪涚▼錛岄挬瀛愬嚱鏁板氨鏃犺兘涓哄姏浜嗭級錛?br />褰撳寘鍚挬瀛愮殑DLL娉ㄥ叆鍏跺畠榪涚▼鍚庯紝灝卞彲浠ュ彇寰楁槧灝勫埌榪欎釜榪涚▼铏氭嫙鍐呭瓨閲岀殑鍚勪釜妯″潡錛圗XE鍜孌LL錛夌殑鍩哄湴鍧錛?br />濡傦細(xì)HMODULE hmodule=GetModuleHandle(鈥淢ypro.exe鈥?;<br /><br />鍦∕FC紼嬪簭涓?鎴戜滑鍙互鐢ˋfxGetInstanceHandle()鍑芥暟鏉ュ緱鍒版ā鍧楃殑鍩哄湴鍧銆侲XE鍜孌LL琚槧灝勫埌铏氭嫙鍐呭瓨絀洪棿鐨勪粈涔堝湴鏂規(guī)槸鐢卞畠浠殑鍩哄湴鍧鍐沖畾鐨勩傚畠浠殑鍩哄湴鍧鏄湪閾炬帴鏃剁敱閾炬帴鍣ㄥ喅瀹氱殑銆傚綋浣犳柊寤轟竴涓猈in32宸ョ▼鏃訛紝VC錛嬶紜閾炬帴鍣ㄤ嬌鐢ㄧ己鐪佺殑鍩哄湴鍧0x00400000銆傚彲浠ラ氳繃閾炬帴鍣ㄧ殑BASE閫夐」鏀瑰彉妯″潡鐨勫熀鍦板潃銆侲XE閫氬父琚槧灝勫埌铏氭嫙鍐呭瓨鐨?x00400000澶勶紝DLL涔熼殢涔嬫湁涓嶅悓鐨勫熀鍦板潃錛岄氬父琚槧灝勫埌涓嶅悓榪涚▼<br />鐨勭浉鍚岀殑铏氭嫙鍦板潃絀洪棿澶勩?br />緋葷粺灝咵XE鍜孌LL鍘熷皝涓嶅姩鏄犲皠鍒拌櫄鎷熷唴瀛樼┖闂翠腑錛屽畠浠湪鍐呭瓨涓殑緇撴瀯涓庣鐩樹笂鐨勯潤鎬佹枃浠剁粨鏋勬槸涓鏍風(fēng)殑銆傚嵆PE (Portable Executable) 鏂囦歡鏍煎紡銆傛垜浠緱鍒頒簡榪涚▼妯″潡鐨勫熀鍦板潃浠ュ悗錛屽氨鍙互鏍規(guī)嵁PE鏂囦歡鐨勬牸寮忕┓涓捐繖涓ā鍧楃殑IMAGE_IMPORT_DESCRIPTOR鏁扮粍錛岀湅鐪嬭繘紼嬬┖闂翠腑鏄惁寮曞叆浜嗘垜浠渶瑕佹埅鑾風(fēng)殑鍑芥暟鎵鍦ㄧ殑鍔ㄦ侀摼鎺ュ簱錛屾瘮濡傞渶瑕佹埅鑾封淭extOutA鈥濓紝灝卞繀欏繪鏌モ淕di32.dll鈥濇槸鍚﹁寮曞叆浜嗐傝鍒拌繖閲岋紝鎴戜滑鏈夊繀瑕佷粙緇嶄竴涓婸E鏂囦歡鐨勬牸寮忥紝濡傚彸鍥撅紝榪欐槸PE鏂囦歡鏍煎紡鐨勫ぇ鑷存鍥撅紝鏈鍓嶉潰鏄枃浠跺ご錛屾垜浠笉蹇呯悊浼?xì)锛屼粠PE File Optional Header鍚庨潰寮濮嬶紝灝辨槸鏂囦歡涓悇涓鐨勮鏄庯紝璇存槑鍚庨潰鎵嶆槸鐪熸鐨勬鏁版嵁錛岃屽疄闄呬笂鎴戜滑鍏沖績鐨勫彧鏈変竴涓錛岄偅灝辨槸鈥?idata鈥濇錛岃繖涓涓寘鍚簡鎵鏈夌殑寮曞叆鍑芥暟淇℃伅錛岃繕鏈塈AT錛圛mport Address Table錛夌殑RVA錛圧elative Virtual Address錛夊湴鍧銆?br />璇村埌榪欓噷錛屾埅鑾稺indowsAPI鐨勬暣涓師鐞嗗氨瑕佺湡鐩稿ぇ鐧戒簡銆傚疄闄呬笂鎵鏈夎繘紼嬪緇欏畾鐨凙PI鍑芥暟鐨勮皟鐢ㄦ繪槸閫氳繃PE鏂囦歡鐨勪竴涓湴鏂規(guī)潵杞Щ鐨勶紝榪欏氨鏄竴涓妯″潡(鍙互鏄疎XE鎴朌LL)鐨勨?idata鈥濇涓殑IAT杈撳叆鍦板潃琛紙Import Address Table錛夈傚湪閭i噷鏈夋墍鏈夋湰妯″潡璋冪敤鐨勫叾瀹僁LL鐨勫嚱鏁板悕鍙?qiáng)鍦板潃銆傚鍏跺畠DLL鐨勫嚱鏁拌皟鐢ㄥ疄闄呬笂鍙槸璺寵漿鍒拌緭鍏ュ湴鍧琛紝鐢辮緭鍏ュ湴鍧琛ㄥ啀璺寵漿鍒癉LL鐪熸鐨勫嚱鏁板叆鍙c? <p></p><p>鍏蜂綋鏉ヨ錛屾垜浠皢閫氳繃IMAGE_IMPORT_DESCRIPTOR鏁扮粍鏉ヨ闂?idata鈥濇涓紩鍏ョ殑DLL鐨勪俊鎭紝鐒跺悗閫氳繃IMAGE_THUNK_DATA鏁扮粍鏉ラ拡瀵逛竴涓寮曞叆鐨凞LL璁塊棶璇LL涓寮曞叆鐨勬瘡涓嚱鏁扮殑淇℃伅錛屾壘鍒版垜浠渶瑕佹埅鑾風(fēng)殑鍑芥暟鐨勮煩杞湴鍧錛岀劧鍚庢敼鎴愭垜浠嚜宸辯殑鍑芥暟鐨勫湴鍧鈥︹﹀叿浣撶殑鍋氭硶鍦ㄥ悗闈㈢殑鍏抽敭浠g爜涓細(xì)鏈夎緇嗙殑璁茶В銆?br />聽聽 璁蹭簡榪欎箞澶氬師鐞嗭紝鐜板湪璁╂垜浠洖鍒扳滈紶鏍囧睆騫曞彇璇嶁濈殑涓撻涓婃潵銆傞櫎浜咥PI鍑芥暟鐨勬埅鑾鳳紝瑕佸疄鐜扳滈紶鏍囧睆騫曞彇璇嶁濓紝榪橀渶瑕佸仛涓浜涘叾瀹冪殑宸ヤ綔錛岀畝鍗曠殑璇存潵錛屽彲浠ユ妸涓涓畬鏁寸殑鍙栬瘝榪囩▼褰掔撼鎴愪互涓嬪嚑涓楠わ細(xì)<br />1錛?瀹夎榧犳爣閽╁瓙錛岄氳繃閽╁瓙鍑芥暟鑾峰緱榧犳爣娑堟伅銆?br />浣跨敤鍒扮殑API鍑芥暟錛歋etWindowsHookEx<br />2錛?寰楀埌榧犳爣鐨勫綋鍓嶄綅緗紝鍚戦紶鏍囦笅鐨勭獥鍙e彂閲嶇敾娑堟伅錛岃瀹冭皟鐢ㄧ郴緇熷嚱鏁伴噸鐢葷獥鍙c?br />聽聽聽聽 浣跨敤鍒扮殑API鍑芥暟錛歐indowFromPoint錛孲creenToClient錛孖nvalidateRect<br />3錛?鎴幏瀵圭郴緇熷嚱鏁扮殑璋冪敤錛屽彇寰楀弬鏁幫紝涔熷氨鏄垜浠鍙栫殑璇嶃?br />瀵逛簬澶у鏁扮殑Windows搴旂敤紼嬪簭鏉ヨ錛屽鏋滆鍙栬瘝錛屾垜浠渶瑕佹埅鑾風(fēng)殑鏄淕di32.dll鈥濅腑鐨勨淭extOutA鈥濆嚱鏁般?br />鎴戜滑鍏堜豢鐓extOutA鍑芥暟鍐欎竴涓嚜宸辯殑MyTextOutA鍑芥暟錛屽錛?br />BOOL WINAPI MyTextOutA(HDC hdc, int nXStart, int nYStart, LPCSTR lpszString,int cbString)<br />{<br />聽聽聽聽聽聽 // 榪欓噷榪涜杈撳嚭lpszString鐨勫鐞?br />聽聽聽聽聽聽聽聽聽聽 // 鐒跺悗璋冪敤姝g増鐨凾extOutA鍑芥暟<br />}<br />鎶婅繖涓嚱鏁版斁鍦ㄥ畨瑁呬簡閽╁瓙鐨勫姩鎬佽繛鎺ュ簱涓紝鐒跺悗璋冪敤鎴戜滑鏈鍚庣粰鍑虹殑HookImportFunction鍑芥暟鏉ユ埅鑾瘋繘紼?br />瀵筎extOutA鍑芥暟鐨勮皟鐢紝璺寵漿鍒版垜浠殑MyTextOutA鍑芥暟錛屽畬鎴愬杈撳嚭瀛楃涓茬殑鎹曟崏銆侶ookImportFunction鐨?br />鐢ㄦ硶錛?br />聽HOOKFUNCDESC hd;<br />聽PROC聽聽聽聽聽聽聽聽 pOrigFuns;<br />聽hd.szFunc="TextOutA";<br />聽hd.pProc=(PROC)MyTextOutA;<br />聽HookImportFunction (AfxGetInstanceHandle(),"gdi32.dll",&hd,pOrigFuns);<br /><br />涓嬮潰緇欏嚭浜咹ookImportFunction鐨勬簮浠g爜錛岀浉淇¤灝界殑娉ㄩ噴涓瀹氫笉浼?xì)璁╂?zhèn)ㄨ寰楃悊瑙f埅鑾峰埌搴曟槸鎬庝箞瀹炵幇鐨?br />寰堥毦錛孫k,Let鈥檚 Go錛?</p><p></p><p>///////////////////////////////////////////// Begin ///////////////////////////////////////////////////////////////<br />#include <crtdbg.h></p><p>// 榪欓噷瀹氫箟浜嗕竴涓駭鐢熸寚閽堢殑瀹?br />#define MakePtr(cast, ptr, AddValue) (cast)((DWORD)(ptr)+(DWORD)(AddValue))</p><p>// 瀹氫箟浜咹OOKFUNCDESC緇撴瀯,鎴戜滑鐢ㄨ繖涓粨鏋勪綔涓哄弬鏁頒紶緇橦ookImportFunction鍑芥暟<br />typedef struct tag_HOOKFUNCDESC<br />{<br />聽 LPCSTR szFunc; // The name of the function to hook.<br />聽 PROC pProc;聽聽聽 // The procedure to blast in.<br />} HOOKFUNCDESC , * LPHOOKFUNCDESC;</p><p>// 榪欎釜鍑芥暟鐩戞祴褰撳墠緋葷粺鏄惁鏄疻indowNT<br />BOOL IsNT();</p><p>// 榪欎釜鍑芥暟寰楀埌hModule -- 鍗蟲垜浠渶瑕佹埅鑾風(fēng)殑鍑芥暟鎵鍦ㄧ殑DLL妯″潡鐨勫紩鍏ユ弿榪扮(import descriptor)<br />PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hModule, LPCSTR szImportModule);</p><p>// 鎴戜滑鐨勪富鍑芥暟<br />BOOL HookImportFunction(HMODULE hModule, LPCSTR szImportModule, <br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 LPHOOKFUNCDESC paHookFunc, PROC* paOrigFuncs)<br />{<br />/////////////////////// 涓嬮潰鐨勪唬鐮佹嫻嬪弬鏁扮殑鏈夋晥鎬?////////////////////////////<br />聽_ASSERT(szImportModule);<br />聽_ASSERT(!IsBadReadPtr(paHookFunc, sizeof(HOOKFUNCDESC)));<br />#ifdef _DEBUG<br />聽if (paOrigFuncs) _ASSERT(!IsBadWritePtr(paOrigFuncs, sizeof(PROC)));<br />聽_ASSERT(paHookFunc.szFunc);<br />聽_ASSERT(*paHookFunc.szFunc != '\0');<br />聽聽聽聽聽聽聽 _ASSERT(!IsBadCodePtr(paHookFunc.pProc));<br />#endif<br />聽if ((szImportModule == NULL) || (IsBadReadPtr(paHookFunc, sizeof(HOOKFUNCDESC))))<br />聽{<br />聽聽_ASSERT(FALSE);<br />聽聽SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);<br />聽聽return FALSE;<br />聽}<br />//////////////////////////////////////////////////////////////////////////////</p><p>聽// 鐩戞祴褰撳墠妯″潡鏄惁鏄湪2GB铏氭嫙鍐呭瓨絀洪棿涔嬩笂<br />聽// 榪欓儴鍒嗙殑鍦板潃鍐呭瓨鏄睘浜嶹in32榪涚▼鍏變韓鐨?br />聽if (!IsNT() && ((DWORD)hModule >= 0x80000000))<br />聽{<br />聽聽_ASSERT(FALSE);<br />聽聽SetLastErrorEx(ERROR_INVALID_HANDLE, SLE_ERROR);<br />聽聽return FALSE;<br />聽}<br />聽聽聽 聽// 娓呴浂<br />聽if (paOrigFuncs) memset(paOrigFuncs, NULL, sizeof(PROC)); </p><p>聽// 璋冪敤GetNamedImportDescriptor()鍑芥暟,鏉ュ緱鍒癶Module -- 鍗蟲垜浠渶瑕?br />聽// 鎴幏鐨勫嚱鏁版墍鍦ㄧ殑DLL妯″潡鐨勫紩鍏ユ弿榪扮(import descriptor)<br />聽PIMAGE_IMPORT_DESCRIPTOR pImportDesc = GetNamedImportDescriptor(hModule, szImportModule);<br />聽if (pImportDesc == NULL)<br />聽return FALSE; // 鑻ヤ負(fù)絀?鍒欐ā鍧楁湭琚綋鍓嶈繘紼嬫墍寮曞叆</p><p>聽//聽 浠嶥LL妯″潡涓緱鍒板師濮嬬殑THUNK淇℃伅,鍥犱負(fù)pImportDesc->FirstThunk鏁扮粍涓殑鍘熷淇℃伅宸茬粡<br />聽//聽 鍦ㄥ簲鐢ㄧ▼搴忓紩鍏ヨDLL鏃惰鐩栦笂浜嗘墍鏈夌殑寮曞叆淇℃伅,鎵浠ユ垜浠渶瑕侀氳繃鍙栧緱pImportDesc->OriginalFirstThunk<br />聽//聽 鎸囬拡鏉ヨ闂紩鍏ュ嚱鏁板悕絳変俊鎭?br />聽PIMAGE_THUNK_DATA pOrigThunk = MakePtr(PIMAGE_THUNK_DATA, hModule, <br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 pImportDesc->OriginalFirstThunk);<br /><br />聽</p><p></p><p>聽//聽 浠巔ImportDesc->FirstThunk寰楀埌IMAGE_THUNK_DATA鏁扮粍鐨勬寚閽?鐢變簬榪欓噷鍦―LL琚紩鍏ユ椂宸茬粡濉厖浜?br />聽//聽 鎵鏈夌殑寮曞叆淇℃伅,鎵浠ョ湡姝g殑鎴幏瀹為檯涓婃鏄湪榪欓噷榪涜鐨?br />聽PIMAGE_THUNK_DATA pRealThunk = MakePtr(PIMAGE_THUNK_DATA, hModule, pImportDesc->FirstThunk);</p><p>聽//聽 絀蜂婦IMAGE_THUNK_DATA鏁扮粍,瀵繪壘鎴戜滑闇瑕佹埅鑾風(fēng)殑鍑芥暟,榪欐槸鏈鍏抽敭鐨勯儴鍒?<br />聽while (pOrigThunk->u1.Function)<br />聽{<br />聽聽// 鍙鎵鵑偅浜涙寜鍑芥暟鍚嶈屼笉鏄簭鍙峰紩鍏ョ殑鍑芥暟<br />聽聽if (IMAGE_ORDINAL_FLAG != (pOrigThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG))<br />聽聽{<br />聽聽聽// 寰楀埌寮曞叆鍑芥暟鐨勫嚱鏁板悕<br />聽聽聽PIMAGE_IMPORT_BY_NAME pByName = MakePtr(PIMAGE_IMPORT_BY_NAME, hModule,<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽 pOrigThunk->u1.AddressOfData);</p><p>聽聽聽// 濡傛灉鍑芥暟鍚嶄互NULL寮濮?璺寵繃,緇х畫涓嬩竴涓嚱鏁奧犅?<br />聽聽聽if ('\0' == pByName->Name[0])<br />聽聽聽聽continue;</p><p>聽聽聽// bDoHook鐢ㄦ潵媯鏌ユ槸鍚︽埅鑾鋒垚鍔?br />聽聽聽BOOL bDoHook = FALSE;</p><p>聽聽聽// 媯鏌ユ槸鍚﹀綋鍓嶅嚱鏁版槸鎴戜滑闇瑕佹埅鑾風(fēng)殑鍑芥暟<br />聽聽聽if ((paHookFunc.szFunc[0] == pByName->Name[0]) &&<br />聽聽聽聽(strcmpi(paHookFunc.szFunc, (char*)pByName->Name) == 0))<br />聽聽聽{<br />聽聽聽聽// 鎵懼埌浜?<br />聽聽聽聽if (paHookFunc.pProc)<br />聽聽聽聽bDoHook = TRUE;<br />聽聽聽}<br />聽聽聽if (bDoHook)<br />聽聽聽{<br />聽聽聽聽// 鎴戜滑宸茬粡鎵懼埌浜嗘墍瑕佹埅鑾風(fēng)殑鍑芥暟,閭d箞灝卞紑濮嬪姩鎵嬪惂<br />聽聽聽聽// 棣栧厛瑕佸仛鐨勬槸鏀瑰彉榪欎竴鍧楄櫄鎷熷唴瀛樼殑鍐呭瓨淇濇姢鐘舵?璁╂垜浠彲浠ヨ嚜鐢卞瓨鍙?br />聽聽聽聽MEMORY_BASIC_INFORMATION mbi_thunk;<br />聽聽聽聽VirtualQuery(pRealThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));<br />聽聽聽聽_ASSERT(VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, <br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 PAGE_READWRITE, &mbi_thunk.Protect));</p><p>聽聽聽聽// 淇濆瓨鎴戜滑鎵瑕佹埅鑾風(fēng)殑鍑芥暟鐨勬紜煩杞湴鍧<br />聽聽聽聽if (paOrigFuncs)<br />聽聽聽聽聽 paOrigFuncs = (PROC)pRealThunk->u1.Function;</p><p>聽聽聽聽// 灝咺MAGE_THUNK_DATA鏁扮粍涓殑鍑芥暟璺寵漿鍦板潃鏀瑰啓涓烘垜浠嚜宸辯殑鍑芥暟鍦板潃!<br />聽聽聽聽// 浠ュ悗鎵鏈夎繘紼嬪榪欎釜緋葷粺鍑芥暟鐨勬墍鏈夎皟鐢ㄩ兘灝嗘垚涓哄鎴戜滑鑷繁緙栧啓鐨勫嚱鏁扮殑璋冪敤<br />聽聽聽聽pRealThunk->u1.Function = (PDWORD)paHookFunc.pProc;</p><p>聽聽聽聽// 鎿嶄綔瀹屾瘯!灝嗚繖涓鍧楄櫄鎷熷唴瀛樻敼鍥炲師鏉ョ殑淇濇姢鐘舵?br />聽聽聽聽DWORD dwOldProtect;<br />聽聽聽聽_ASSERT(VirtualProtect(mbi_thunk.BaseAddress, mbi_thunk.RegionSize, <br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 mbi_thunk.Protect, &dwOldProtect));<br />聽聽聽聽SetLastError(ERROR_SUCCESS);<br />聽聽聽聽return TRUE;<br />聽聽聽}<br /><br />聽聽}<br />聽聽// 璁塊棶IMAGE_THUNK_DATA鏁扮粍涓殑涓嬩竴涓厓绱?br />聽聽pOrigThunk++;<br />聽聽pRealThunk++;<br />聽}<br />聽return TRUE;<br />} </p><p></p><p>// GetNamedImportDescriptor鍑芥暟鐨勫疄鐜?br />PIMAGE_IMPORT_DESCRIPTOR GetNamedImportDescriptor(HMODULE hModule, LPCSTR szImportModule)<br />{<br />聽// 媯嫻嬪弬鏁?br />聽_ASSERT(szImportModule);<br />聽_ASSERT(hModule);<br />聽if ((szImportModule == NULL) || (hModule == NULL))<br />聽{<br />聽聽_ASSERT(FALSE);<br />聽聽SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);<br />聽聽return NULL;<br />聽}</p><p>聽// 寰楀埌Dos鏂囦歡澶?br />聽PIMAGE_<a target="_blank">DOS</a>_HEADER pDOSHeader = (PIMAGE_DOS_HEADER) hModule;</p><p>聽// 媯嫻嬫槸鍚Z鏂囦歡澶?br />聽if (IsBadReadPtr(pDOSHeader, sizeof(IMAGE_DOS_HEADER)) || <br />聽聽(pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE))<br />聽{<br />聽聽_ASSERT(FALSE);<br />聽聽SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);<br />聽聽return NULL;<br />聽}</p><p>聽// 鍙栧緱PE鏂囦歡澶?br />聽PIMAGE_NT_HEADERS pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDOSHeader, pDOSHeader->e_lfanew);</p><p>聽// 媯嫻嬫槸鍚E鏄犲儚鏂囦歡<br />聽if (IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) || <br />聽聽 (pNTHeader->Signature != IMAGE_NT_SIGNATURE))<br />聽{<br />聽聽_ASSERT(FALSE);<br />聽聽SetLastErrorEx(ERROR_INVALID_PARAMETER, SLE_ERROR);<br />聽聽return NULL;<br />聽}</p><p>聽// 媯鏌E鏂囦歡鐨勫紩鍏ユ(鍗?.idata section)<br />聽if (pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0)<br />聽聽return NULL;</p><p>聽// 寰楀埌寮曞叆孌?鍗?.idata section)鐨勬寚閽?br />聽PIMAGE_IMPORT_DESCRIPTOR pImportDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, pDOSHeader,<br />聽聽pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);</p><p>聽// 絀蜂婦PIMAGE_IMPORT_DESCRIPTOR鏁扮粍瀵繪壘鎴戜滑闇瑕佹埅鑾風(fēng)殑鍑芥暟鎵鍦ㄧ殑妯″潡<br />聽while (pImportDesc->Name)<br />聽{<br />聽聽PSTR szCurrMod = MakePtr(PSTR, pDOSHeader, pImportDesc->Name);<br />聽聽if (stricmp(szCurrMod, szImportModule) == 0)<br />聽聽聽聽聽 break; // 鎵懼埌!涓柇寰幆<br />聽聽// 涓嬩竴涓厓绱?br />聽聽pImportDesc++;<br />聽}</p><p>聽// 濡傛灉娌℃湁鎵懼埌,璇存槑鎴戜滑瀵繪壘鐨勬ā鍧楁病鏈夎褰撳墠鐨勮繘紼嬫墍寮曞叆!<br />聽if (pImportDesc->Name == NULL)<br />聽聽return NULL;</p><p>聽// 榪斿洖鍑芥暟鎵鎵懼埌鐨勬ā鍧楁弿榪扮(import descriptor)<br />聽return pImportDesc;<br />}</p><p>// IsNT()鍑芥暟鐨勫疄鐜?br />BOOL IsNT()<br />{<br />聽OSVERSIONINFO stOSVI;<br />聽memset(&stOSVI, NULL, sizeof(OSVERSIONINFO));<br />聽stOSVI.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);<br />聽BOOL bRet = GetVersionEx(&stOSVI);<br />聽_ASSERT(TRUE == bRet);<br />聽if (FALSE == bRet) return FALSE;<br />聽return (VER_PLATFORM_WIN32_NT == stOSVI.dwPlatformId);<br />}<br />/////////////////////////////////////////////// End //////////////////////////////////////////////////////////////////////</p><p>聽聽 涓嶇煡閬撳湪榪欑瘒鏂囩珷闂笘涔嬪墠錛屾湁澶氬皯鏈嬪弸灝濊瘯榪囧幓瀹炵幇鈥滈紶鏍囧睆騫曞彇璇嶁濊繖欏瑰厖婊′簡鎸戞垬鐨勬妧鏈紝涔熷彧鏈夊皾璇曡繃鐨勬湅鍙嬫墠鑳戒綋浼?xì)鍒板厜櫁寸殑涓嶆槗锛尀鍏跺湪鎺㈢储API鍑芥暟鐨勬埅鑾鋒椂錛屾墜澶寸殑鍑犵瘒璧勬枡娌℃湁涓綃囨槸娑夊強(qiáng)鍒板叧閿唬鐮佺殑錛岄噸瑕佺殑鍦版柟閮芥槸涓絎斾唬榪囷紝MSDN鏇存槸鏄懼緱鑻嶇櫧鑰屾棤鍔涳紝涔熶笉鐭ラ亾闄や簡IMAGE_IMPORT_DESCRIPTOR鍜孖MAGE_THUNK_DATA錛屽井杞繕闅愯棌浜嗗灝戠瀵嗭紝濂藉湪紜潃澶寸毊榪樻槸鎶婂畠緇欐敾鍏嬩簡錛屽笇鏈涜繖綃囨枃绔犲澶у鑳芥湁鎵甯姪銆?br /><br /></p><img src ="http://m.shnenglu.com/eday/aggbug/19065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/eday/" target="_blank">鐙涔?jié)鍓?/a> 2007-02-28 20:44 <a href="http://m.shnenglu.com/eday/archive/2007/02/28/19065.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鎴彇緋葷粺 API 璋冪敤http://m.shnenglu.com/eday/archive/2007/02/26/18987.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Mon, 26 Feb 2007 05:43:00 GMThttp://m.shnenglu.com/eday/archive/2007/02/26/18987.html闃呰鍏ㄦ枃

]]>
C++浠g爜浼樺寲http://m.shnenglu.com/eday/archive/2007/02/17/18844.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Sat, 17 Feb 2007 14:05:00 GMThttp://m.shnenglu.com/eday/archive/2007/02/17/18844.html1.紜畾嫻偣鍨嬪彉閲忓拰琛ㄨ揪寮忔槸 float 鍨?
聽聽聽 涓轟簡璁╃紪璇戝櫒浜х敓鏇村ソ鐨勪唬鐮?姣斿璇翠駭鐢?DNow! 鎴朣SE鎸囦護(hù)鐨勪唬鐮?錛屽繀欏葷‘瀹氭誕鐐瑰瀷鍙橀噺鍜岃〃杈懼紡鏄?float 鍨嬬殑銆傝鐗瑰埆娉ㄦ剰鐨勬槸錛屼互 "錛汧"錛?鎴?"錛沠"錛?涓哄悗緙錛堟瘮濡傦細(xì)3.14f錛夌殑嫻偣甯擱噺鎵嶆槸 float 鍨嬶紝鍚﹀垯榛樿鏄?double 鍨嬨備負(fù)浜嗛伩鍏?float 鍨嬪弬鏁拌嚜鍔ㄨ漿鍖栦負(fù) double錛岃鍦ㄥ嚱鏁板0鏄庢椂浣跨敤 float銆?
2.浣跨敤32浣嶇殑鏁版嵁綾誨瀷
銆銆緙栬瘧鍣ㄦ湁寰堝縐嶏紝浣嗗畠浠兘鍖呭惈鐨勫吀鍨嬬殑32浣嶇被鍨嬫槸錛歩nt錛宻igned錛宻igned int錛寀nsigned錛寀nsigned int錛宭ong錛宻igned long錛宭ong int錛宻igned long int錛寀nsigned long錛寀nsigned long int銆傚敖閲忎嬌鐢?2浣嶇殑鏁版嵁綾誨瀷錛屽洜涓哄畠浠瘮16浣嶇殑鏁版嵁鐢氳嚦8浣嶇殑鏁版嵁鏇存湁鏁堢巼銆?
3.鏄庢櫤浣跨敤鏈夌鍙鋒暣鍨嬪彉閲?
銆銆鍦ㄥ緢澶氭儏鍐典笅錛屼綘闇瑕佽冭檻鏁村瀷鍙橀噺鏄湁絎﹀彿榪樻槸鏃犵鍙風(fēng)被鍨嬬殑銆傛瘮濡傦紝淇濆瓨涓涓漢鐨勪綋閲嶆暟鎹椂涓嶅彲鑳藉嚭鐜拌礋鏁幫紝鎵浠ヤ笉闇瑕佷嬌鐢ㄦ湁絎﹀彿綾誨瀷銆備絾鏄紝濡傛灉鏄淇濆瓨娓╁害鏁版嵁錛屽氨蹇呴』浣跨敤鍒版湁絎﹀彿鐨勫彉閲忋?
銆銆鍦ㄨ澶氬湴鏂癸紝鑰冭檻鏄惁浣跨敤鏈夌鍙風(fēng)殑鍙橀噺鏄繀瑕佺殑銆傚湪涓浜涙儏鍐典笅錛屾湁絎﹀彿鐨勮繍綆楁瘮杈冨揩錛涗絾鍦ㄤ竴浜涙儏鍐典笅鍗寸浉鍙嶃?
銆銆姣斿錛氭暣鍨嬪埌嫻偣杞寲鏃訛紝浣跨敤澶т簬16浣嶇殑鏈夌鍙鋒暣鍨嬫瘮杈冨揩銆傚洜涓簒86鏋勬灦涓彁渚涗簡浠庢湁絎﹀彿鏁村瀷杞寲鍒版誕鐐瑰瀷鐨勬寚浠わ紝浣嗘病鏈夋彁渚涗粠鏃犵鍙鋒暣鍨嬭漿鍖栧埌嫻偣鐨勬寚浠ゃ傜湅鐪嬬紪璇戝櫒浜х敓鐨勬眹緙栦唬鐮侊細(xì)
銆銆涓嶅ソ鐨勪唬鐮侊細(xì)
緙栬瘧鍓?聽聽聽聽聽緙栬瘧鍚?
double x錛浡犅犅犅爉ov [foo + 4], 0
unsigned int i錛浡犅犅爉ov eax, i
x = i錛浡犅犅犅犅爉ov [foo], eax
聽聽聽聽聽flid qword ptr [foo]
聽聽聽聽聽fstp qword ptr [x]
銆銆涓婇潰鐨勪唬鐮佹瘮杈冩參銆備笉浠呭洜涓烘寚浠ゆ暟鐩瘮杈冨錛岃屼笖鐢變簬鎸囦護(hù)涓嶈兘閰嶅閫犳垚鐨凢LID鎸囦護(hù)琚歡榪熸墽琛屻傛渶濂界敤浠ヤ笅浠g爜浠f浛錛?
聽聽聽 鎺ㄨ崘鐨勪唬鐮侊細(xì)
緙栬瘧鍓嵚犅犅犅犅犵紪璇戝悗
double x錛浡犅犅犅爁ild dword ptr
int i錛浡犅犅犅犅爁stp qword ptr [x]
x = i錛?
銆銆鍦ㄦ暣鏁拌繍綆椾腑璁$畻鍟嗗拰浣欐暟鏃訛紝浣跨敤鏃犵鍙風(fēng)被鍨嬫瘮杈冨揩銆備互涓嬭繖孌靛吀鍨嬬殑浠g爜鏄紪璇戝櫒浜х敓鐨?2浣嶆暣鍨嬫暟闄や互4鐨勪唬鐮侊細(xì)
銆銆涓嶅ソ鐨勪唬鐮伮?
緙栬瘧鍓?聽聽聽聽聽緙栬瘧鍚?
int i錛浡犅犅犅犅爉ov eax, i
i = i / 4錛?聽聽聽聽cdq
聽聽聽聽聽and edx, 3
聽聽聽聽聽add eax, edx
聽聽聽聽聽sar eax, 2
聽聽聽聽聽mov i, eax
聽聽聽 鎺ㄨ崘鐨勪唬鐮?br />緙栬瘧鍓?聽聽聽聽聽緙栬瘧鍚?
unsigned int i錛?聽聽聽shr i, 2
i = i / 4錛?
銆鎬葷粨錛?br />銆鏃犵鍙風(fēng)被鍨嬬敤浜庯細(xì)闄ゆ硶鍜屼綑鏁?寰幆璁℃暟,鏁扮粍涓嬫爣
聽 鏈夌鍙風(fēng)被鍨嬬敤浜庯細(xì)鏁村瀷鍒版誕鐐圭殑杞寲
4.while VS. for
銆銆鍦ㄧ紪紼嬩腑錛屾垜浠父甯擱渶瑕佺敤鍒版棤闄愬驚鐜紝甯哥敤鐨勪袱縐嶆柟娉曟槸while (1) 鍜?for (錛涳紱)銆傝繖涓ょ鏂規(guī)硶鏁堟灉瀹屽叏涓鏍鳳紝浣嗛偅涓縐嶆洿濂藉憿錛熺劧鎴戜滑鐪嬬湅瀹冧滑緙栬瘧鍚庣殑浠g爜錛?
緙栬瘧鍓?聽聽聽聽聽緙栬瘧鍚?
while (1)錛?聽聽聽聽mov eax,1
聽聽聽聽聽test eax,eax
聽聽聽聽聽je foo+23h
聽聽聽聽聽jmp foo+18h
緙栬瘧鍓?聽聽聽聽聽緙栬瘧鍚幝?
for (錛涳紱)錛?聽聽聽聽jmp foo+23h
銆銆涓鐩簡鐒訛紝for (錛涳紱)鎸囦護(hù)灝戯紝涓嶅崰鐢ㄥ瘎瀛樺櫒錛岃屼笖娌℃湁鍒ゆ柇璺寵漿錛屾瘮while (1)濂姐?
5.浣跨敤鏁扮粍鍨嬩唬鏇挎寚閽堝瀷
銆銆浣跨敤鎸囬拡浼?xì)鋴删~栬瘧鍣ㄥ緢闅句紭鍖栧畠銆傚洜涓虹己涔忔湁鏁堢殑鎸囬拡浠g爜浼樺寲鐨勬柟娉曪紝緙栬瘧鍣ㄦ繪槸鍋囪鎸囬拡鍙互璁塊棶鍐呭瓨鐨勪換鎰忓湴鏂癸紝鍖呮嫭鍒嗛厤緇欏叾浠栧彉閲忕殑鍌ㄥ瓨絀洪棿銆傛墍浠ヤ負(fù)浜嗙紪璇戝櫒浜х敓浼樺寲寰楁洿濂界殑浠g爜錛岃閬垮厤鍦ㄤ笉蹇呰鐨勫湴鏂逛嬌鐢ㄦ寚閽堛備竴涓吀鍨嬬殑渚嬪瓙鏄闂瓨鏀懼湪鏁扮粍涓殑鏁版嵁銆侰++ 鍏佽浣跨敤鎿嶄綔絎?[] 鎴栨寚閽堟潵璁塊棶鏁扮粍錛屼嬌鐢ㄦ暟緇勫瀷浠g爜浼?xì)璁╀紭鍖栧櫒鍑彏畱漶旂敓涓嶅畨鍏ㄤ唬鐮佺殑鍙兘鎬с傛瘮濡傦紝x[0] 鍜寈[2] 涓嶅彲鑳芥槸鍚屼竴涓唴瀛樺湴鍧錛屼絾 *p 鍜?*q 鍙兘銆傚己鐑堝緩璁嬌鐢ㄦ暟緇勫瀷錛屽洜涓鴻繖鏍峰彲鑳戒細(xì)鏈夋剰鏂欎箣澶栫殑鎬ц兘鎻愬崌銆?
聽聽聽 涓嶅ソ鐨勪唬鐮?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)
{
銆銆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鏈夊姞閫熻鍐欎緷璧栧歡榪熺殑紜歡錛屽厑璁稿湪瑕佷繚瀛樼殑鏁版嵁琚啓鍏ュ唴瀛樺墠璇誨彇鍑烘潵錛屼絾鏄紝濡傛灉閬垮厤浜嗚鍐欎緷璧栧茍鎶婃暟鎹繚瀛樺湪鍐呴儴瀵勫瓨鍣ㄤ腑錛岄熷害浼?xì)鏇村揩銆傚湪涓孌靛緢闀跨殑鍙堜簰鐩鎬緷璧栫殑浠g爜閾句腑錛岄伩鍏嶈鍐欎緷璧栨樉寰楀挨鍏墮噸瑕併傚鏋滆鍐欎緷璧栧彂鐢熷湪鎿嶄綔鏁扮粍鏃訛紝璁稿緙栬瘧鍣ㄤ笉鑳借嚜鍔ㄤ紭鍖栦唬鐮佷互閬垮厤璇誨啓渚濊禆銆傛墍浠ユ帹鑽愮▼搴忓憳鎵嬪姩鍘繪秷闄よ鍐欎緷璧栵紝涓句緥鏉ヨ錛屽紩榪涗竴涓彲浠ヤ繚瀛樺湪瀵勫瓨鍣ㄤ腑鐨勪復(fù)鏃跺彉閲忋傝繖鏍峰彲浠ユ湁寰堝ぇ鐨勬ц兘鎻愬崌銆備笅闈竴孌典唬鐮佹槸涓涓緥瀛愶細(xì)
聽聽聽 涓嶅ソ鐨勪唬鐮?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爜銆傚叾涓渶甯歌鐨勬槸璺寵漿琛ㄥ拰姣旇緝閾?鏍?wèi)銆傛帹鑽愬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.鎵鏈夊嚱鏁伴兘搴旇鏈夊師鍨嬪畾涔?
銆銆涓鑸潵璇達(dá)紝鎵鏈夊嚱鏁伴兘搴旇鏈夊師鍨嬪畾涔夈傚師鍨嬪畾涔夊彲浠ヤ紶杈劇粰緙栬瘧鍣ㄦ洿澶氱殑鍙兘鐢ㄤ簬浼樺寲鐨勪俊鎭?
銆銆灝藉彲鑳戒嬌鐢ㄥ父閲?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鏄庝負(fù)闈欐佺殑(static)
銆銆濡傛灉涓涓嚱鏁板湪瀹炵幇瀹冪殑鏂囦歡澶栨湭琚嬌鐢ㄧ殑璇濓紝鎶婂畠澹版槑涓洪潤鎬佺殑(static)浠ュ己鍒朵嬌鐢ㄥ唴閮ㄨ繛鎺ャ傚惁鍒欙紝榛樿鐨勬儏鍐典笅浼?xì)鎶婂嚱鏁板畾涔変负澶栭儴杩炴帴銆傝繖鏍峰彲鑳戒細(xì)褰卞搷鏌愪簺緙栬瘧鍣ㄧ殑浼樺寲鈥斺旀瘮濡傦紝鑷姩鍐呰仈銆?
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 鏉ヨ闂暟鎹傛敞鎰忥細(xì)閲婃斁鍌ㄥ瓨絀洪棿鏃朵粛鐒跺簲璇ョ敤delete p銆?
12.浣跨敤鏄懼紡鐨勫茍琛屼唬鐮?
銆銆灝藉彲鑳芥妸闀跨殑鏈変緷璧栫殑浠g爜閾懼垎瑙f垚鍑犱釜鍙互鍦ㄦ祦姘寸嚎鎵ц鍗曞厓涓茍琛屾墽琛岀殑娌℃湁渚濊禆鐨勪唬鐮侀摼銆傚洜涓烘誕鐐規(guī)搷浣滄湁寰堥暱鐨勬綔浼忔湡錛屾墍浠ヤ笉綆″畠琚槧灝勬垚 x87 鎴?3DNow! 鎸囦護(hù)錛岃繖閮藉緢閲嶈銆傚緢澶氶珮綰ц璦錛屽寘鎷珻++錛屽茍涓嶅浜х敓鐨勬誕鐐硅〃杈懼紡閲嶆柊鎺掑簭錛屽洜涓洪偅鏄竴涓浉褰撳鏉傜殑榪囩▼銆傞渶瑕佹敞鎰忕殑鏄紝閲嶆帓搴忕殑浠g爜鍜屽師鏉ョ殑浠g爜鍦ㄤ唬鏁頒笂涓鑷村茍涓嶇瓑浠蜂簬璁$畻緇撴灉涓鑷達(dá)紝鍥犱負(fù)嫻偣鎿嶄綔緙轟箯綺劇‘搴︺傚湪涓浜涙儏鍐典笅錛岃繖浜涗紭鍖栧彲鑳藉鑷存剰鏂欎箣澶栫殑緇撴灉銆傚垢榪愮殑鏄紝鍦ㄥぇ閮ㄥ垎鎯呭喌涓嬶紝鏈鍚庣粨鏋滃彲鑳藉彧鏈夋渶涓嶉噸瑕佺殑浣嶏紙鍗蟲渶浣庝綅錛夋槸閿欒鐨勩?
銆銆涓嶅ソ鐨勪唬鐮?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)錛?
銆銆瑕佹敞鎰忕殑鏄細(xì)浣跨敤4 璺垎瑙f槸鍥犱負(fù)榪欐牱浣跨敤浜?闃舵嫻佹按綰挎誕鐐瑰姞娉曪紝嫻偣鍔犳硶鐨勬瘡涓涓樁孌靛崰鐢ㄤ竴涓椂閽熷懆鏈燂紝淇濊瘉浜嗘渶澶х殑璧勬簮鍒╃敤鐜囥?
13.鎻愬嚭鍏叡瀛愯〃杈懼紡
銆銆鍦ㄦ煇浜涙儏鍐典笅錛孋++緙栬瘧鍣ㄤ笉鑳戒粠嫻偣琛ㄨ揪寮忎腑鎻愬嚭鍏叡鐨勫瓙琛ㄨ揪寮忥紝鍥犱負(fù)榪欐剰鍛崇潃鐩稿綋浜庡琛ㄨ揪寮忛噸鏂版帓搴忋傞渶瑕佺壒鍒寚鍑虹殑鏄紝緙栬瘧鍣ㄥ湪鎻愬彇鍏叡瀛愯〃杈懼紡鍓嶄笉鑳芥寜鐓т唬鏁扮殑絳変環(huán)鍏崇郴閲嶆柊瀹夋帓琛ㄨ揪寮忋傝繖鏃訛紝紼嬪簭鍛樿鎵嬪姩鍦版彁鍑哄叕鍏辯殑瀛愯〃杈懼紡錛堝湪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鏄庣殑涓嶅悓銆備絾鏄紝鏈変簺緙栬瘧鍣ㄥ茍涓嶆彁渚涜繖浜涘姛鑳斤紝鎴栬呮晥鏋滀笉濂姐傛墍浠ワ紝瑕佸湪浠樺嚭鏈灝戜唬浠風(fēng)殑鎯呭喌涓嬪疄鐜版渶濂界殑緇撴瀯浣撳拰緇撴瀯浣撴垚鍛樺榻愶紝寤鴻閲囧彇榪欎簺鏂規(guī)硶錛?
銆銆A鎸夌被鍨嬮暱搴︽帓搴?
銆銆鎶婄粨鏋勪綋鐨勬垚鍛樻寜鐓у畠浠殑綾誨瀷闀垮害鎺掑簭錛屽0鏄庢垚鍛樻椂鎶婇暱鐨勭被鍨嬫斁鍦ㄧ煭鐨勫墠闈€?
銆銆鎶婄粨鏋勪綋濉厖鎴愭渶闀跨被鍨嬮暱搴︾殑鏁村嶆暟
銆銆鎶婄粨鏋勪綋濉厖鎴愭渶闀跨被鍨嬮暱搴︾殑鏁村嶆暟銆傜収榪欐牱錛屽鏋滅粨鏋勪綋鐨勭涓涓垚鍛樺榻愪簡錛屾墍鏈夋暣涓粨鏋勪綋鑷劧涔熷氨瀵歸綈浜嗐備笅闈㈢殑渚嬪瓙婕旂ず浜嗗浣曞緇撴瀯浣撴垚鍛樿繘琛岄噸鏂版帓搴忥細(xì)
銆銆涓嶅ソ鐨勪唬鐮侊紝鏅氶『搴?鎺ㄨ崘鐨勪唬鐮侊紝鏂扮殑欏哄簭騫舵墜鍔ㄥ~鍏呬簡鍑犱釜瀛楄妭
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鎸夋暟鎹被鍨嬬殑闀垮害鎺掑簭鏈湴鍙橀噺
銆銆褰撶紪璇戝櫒鍒嗛厤緇欐湰鍦板彉閲忕┖闂存椂錛屽畠浠殑欏哄簭鍜屽畠浠湪婧愪唬鐮佷腑澹版槑鐨勯『搴忎竴鏍鳳紝鍜屼笂涓鏉¤鍒欎竴鏍鳳紝搴旇鎶婇暱鐨勫彉閲忔斁鍦ㄧ煭鐨勫彉閲忓墠闈€傚鏋滅涓涓彉閲忓榻愪簡錛屽叾瀹冨彉閲忓氨浼?xì)杩灳l殑瀛樻斁錛岃屼笖涓嶇敤濉厖瀛楄妭鑷劧灝變細(xì)瀵歸綈銆傛湁浜涚紪璇戝櫒鍦ㄥ垎閰嶅彉閲忔椂涓嶄細(xì)鑷姩鏀瑰彉鍙橀噺欏哄簭錛屾湁浜涚紪璇戝櫒涓嶈兘浜х敓4瀛楄妭瀵歸綈鐨勬爤錛屾墍浠?瀛楄妭鍙兘涓嶅榻愩備笅闈㈣繖涓緥瀛愭紨紺轟簡鏈湴鍙橀噺澹版槑鐨勯噸鏂版帓搴忥細(xì)
銆銆涓嶅ソ鐨勪唬鐮侊紝鏅氶『搴?鎺ㄨ崘鐨勪唬鐮侊紝鏀硅繘鐨勯『搴?
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.閬垮厤涓嶅繀瑕佺殑鏁存暟闄ゆ硶
銆銆鏁存暟闄ゆ硶鏄暣鏁拌繍綆椾腑鏈鎱㈢殑錛屾墍浠ュ簲璇ュ敖鍙兘閬垮厤銆備竴縐嶅彲鑳藉噺灝戞暣鏁伴櫎娉曠殑鍦版柟鏄繛闄わ紝榪欓噷闄ゆ硶鍙互鐢變箻娉曚唬鏇褲傝繖涓浛鎹㈢殑鍓綔鐢ㄦ槸鏈夊彲鑳藉湪綆椾箻縐椂浼?xì)婧㈠嚭锛屾墍浠ュ彧鑳藉湪涓瀹氳寖鍥寸殑闄ゆ硶涓嬌鐢ㄣ?
銆銆涓嶅ソ鐨勪唬鐮?鎺ㄨ崘鐨勪唬鐮?
int i, j, k, m錛?br />m = i / j / k錛?br />int i, j, k, m錛?br />m = i / (j * k)錛?
15.鎶婇綣佷嬌鐢ㄧ殑鎸囬拡鍨嬪弬鏁版嫹璐濆埌鏈湴鍙橀噺
銆銆閬垮厤鍦ㄥ嚱鏁頒腑棰戠箒浣跨敤鎸囬拡鍨嬪弬鏁版寚鍚戠殑鍊箋傚洜涓虹紪璇戝櫒涓嶇煡閬撴寚閽堜箣闂存槸鍚﹀瓨鍦ㄥ啿紿侊紝鎵浠ユ寚閽堝瀷鍙傛暟寰寰涓嶈兘琚紪璇戝櫒浼樺寲銆傝繖鏍鋒槸鏁版嵁涓嶈兘琚瓨鏀懼湪瀵勫瓨鍣ㄤ腑錛岃屼笖鏄庢樉鍦板崰鐢ㄤ簡鍐呭瓨甯﹀銆傛敞鎰忥紝寰堝緙栬瘧鍣ㄦ湁鈥滃亣璁句笉鍐茬獊鈥濅紭鍖栧紑鍏籌紙鍦╒C閲屽繀欏繪墜鍔ㄦ坊鍔犵紪璇戝櫒鍛戒護(hù)琛?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 />鍏堢湅鐪嬩互涓嬩唬鐮侊細(xì)
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 />}
銆銆榪欎袱孌典唬鐮佹墍浣滅殑浜嬮兘涓鏍鳳紝浣嗛偅涓涓洿濂藉憿錛熺湅鐪嬭緭鍑虹粨鏋滃氨浼?xì)鍙戠帋图屼笉濂界殑浠g爜杈撳囖Z簡鍥涗釜"錛汣Int"錛涘拰鍥涗釜"錛泘CInt"錛涳紝鑰屾帹鑽愮殑浠g爜鍙緭鍑轟笁涓備篃灝辨槸璇達(dá)紝絎簩涓緥瀛愭瘮絎竴涓緥瀛愬皯鐢熸垚涓嬈′復(fù)鏃跺璞°俉hy? 璇鋒敞鎰忥紝絎竴涓腑鐨刢鐢ㄧ殑鏄厛澹版槑鍐嶈祴鍊肩殑鏂規(guī)硶錛岀浜屼釜鐢ㄧ殑鏄垵濮嬪寲鐨勬柟娉曪紝瀹冧滑鏈夋湰璐ㄧ殑鍖哄埆銆傜涓涓緥瀛愮殑"錛沜 = a + b"錛涘厛鐢熸垚涓涓復(fù)鏃跺璞$敤鏉ヤ繚瀛榓 + b鐨勫鹼紝鍐嶆妸璇ヤ復(fù)鏃跺璞$敤浣嶆嫹璐濈殑鏂規(guī)硶緇檆璧嬪鹼紝鐒跺悗涓存椂瀵硅薄琚攢姣併傝繖涓復(fù)鏃跺璞″氨鏄偅涓鍑烘潵鐨勫璞°傜浜屼釜渚嬪瓙鐩存帴鐢ㄦ嫹璐濇瀯閫犲嚱鏁扮殑鏂規(guī)硶瀵筩鍒濆鍖栵紝涓嶄駭鐢熶復(fù)鏃跺璞°傛墍浠ワ紝灝介噺鍦ㄩ渶瑕佷嬌鐢ㄤ竴涓璞℃椂鎵嶅0鏄庯紝騫剁敤鍒濆鍖栫殑鏂規(guī)硶璧嬪垵鍊箋?
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浼?xì)鍏堣寰忕珛锛堣皟鐢ㄤ簡string鐨勯粯璁ゆ瀯閫犲嚱鏁幫級錛屽啀鐢卞弬鏁皊tr璧嬪箋傝屾帹鑽愮殑渚嬪瓙鐢ㄧ殑鏄垚鍛樺垵濮嬪寲鍒楄〃錛宻trName鐩存帴鏋勯犱負(fù)str錛屽皯璋冪敤涓嬈¢粯璁ゆ瀯閫犲嚱鏁幫紝榪樺皯浜嗕竴浜涘畨鍏ㄩ殣鎮(zhèn)c?/p>

]]>
C浠g爜浼樺寲http://m.shnenglu.com/eday/archive/2007/02/17/18843.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Sat, 17 Feb 2007 14:04:00 GMThttp://m.shnenglu.com/eday/archive/2007/02/17/18843.html闃呰鍏ㄦ枃

]]>
杞歡鍔犲瘑鎶鏈拰娉ㄥ唽鏈哄埗http://m.shnenglu.com/eday/archive/2007/02/11/18667.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Sun, 11 Feb 2007 13:41:00 GMThttp://m.shnenglu.com/eday/archive/2007/02/11/18667.html銆銆鏈枃鏄竴綃囪蔣浠跺姞瀵嗘妧鏈殑鍩虹鎬ф枃绔狅紝綆瑕佷粙緇嶄簡杞歡鍔犲瘑鐨勪竴浜涘熀鏈父璇嗗拰涓浜涘姞瀵嗕駭鍝侊紝閫傜敤浜庡浗鍐呰蔣浠跺紑鍙戝晢鎴栬呬釜浜哄叡浜蔣浠跺紑鍙戣呴槄璇誨弬鑰冦?/p>

銆銆1銆佸姞瀵嗘妧鏈榪?/strong>

銆銆涓涓瘑鐮佺郴緇熺殑瀹夊叏鎬у彧鍦ㄤ簬瀵嗛挜鐨勪繚瀵嗘э紝鑰屼笉鍦ㄧ畻娉曠殑淇濆瘑鎬с?/p>

銆銆瀵圭函鏁版嵁鐨勫姞瀵嗙殑紜槸榪欐牱銆傚浜庝綘涓嶆効鎰忚浠栫湅鍒拌繖浜涙暟鎹紙鏁版嵁鐨勬槑鏂囷級鐨勪漢錛岀敤鍙潬鐨勫姞瀵嗙畻娉曪紝鍙鐮磋В鑰呬笉鐭ラ亾琚姞瀵嗘暟鎹殑瀵嗙爜錛屼粬灝變笉鍙В璇昏繖浜涙暟鎹?/p>

銆銆浣嗘槸錛岃蔣浠剁殑鍔犲瘑涓嶅悓浜庢暟鎹殑鍔犲瘑錛屽畠鍙兘鏄滈殣钘忊濄備笉綆′綘鎰挎剰涓嶆効鎰忚浠栵紙鍚堟硶鐢ㄦ埛錛屾垨 Cracker錛夌湅瑙佽繖浜涙暟鎹紙杞歡鐨勬槑鏂囷級錛岃蔣浠舵渶緇堟昏鍦ㄦ満鍣ㄤ笂榪愯錛屽鏈哄櫒錛屽畠?yōu)蹇厵謇L槸鏄庢枃銆傛棦鐒舵満鍣ㄥ彲浠モ滅湅瑙佲濊繖浜涙槑鏂囷紝閭d箞 Cracker錛岄氳繃涓浜涙妧鏈紝涔熷彲浠ョ湅鍒拌繖浜涙槑鏂囥?/p>

銆銆浜庢槸錛屼粠鐞嗚涓婏紝浠諱綍杞歡鍔犲瘑鎶鏈兘鍙互鐮磋В銆傚彧鏄牬瑙g殑闅懼害涓嶅悓鑰屽凡銆傛湁鐨勮璁╂渶楂樻槑鐨?Cracker 蹇欎笂鍑犱釜鏈堬紝鏈夌殑鍙兘涓嶈垂鍚圭伆涔嬪姏錛屽氨琚牬瑙d簡銆?/p>

銆銆鎵浠ワ紝鍙嶇洍鐗堢殑浠誨姟錛堟妧鏈笂鐨勫弽鐩楃増錛岃岄潪琛屾斂涓婄殑鍙嶇洍鐗堬級灝辨槸澧炲姞 Cracker 鐨勭牬瑙i毦搴︺傝浠栦滑鑺辮垂鍦ㄧ牬瑙h蔣浠朵笂鐨勬垚鏈紝姣斾粬鐮磋В榪欎釜杞歡鐨勮幏鍒╄繕瑕侀珮銆傝繖鏍?Cracker 鐨勭牬瑙e彉寰楁鏃犳剰涔夆斺旇皝浼?xì)鑺辨瘮姝g増枋Y浠舵洿澶氱殑閽卞幓涔扮洍鐗堣蔣浠訛紵

銆銆2銆佸瘑鐮佸綆浠?/strong>

銆銆2.1聽聽 姒傚康

銆銆錛?錛?鍙戦佽呭拰鎺ユ敹鑰?/strong>

銆銆鍋囪鍙戦佽呮兂鍙戦佹秷鎭粰鎺ユ敹鑰咃紝涓旀兂瀹夊叏鍦板彂閫佷俊鎭細(xì)濂規(guī)兂紜俊鍋峰惉鑰呬笉鑳介槄璇誨彂閫佺殑娑堟伅銆?/p>

銆銆錛?錛?娑堟伅鍜屽姞瀵?/strong>

銆銆娑堟伅琚О涓烘槑鏂囥傜敤鏌愮鏂規(guī)硶浼娑堟伅浠ラ殣钘忓畠鐨勫唴瀹圭殑榪囩▼縐頒負(fù)鍔犲瘑錛屽姞浜嗗瘑鐨勬秷鎭О涓哄瘑鏂囷紝鑰屾妸瀵嗘枃杞彉涓烘槑鏂囩殑榪囩▼縐頒負(fù)瑙e瘑銆?/p>

銆銆鏄庢枃鐢∕錛堟秷鎭級鎴朠錛堟槑鏂囷級琛ㄧず錛屽畠鍙兘鏄瘮鐗規(guī)祦錛堟枃鏈枃浠躲佷綅鍥俱佹暟瀛楀寲鐨勮闊蟲祦鎴栨暟瀛楀寲鐨勮棰戝浘鍍忥級銆傝嚦浜庢秹鍙?qiáng)鍒拌绠楁満锛孭鏄畝鍗曠殑浜岃繘鍒舵暟鎹傛槑鏂囧彲琚紶閫佹垨瀛樺偍錛屾棤璁哄湪鍝鎯呭喌錛孧鎸囧緟鍔犲瘑鐨勬秷鎭?/p>

銆銆瀵嗘枃鐢–琛ㄧず錛屽畠涔熸槸浜岃繘鍒舵暟鎹紝鏈夋椂鍜孧涓鏍峰ぇ錛屾湁鏃剁◢澶э紙閫氳繃鍘嬬緝鍜屽姞瀵嗙殑緇撳悎錛孋鏈夊彲鑳芥瘮P灝忎簺銆傜劧鑰岋紝鍗曞崟鍔犲瘑閫氬父杈句笉鍒拌繖涓鐐癸級銆傚姞瀵嗗嚱鏁癊浣滅敤浜嶮寰楀埌瀵嗘枃C錛岀敤鏁板琛ㄧず涓猴細(xì)

銆銆E錛圡錛?C.

銆銆鐩稿弽鍦幫紝瑙e瘑鍑芥暟D浣滅敤浜嶤浜х敓M

銆銆D錛圕錛?M.

銆銆鍏堝姞瀵嗗悗鍐嶈В瀵嗘秷鎭紝鍘熷鐨勬槑鏂囧皢鎭㈠鍑烘潵錛屼笅闈㈢殑絳夊紡蹇呴』鎴愮珛錛?/p>

銆銆D錛圗錛圡錛夛級=M

銆銆錛?錛?閴村埆銆佸畬鏁存у拰鎶楁姷璧?/strong>

銆銆闄や簡鎻愪緵鏈哄瘑鎬у錛屽瘑鐮佸閫氬父鏈夊叾瀹冪殑浣滅敤錛?

銆銆錛坅錛?閴村埆

銆銆娑堟伅鐨勬帴鏀惰呭簲璇ヨ兘澶熺‘璁ゆ秷鎭殑鏉ユ簮錛涘叆渚佃呬笉鍙兘浼鎴愪粬浜恒?/p>

銆銆錛坆錛?瀹屾暣鎬ф楠?/p>

銆銆娑堟伅鐨勬帴鏀惰呭簲璇ヨ兘澶熼獙璇佸湪浼犻佽繃紼嬩腑娑堟伅娌℃湁琚慨鏀癸紱鍏ヤ鏡鑰呬笉鍙兘鐢ㄥ亣娑堟伅浠f浛鍚堟硶娑堟伅銆?/p>

銆銆錛坈錛?鎶楁姷璧?/p>

銆銆鍙戦佽呬簨鍚庝笉鍙兘铏氬亣鍦板惁璁や粬鍙戦佺殑娑堟伅銆?/p>

銆銆錛?錛?綆楁硶鍜屽瘑閽?/strong>

銆銆瀵嗙爜綆楁硶涔熷彨瀵嗙爜錛屾槸鐢ㄤ簬鍔犲瘑鍜岃В瀵嗙殑鏁板鍑芥暟銆傦紙閫氬父鎯呭喌涓嬶紝鏈変袱涓浉鍏崇殑鍑芥暟錛氫竴涓敤浣滃姞瀵嗭紝鍙︿竴涓敤浣滆В瀵嗭級

銆銆濡傛灉綆楁硶鐨勪繚瀵嗘ф槸鍩轟簬淇濇寔綆楁硶鐨勭瀵嗭紝榪欑綆楁硶縐頒負(fù)鍙楅檺鍒剁殑綆楁硶銆傚彈闄愬埗鐨勭畻娉曞叿鏈夊巻鍙叉剰涔夛紝浣嗘寜鐜板湪鐨勬爣鍑嗭紝瀹冧滑鐨勪繚瀵嗘у凡榪滆繙涓嶅銆傚ぇ鐨勬垨緇忓父鍙樻崲鐨勭敤鎴風(fēng)粍緇囦笉鑳戒嬌鐢ㄥ畠浠紝鍥犱負(fù)姣忔湁涓涓敤鎴風(fēng)寮榪欎釜緇勭粐錛屽叾瀹冪殑鐢ㄦ埛灝卞繀欏繪敼鎹㈠彟澶栦笉鍚岀殑綆楁硶銆傚鏋滄湁浜烘棤鎰忔毚闇蹭簡榪欎釜縐樺瘑錛屾墍鏈変漢閮藉繀欏繪敼鍙樹粬浠殑綆楁硶銆?/p>

銆銆鏇寸碂鐨勬槸錛屽彈闄愬埗鐨勫瘑鐮佺畻娉曚笉鍙兘榪涜璐ㄩ噺鎺у埗鎴栨爣鍑嗗寲銆傛瘡涓敤鎴風(fēng)粍緇囧繀欏繪湁浠栦滑鑷繁鐨勫敮涓綆楁硶銆傝繖鏍風(fēng)殑緇勭粐涓嶅彲鑳介噰鐢ㄦ祦琛岀殑紜歡鎴栬蔣浠朵駭鍝併備絾紿冨惉鑰呭嵈鍙互涔板埌榪欎簺嫻佽浜у搧騫跺涔?fàn)绠楁硶锛屼簬鏄敤鎴蜂笉寰椾笉鑷忿q紪鍐欑畻娉曞茍浜堜互瀹炵幇錛屽鏋滆繖涓粍緇囦腑娌℃湁濂界殑瀵嗙爜瀛﹀錛岄偅涔堜粬浠氨鏃犳硶鐭ラ亾浠栦滑鏄惁鎷ユ湁瀹夊叏鐨勭畻娉曘?/p>

銆銆灝界鏈夎繖浜涗富瑕佺己闄鳳紝鍙楅檺鍒剁殑綆楁硶瀵逛綆瀵嗙駭鐨勫簲鐢ㄦ潵璇磋繕鏄緢嫻佽鐨勶紝鐢ㄦ埛鎴栬呮病鏈夎璇嗗埌鎴栬呬笉鍦ㄤ箮浠栦滑緋葷粺涓唴鍦ㄧ殑闂銆?/p>

銆銆鐜頒唬瀵嗙爜瀛︾敤瀵嗛挜瑙e喅浜嗚繖涓棶棰橈紝瀵嗛挜鐢↘琛ㄧず銆侹鍙互鏄緢澶氭暟鍊奸噷鐨勪換鎰忓箋傚瘑閽鐨勫彲鑳藉肩殑鑼冨洿鍙仛瀵嗛挜絀洪棿銆傚姞瀵嗗拰瑙e瘑榪愮畻閮戒嬌鐢ㄨ繖涓瘑閽ワ紙鍗寵繍綆楅兘渚濊禆浜庡瘑閽ワ紝騫剁敤K浣滀負(fù)涓嬫爣琛ㄧず錛夛紝榪欐牱錛屽姞/瑙e瘑鍑芥暟鐜板湪鍙樻垚錛?/p>

銆銆EK錛圡錛?C

銆銆DK錛圕錛?M.

銆銆DK錛圗K錛圡錛夛級=M.

銆銆鏈変簺綆楁硶浣跨敤涓嶅悓鐨勫姞瀵嗗瘑閽ュ拰瑙e瘑瀵嗛挜錛屼篃灝辨槸璇村姞瀵嗗瘑閽1涓庣浉搴旂殑瑙e瘑瀵嗛挜K2涓嶅悓錛屽湪榪欑鎯呭喌涓嬶細(xì)

銆銆EK1錛圡錛?C

銆銆DK2錛圕錛?M

銆銆DK2 錛圗K1錛圡錛夛級=M

銆銆鎵鏈夎繖浜涚畻娉曠殑瀹夊叏鎬ч兘鍩轟簬瀵嗛挜鐨勫畨鍏ㄦэ紱鑰屼笉鏄熀浜庣畻娉曠殑緇嗚妭鐨勫畨鍏ㄦс傝繖灝辨剰鍛崇潃綆楁硶鍙互鍏紑錛屼篃鍙互琚垎鏋愶紝鍙互澶ч噺鐢熶駭浣跨敤綆楁硶鐨勪駭鍝侊紝鍗充嬌鍋峰惉鑰呯煡閬撲綘鐨勭畻娉曚篃娌℃湁鍏崇郴錛涘鏋滀粬涓嶇煡閬撲綘浣跨敤鐨勫叿浣撳瘑閽ワ紝浠栧氨涓嶅彲鑳介槄璇諱綘鐨勬秷鎭?/p>

銆銆瀵嗙爜緋葷粺鐢辯畻娉曘佷互鍙?qiáng)鎵鏈夊彲鑳界殑鏄庢枃銆佸瘑鏂囧拰瀵嗛挜緇勬垚鐨勩?/p>

銆銆鍩轟簬瀵嗛挜鐨勭畻娉曢氬父鏈変袱綾伙細(xì)瀵圭О綆楁硶鍜屽叕寮瀵嗛挜綆楁硶銆備笅闈㈠皢鍒嗗埆浠嬬粛錛?/p>

銆銆2.2聽聽 瀵圭О瀵嗙爜綆楁硶

銆銆瀵圭О綆楁硶鏈夋椂鍙堝彨浼犵粺瀵嗙爜綆楁硶錛屽氨鏄姞瀵嗗瘑閽ヨ兘澶熶粠瑙e瘑瀵嗛挜涓帹綆楀嚭鏉ワ紝鍙嶈繃鏉ヤ篃鎴愮珛銆傚湪澶у鏁板縐扮畻娉曚腑錛屽姞/瑙e瘑瀵嗛挜鏄浉鍚岀殑銆傝繖浜涚畻娉曚篃鍙瀵嗗瘑閽ョ畻娉曟垨鍗曞瘑閽ョ畻娉曪紝瀹冭姹傚彂閫佽呭拰鎺ユ敹鑰呭湪瀹夊叏閫氫俊涔嬪墠錛屽晢瀹氫竴涓瘑閽ャ傚縐扮畻娉曠殑瀹夊叏鎬т緷璧栦簬瀵嗛挜錛屾硠婕忓瘑閽ュ氨鎰忓懗鐫浠諱綍浜洪兘鑳藉娑堟伅榪涜鍔?瑙e瘑銆傚彧瑕侀氫俊闇瑕佷繚瀵嗭紝瀵嗛挜灝卞繀欏諱繚瀵嗐?/p>

銆銆瀵圭О綆楁硶鐨勫姞瀵嗗拰瑙e瘑琛ㄧず涓猴細(xì)

銆銆EK錛圡錛?C

銆銆DK錛圕錛?M

銆銆瀵圭О綆楁硶鍙垎涓轟袱綾匯備竴嬈″彧瀵規(guī)槑鏂囦腑鐨勫崟涓瘮鐗癸紙鏈夋椂瀵瑰瓧鑺傦級榪愮畻鐨勭畻娉曠О涓哄簭鍒楃畻娉曟垨搴忓垪瀵嗙爜銆傚彟涓綾葷畻娉曟槸瀵規(guī)槑鏂囩殑涓緇勬瘮鐗逛簹琛岃繍綆楋紝榪欎簺姣旂壒緇勭О涓哄垎緇勶紝鐩稿簲鐨勭畻娉曠О涓哄垎緇勭畻娉曟垨鍒嗙粍瀵嗙爜銆傜幇浠h綆楁満瀵嗙爜綆楁硶鐨勫吀鍨嬪垎緇勯暱搴︿負(fù)64姣旂壒鈥斺旇繖涓暱搴﹀ぇ鍒拌凍浠ラ槻姝㈠垎鏋愮牬璇戯紝浣嗗張灝忓埌瓚充互鏂逛究浣跨敤錛堝湪璁$畻鏈哄嚭鐜板墠錛岀畻娉曟櫘閬嶅湴姣忔鍙鏄庢枃鐨勪竴涓瓧絎﹁繍綆楋紝鍙涓烘槸搴忓垪瀵嗙爜瀵瑰瓧絎﹀簭鍒楃殑榪愮畻錛夈?/p>

銆銆2.3聽聽 鍏紑瀵嗙爜綆楁硶

銆銆鍏紑瀵嗛挜綆楁硶錛堜篃鍙潪瀵圭О綆楁硶錛夋槸榪欐牱璁捐鐨勶細(xì)鐢ㄤ綔鍔犲瘑鐨勫瘑閽ヤ笉鍚屼簬鐢ㄤ綔瑙e瘑鐨勫瘑閽ワ紝鑰屼笖瑙e瘑瀵嗛挜涓嶈兘鏍規(guī)嵁鍔犲瘑瀵嗛挜璁$畻鍑烘潵錛堣嚦灝戝湪鍚堢悊鍋囧畾鐨勯暱鏃墮棿鍐咃級銆備箣鎵浠ュ彨鍋氬叕寮瀵嗛挜綆楁硶錛屾槸鍥犱負(fù)鍔犲瘑瀵嗛挜鑳藉鍏紑錛屽嵆闄岀敓鑰呰兘鐢ㄥ姞瀵嗗瘑閽ュ姞瀵嗕俊鎭紝浣嗗彧鏈夌敤鐩稿簲鐨勮В瀵嗗瘑閽ユ墠鑳借В瀵嗕俊鎭傚湪榪欎簺緋葷粺涓紝鍔犲瘑瀵嗛挜鍙仛鍏紑瀵嗛挜錛堢畝縐板叕閽ワ級錛岃В瀵嗗瘑閽ュ彨鍋氱浜哄瘑閽ワ紙綆縐扮閽ワ級銆傜浜哄瘑閽ユ湁鏃朵篃鍙瀵嗗瘑閽ャ備負(fù)浜嗛伩鍏嶄笌瀵圭О綆楁硶娣鋒穯錛屾澶勪笉鐢ㄧ瀵嗗瘑閽ヨ繖涓悕瀛椼?/p>

銆銆鐢ㄥ叕寮瀵嗛挜K鍔犲瘑琛ㄧず涓?/p>

銆銆EK錛圡錛?C.

銆銆铏界劧鍏紑瀵嗛挜鍜岀浜哄瘑閽ユ槸涓嶅悓鐨勶紝浣嗙敤鐩稿簲鐨勭浜哄瘑閽ヨВ瀵嗗彲琛ㄧず涓猴細(xì)

銆銆DK錛圕錛?M

銆銆鏈夋椂娑堟伅鐢ㄧ浜哄瘑閽ュ姞瀵嗚岀敤鍏紑瀵嗛挜瑙e瘑錛岃繖鐢ㄤ簬鏁板瓧絳懼悕錛堝悗闈㈠皢璇︾粏浠嬬粛錛夛紝灝界鍙兘浜х敓娣鋒穯錛屼絾榪欎簺榪愮畻鍙垎鍒〃紺轟負(fù)錛?/p>

銆銆EK錛圡錛?C

銆銆DK錛圕錛?M

銆銆褰撳墠鐨勫叕寮瀵嗙爜綆楁硶鐨勯熷害錛屾瘮璧峰縐板瘑鐮佺畻娉曪紝瑕佹參鐨勫錛岃繖浣垮緱鍏紑瀵嗙爜綆楁硶鍦ㄥぇ鏁版嵁閲忕殑鍔犲瘑涓簲鐢ㄦ湁闄愩?/p>

銆銆2.4聽聽 鍗曞悜鏁e垪鍑芥暟

銆銆鍗曞悜鏁e垪鍑芥暟 H錛圡錛?浣滅敤浜庝竴涓換鎰忛暱搴︾殑娑堟伅 M錛屽畠榪斿洖涓涓浐瀹氶暱搴︾殑鏁e垪鍊?h錛屽叾涓?h 鐨勯暱搴︿負(fù) m .

銆銆杈撳叆涓轟換鎰忛暱搴︿笖杈撳嚭涓哄浐瀹氶暱搴︾殑鍑芥暟鏈夊緢澶氱錛屼絾鍗曞悜鏁e垪鍑芥暟榪樻湁浣垮叾鍗曞悜鐨勫叾瀹冪壒鎬э細(xì)

銆銆錛?錛?緇欏畾 M 錛屽緢瀹規(guī)槗璁$畻 h 錛?/p>

銆銆錛?錛?緇欏畾 h 錛屾牴鎹?H錛圡錛?= h 璁$畻 M 寰堥毦 錛?/p>

銆銆錛?錛?緇欏畾 M 錛岃鎵懼埌鍙︿竴涓秷鎭?M鈥?騫舵弧瓚?H錛圡錛?= H錛圡鈥欙級 寰堥毦銆?/p>

銆銆鍦ㄨ澶氬簲鐢ㄤ腑錛屼粎鏈夊崟鍚戞ф槸涓嶅鐨勶紝榪橀渶瑕佺О涔嬩負(fù)鈥滄姉紕版挒鈥濈殑鏉′歡錛?/p>

銆銆瑕佹壘鍑轟袱涓殢鏈虹殑娑堟伅 M 鍜?M鈥橈紝浣?H錛圡錛?= H錛圡鈥欙級 婊¤凍寰堥毦銆?/p>

銆銆鐢變簬鏁e垪鍑芥暟鐨勮繖浜涚壒鎬э紝鐢變簬鍏紑瀵嗙爜綆楁硶鐨勮綆楅熷害寰寰寰堟參錛屾墍浠ワ紝鍦ㄤ竴浜涘瘑鐮佸崗璁腑錛屽畠鍙互浣滀負(fù)涓涓秷鎭?M 鐨勬憳瑕侊紝浠f浛鍘熷娑堟伅 M錛岃鍙戦佽呬負(fù) H錛圡錛?絳懼悕鑰屼笉鏄 M 絳懼悕 .

銆銆濡?SHA 鏁e垪綆楁硶鐢ㄤ簬鏁板瓧絳懼悕鍗忚 DSA涓?/p>

銆銆2.5聽聽 鏁板瓧絳懼悕

銆銆鎻愬埌鏁板瓧絳懼悕灝辯涓嶅紑鍏紑瀵嗙爜緋葷粺鍜屾暎鍒楁妧鏈?/p>

銆銆鏈夊嚑縐嶅叕閽ョ畻娉曡兘鐢ㄤ綔鏁板瓧絳懼悕銆傚湪涓浜涚畻娉曚腑錛屼緥濡俁SA錛屽叕閽ユ垨鑰呯閽ラ兘鍙敤浣滃姞瀵嗐傜敤浣犵殑縐侀挜鍔犲瘑鏂囦歡錛屼綘灝辨嫢鏈夊畨鍏ㄧ殑鏁板瓧絳懼悕銆傚湪鍏跺畠鎯呭喌涓嬶紝濡侱SA錛岀畻娉曚究鍖哄垎寮鏉ヤ簡錛燂紵鏁板瓧絳懼悕綆楁硶涓嶈兘鐢ㄤ簬鍔犲瘑銆傝繖縐嶆濇兂棣栧厛鐢盌iffie鍜孒ellman鎻愬嚭 .

銆銆鍩烘湰鍗忚鏄畝鍗曠殑 錛?/p>

銆銆錛?錛?A 鐢ㄥス鐨勭閽ュ鏂囦歡鍔犲瘑錛屼粠鑰屽鏂囦歡絳懼悕銆?/p>

銆銆錛?錛?A 灝嗙鍚嶇殑鏂囦歡浼犵粰B.

銆銆錛?錛?B鐢ˋ鐨勫叕閽ヨВ瀵嗘枃浠訛紝浠庤岄獙璇佺鍚嶃?/p>

銆銆榪欎釜鍗忚涓紝鍙渶瑕佽瘉鏄嶢鐨勫叕閽ョ殑紜槸濂圭殑銆傚鏋淏涓嶈兘瀹屾垚絎紙3錛夋錛岄偅涔堜粬鐭ラ亾絳懼悕鏄棤鏁堢殑銆?/p>

銆銆榪欎釜鍗忚涔熸弧瓚充互涓嬬壒寰侊細(xì)

銆銆錛?錛?絳懼悕鏄彲淇$殑銆傚綋B鐢ˋ鐨勫叕閽ラ獙璇佷俊鎭椂錛屼粬鐭ラ亾鏄敱A絳懼悕鐨勩?/p>

銆銆錛?錛?絳懼悕鏄笉鍙吉閫犵殑銆傚彧鏈堿鐭ラ亾濂圭殑縐侀挜銆?/p>

銆銆錛?錛?絳懼悕鏄笉鍙噸鐢ㄧ殑銆傜鍚嶆槸鏂囦歡鐨勫嚱鏁幫紝騫朵笖涓嶅彲鑳借漿鎹㈡垚鍙﹀鐨勬枃浠躲?/p>

銆銆錛?錛?琚鍚嶇殑鏂囦歡鏄笉鍙敼鍙樼殑銆傚鏋滄枃浠舵湁浠諱綍鏀瑰彉錛屾枃浠跺氨涓嶅彲鑳界敤A鐨勫叕閽ラ獙璇併?/p>

銆銆錛?錛?絳懼悕鏄笉鍙姷璧栫殑銆侭涓嶇敤A鐨勫府鍔╁氨鑳介獙璇丄鐨勭鍚嶃?/p>

銆銆鍦ㄥ疄闄呭簲鐢ㄤ腑錛屽洜涓哄叕鍏卞瘑鐮佺畻娉曠殑閫熷害澶參錛岀鍚嶈呭線寰鏄娑堟伅鐨勬暎鍒楃鍚嶈屼笉鏄娑堟伅鏈韓絳懼悕銆傝繖鏍峰仛騫朵笉浼?xì)闄嶄綆绛惧悕鐨勫彲淇℃с?/p>

銆銆3聽聽聽 褰撳墠嫻佽鐨勪竴浜涜蔣浠朵繚鎶ゆ妧鏈?/strong>

銆銆3.1聽聽 搴忓垪鍙蜂繚鎶?/p>

銆銆鏁板綆楁硶涓欏歸兘鏄瘑鐮佸姞瀵嗙殑鏍稿績錛屼絾鍦ㄤ竴鑸殑杞歡鍔犲瘑涓紝瀹冧技涔庡茍涓嶅お涓轟漢浠叧蹇冿紝鍥犱負(fù)澶у鏁版椂鍊欒蔣浠跺姞瀵嗘湰韜疄鐜扮殑閮芥槸涓縐嶇紪紼嬬殑鎶宸с備絾榪戝嚑騫存潵闅忕潃搴忓垪鍙峰姞瀵嗙▼搴忕殑鏅強(qiáng)錛屾暟瀛︾畻娉曞湪杞歡鍔犲瘑涓殑姣旈噸浼間箮鏄秺鏉ヨ秺澶т簡銆?/p>

銆銆鐪嬬湅鍦ㄧ綉緇滀笂澶ц鍏墮亾鐨勫簭鍒楀彿鍔犲瘑鐨勫伐浣滃師鐞嗐傚綋鐢ㄦ埛浠庣綉緇滀笂涓嬭澆鏌愪釜shareware鈥斺斿叡浜蔣浠跺悗錛屼竴鑸兘鏈変嬌鐢ㄦ椂闂翠笂鐨勯檺鍒訛紝褰撹繃浜嗗叡浜蔣浠剁殑璇曠敤鏈熷悗錛屼綘蹇呴』鍒拌繖涓蔣浠剁殑鍏徃鍘繪敞鍐屽悗鏂硅兘緇х畫浣跨敤銆傛敞鍐岃繃紼嬩竴鑸槸鐢ㄦ埛鎶婅嚜宸辯殑縐佷漢淇℃伅錛堜竴鑸富瑕佹寚鍚嶅瓧錛夎繛鍚屼俊鐢ㄥ崱鍙風(fēng)爜鍛婅瘔緇欒蔣浠跺叕鍙革紝杞歡鍏徃浼?xì)鏍规嵁鐢ㄦ堬L(fēng)殑淇℃伅璁$畻鍑轟竴涓簭鍒楃爜錛屽湪鐢ㄦ埛寰楀埌榪欎釜搴忓垪鐮佸悗錛屾寜鐓ф敞鍐岄渶瑕佺殑姝ラ鍦ㄨ蔣浠朵腑杈撳叆娉ㄥ唽淇℃伅鍜屾敞鍐岀爜錛屽叾娉ㄥ唽淇℃伅鐨勫悎娉曟х敱杞歡楠岃瘉閫氳繃鍚庯紝杞歡灝變細(xì)鍙栨秷鎺夋湰韜殑鍚勭闄愬埗錛岃繖縐嶅姞瀵嗗疄鐜拌搗鏉ユ瘮杈冪畝鍗曪紝涓嶉渶瑕侀澶栫殑鎴愭湰錛岀敤鎴瘋喘涔頒篃闈炲父鏂逛究錛屽湪浜掕仈緗戜笂鐨勮蔣浠?0%閮芥槸浠ヨ繖縐嶆柟寮忔潵淇濇姢鐨勩?/p>

銆銆杞歡楠岃瘉搴忓垪鍙風(fēng)殑鍚堟硶鎬ц繃紼嬶紝鍏跺疄灝辨槸楠岃瘉鐢ㄦ埛鍚嶅拰搴忓垪鍙蜂箣闂寸殑鎹㈢畻鍏崇郴鏄惁姝g‘鐨勮繃紼嬨傚叾楠岃瘉鏈鍩烘湰鐨勬湁涓ょ錛屼竴縐嶆槸鎸夌敤鎴瘋緭鍏ョ殑濮撳悕鏉ョ敓鎴愭敞鍐岀爜錛屽啀鍚岀敤鎴瘋緭鍏ョ殑娉ㄥ唽鐮佹瘮杈冿紝鍏紡琛ㄧず濡備笅錛?/p>

銆銆搴忓垪鍙?= F錛堢敤鎴峰悕錛?/p>

銆銆浣嗚繖縐嶆柟娉曠瓑浜庡湪鐢ㄦ埛杞歡涓啀鐜頒簡杞歡鍏徃鐢熸垚娉ㄥ唽鐮佺殑榪囩▼錛屽疄闄呬笂鏄潪甯鎬笉瀹夊叏鐨勶紝涓嶈鍏舵崲綆楄繃紼嬪涔堝鏉傦紝瑙e瘑鑰呭彧闇鎶婁綘鐨勬崲綆楄繃紼嬩粠紼嬪簭涓彁鍙栧嚭鏉ュ氨鍙互緙栧埗涓涓氱敤鐨勬敞鍐岀▼搴忋?/p>

銆銆鍙﹀涓縐嶆槸閫氳繃娉ㄥ唽鐮佹潵楠岃瘉鐢ㄦ埛鍚嶇殑姝g‘鎬э紝鍏紡琛ㄧず濡備笅錛?/p>

銆銆鐢ㄦ埛鍚嶇О = F閫嗭紙搴忓垪鍙鳳級 錛堝ACDSEE錛?/p>

銆銆榪欏叾瀹炴槸杞歡鍏徃娉ㄥ唽鐮佽綆楄繃紼嬬殑鍙嶇畻娉曪紝濡傛灉姝e悜綆楁硶涓庡弽鍚戠畻娉曚笉鏄縐扮畻娉曠殑璇濓紝瀵逛簬瑙e瘑鑰呮潵璇達(dá)紝鐨勭‘鏈変簺鍥伴毦錛屼絾榪欑綆楁硶鐩稿綋涓嶅ソ璁捐銆?/p>

銆銆浜庢槸鏈変漢鑰冭檻鍒頒互涓嬬殑綆楁硶錛?/p>

銆銆F1錛堢敤鎴峰悕縐幫級 = F2錛堝簭鍒楀彿錛?/p>

銆銆F1銆丗2鏄袱縐嶅畬鍏ㄤ笉鍚岀殑鐨勭畻娉曪紝浣嗙敤鎴峰悕閫氳繃F1綆楁硶璁$畻鍑虹殑鐗瑰緛瀛楃瓑浜庡簭鍒楀彿閫氳繃F2綆楁硶璁$畻鍑虹殑鐗瑰緛瀛楋紝榪欑綆楁硶鍦ㄨ璁′笂姣旇緝綆鍗曪紝淇濆瘑鎬х浉瀵逛互涓婁袱縐嶇畻娉曚篃瑕佸ソ鐨勫銆傚鏋滆兘澶熸妸F1銆丗2綆楁硶璁捐鎴愪笉鍙嗙畻娉曠殑璇濓紝淇濆瘑鎬х浉褰撶殑濂斤紱鍙竴鏃﹁В瀵嗚呮壘鍒板叾涓箣涓鐨勫弽綆楁硶鐨勮瘽錛岃繖縐嶇畻娉曞氨涓嶅畨鍏ㄤ簡銆備竴鍏冪畻娉曠殑璁捐鐪嬫潵鍐嶅浣曞姫鍔涗篃寰堥毦鏈夊お澶х殑紿佺牬錛岄偅涔堜簩鍏冨憿錛?/p>

銆銆鐗瑰畾鍊?= F錛堢敤鎴峰悕錛屽簭鍒楀彿錛?/p>

銆銆榪欎釜綆楁硶鐪嬩笂鍘葷浉褰撲笉閿欙紝鐢ㄦ埛鍚嶇О涓庡簭鍒楀彿涔嬮棿鐨勫叧緋諱笉鍐嶉偅涔堟竻鏅頒簡錛屼絾鍚屾椂涔熷け鍘諱簡鐢ㄦ埛鍚嶄簬搴忓垪鍙風(fēng)殑涓涓瀵瑰簲鍏崇郴錛岃蔣浠跺紑鍙戣呭繀欏昏嚜宸辯淮鎶ょ敤鎴峰悕縐頒笌搴忓垪鍙蜂箣闂寸殑鍞竴鎬э紝浣嗚繖浼間箮涓嶆槸闅句互鍔炲埌鐨勪簨錛屽緩涓暟鎹簱灝卞彲浠ヤ簡銆傚綋鐒朵篃鍙互鎶婄敤鎴峰悕縐板拰搴忓垪鍙峰垎涓哄嚑涓儴鍒嗘潵鏋勯犲鍏冪殑綆楁硶銆?/p>

銆銆鐗瑰畾鍊?= F錛堢敤鎴峰悕1錛岀敤鎴峰悕2錛?..搴忓垪鍙?錛屽簭鍒楀彿2...錛?/p>

銆銆鐜版湁鐨勫簭鍒楀彿鍔犲瘑綆楁硶澶у鏄蔣浠跺紑鍙戣呰嚜琛岃璁$殑錛屽ぇ閮ㄥ垎鐩稿綋綆鍗曘傝屼笖鏈変簺綆楁硶浣滆呰櫧鐒朵笅浜嗗緢澶х殑鍔熷か錛屾晥鏋滃嵈寰寰寰椾笉鍒板畠鎵甯屾湜鐨勭粨鏋溿?/p>

銆銆3.2聽聽 鏃墮棿闄愬埗

銆銆鏈変簺紼嬪簭鐨勮瘯鐢ㄧ増姣忔榪愯閮芥湁鏃墮棿闄愬埗錛屼緥濡傝繍琛?0鍒嗛挓鎴?0鍒嗛挓灝卞仠姝㈠伐浣滐紝蹇呴』閲嶆柊榪愯璇ョ▼搴忔墠鑳芥甯稿伐浣溿傝繖浜涚▼搴忛噷闈㈣嚜鐒舵湁涓畾鏃跺櫒鏉ョ粺璁$▼搴忚繍琛岀殑鏃墮棿銆?/p>

銆銆榪欑鏂規(guī)硶浣跨敤鐨勮緝?yōu)畱銆?/p>

銆銆3.3聽聽 Key File 淇濇姢

銆銆Key File錛堟敞鍐屾枃浠訛級鏄竴縐嶅埄鐢ㄦ枃浠舵潵娉ㄥ唽杞歡鐨勪繚鎶ゆ柟寮忋侹ey File涓鑸槸涓涓皬鏂囦歡錛屽彲浠ユ槸綰枃鏈枃浠訛紝涔熷彲浠ユ槸鍖呭惈涓嶅彲鏄劇ず瀛楃鐨勪簩榪涘埗鏂囦歡錛屽叾鍐呭鏄竴浜涘姞瀵嗚繃鎴栨湭鍔犲瘑鐨勬暟鎹紝鍏朵腑鍙兘鏈夌敤鎴峰悕銆佹敞鍐岀爜絳変俊鎭傛枃浠舵牸寮忓垯鐢辮蔣浠朵綔鑰呰嚜宸卞畾涔夈傝瘯鐢ㄧ増杞歡娌℃湁娉ㄥ唽鏂囦歡錛屽綋鐢ㄦ埛鍚戜綔鑰呬粯璐規(guī)敞鍐屼箣鍚庯紝浼?xì)鏀跺堫C綔鑰呭瘎鏉ョ殑娉ㄥ唽鏂囦歡錛屽叾涓彲鑳藉寘鍚敤鎴風(fēng)殑涓漢淇℃伅銆傜敤鎴峰彧瑕佸皢璇ユ枃浠舵斁鍏ユ寚瀹氱殑鐩綍錛屽氨鍙互璁╄蔣浠舵垚涓烘寮忕増銆傝鏂囦歡涓鑸槸鏀懼湪杞歡鐨勫畨瑁呯洰褰曚腑鎴栫郴緇熺洰褰曚笅銆傝蔣浠舵瘡嬈″惎鍔ㄦ椂錛屼粠璇ユ枃浠朵腑璇誨彇鏁版嵁錛岀劧鍚庡埄鐢ㄦ煇縐嶇畻娉曡繘琛屽鐞嗭紝鏍規(guī)嵁澶勭悊鐨勭粨鏋滃垽鏂槸鍚︿負(fù)姝g‘鐨勬敞鍐屾枃浠訛紝濡傛灉姝g‘鍒欎互娉ㄥ唽鐗堟ā寮忔潵榪愯銆?/p>

銆銆榪欑淇濇姢鏂規(guī)硶浣跨敤涔熶笉澶氥?/p>

銆銆3.4聽聽 CD-check

銆銆鍗沖厜鐩樹繚鎶ゆ妧鏈傜▼搴忓湪鍚姩鏃跺垽鏂厜椹變腑鐨勫厜鐩樹笂鏄惁瀛樺湪鐗瑰畾鐨勬枃浠訛紝濡傛灉涓嶅瓨鍦ㄥ垯璁や負(fù)鐢ㄦ埛娌℃湁姝g増鍏夌洏錛屾嫆緇濊繍琛屻傚湪紼嬪簭榪愯鐨勮繃紼嬪綋涓竴鑸笉鍐嶆鏌ュ厜鐩樼殑瀛樺湪涓庡惁銆俉indows涓嬬殑鍏蜂綋瀹炵幇涓鑸槸榪欐牱鐨勶細(xì)鍏堢敤GetLogicalDriveStrings錛?錛夋垨GetLogicalDrives錛?錛夊緱鍒扮郴緇熶腑瀹夎鐨勬墍鏈夐┍鍔ㄥ櫒鐨勫垪琛紝鐒跺悗鍐嶇敤GetDriveType錛?錛夋鏌ユ瘡涓涓┍鍔ㄥ櫒錛屽鏋滄槸鍏夐┍鍒欑敤CreateFileA錛?錛夋垨FindFirstFileA錛?錛夌瓑鍑芥暟媯鏌ョ壒瀹氱殑鏂囦歡瀛樺湪涓庡惁錛屽茍鍙兘榪涗竴姝ュ湴媯鏌ユ枃浠剁殑灞炴с佸ぇ灝忋佸唴瀹圭瓑銆?/p>

銆銆3.5聽聽 杞歡鐙?/p>

銆銆杞歡鐙楁槸涓縐嶆櫤鑳藉瀷鍔犲瘑宸ュ叿銆傚畠鏄竴涓畨瑁呭湪騫跺彛銆佷覆鍙g瓑鎺ュ彛涓婄殑紜歡鐢?shù)璧\錛屽悓鏃舵湁涓濂椾嬌鐢ㄤ簬鍚勭璇█鐨勬帴鍙h蔣浠跺拰宸ュ叿杞歡銆傚綋琚嫍淇濇姢鐨勮蔣浠惰繍琛屾椂錛岀▼搴忓悜鎻掑湪璁$畻鏈轟笂鐨勮蔣浠剁嫍鍙戝嚭鏌ヨ鍛戒護(hù)錛岃蔣浠剁嫍榪呴熻綆楁煡璇㈠茍緇欏嚭鍝嶅簲錛屾紜殑鍝嶅簲淇濊瘉杞歡緇х畫榪愯銆傚鏋滄病鏈夎蔣浠剁嫍錛岀▼搴忓皢涓嶈兘榪愯錛屽鏉傜殑杞‖浠舵妧鏈粨鍚堝湪涓璧烽槻姝㈣蔣浠剁洍鐗堛傜湡姝f湁鍟嗕笟浠峰煎緱杞歡涓鑸兘鐢ㄨ蔣浠剁嫍鏉ヤ繚鎶ゃ?/p>

銆銆騫蟲椂甯歌鐨勭嫍涓昏鏈夆滄磱鐙椻濓紙鍥藉鐙楋級鍜屸滃湡鐙椻濓紙鍥戒駭鐙楋級銆傝繖閲屸滄磱鐙椻濅富瑕佹寚緹庡浗鐨勫僵铏瑰拰浠ヨ壊鍒楃殑HASP錛屸滃湡鐙椻濅富瑕佹湁閲戝ぉ鍦幫紙鐜板湪涓庣編鍥藉僵铏瑰悎璧勶紝鍙滃僵铏瑰ぉ鍦扳濓級銆佹繁鎬濄佸皷鐭熾傛葷殑璇存潵錛屸滄磱鐙椻濆湪杞歡鎺ュ彛銆佸姞澹熾佸弽璺熻釜絳夆滆蔣鈥濇柟闈㈡病鏈夆滃湡鐙椻濆ソ錛屼絾鍦ㄧ‖浠朵笂鐮磋В闅懼害闈炲父澶э紱鑰屸滃湡鐙椻濆湪杞殑鏂歸潰鍋氱殑寰堝ソ錛屼絾鍦ㄧ‖浠朵笂涓嶅鈥滄磱鐙椻濓紝紼嶆湁鍗曠墖鏈哄姛鍔涚殑浜猴紝閮藉彲浠ュ鍒躲?/p>

銆銆3.6聽聽 杞洏鍔犲瘑

銆銆閫氳繃鍦ㄨ蔣鐩樹笂鏍煎紡鍖栦竴浜涢潪鏍囧噯紓侀亾錛屽湪榪欎簺紓侀亾涓婂啓鍏ヤ竴浜涙暟鎹紝濡傝蔣浠剁殑瑙e瘑瀵嗛挜絳夌瓑銆傝繖縐嶈蔣鐩樻垚涓衡滈挜鍖欑洏鈥濄傝蔣浠惰繍琛屾椂鐢ㄦ埛灝嗚蔣鐩樻彃鍏ワ紝杞歡璇誨彇榪欎簺紓侀亾涓殑鏁版嵁錛屽垽鏂槸鍚﹀悎娉曠殑鈥滈挜鍖欑洏鈥濄?/p>

銆銆杞洏鍔犲瘑榪樻湁鍏跺畠涓浜涙妧鏈紝濡傚急浣嶅姞瀵嗙瓑絳夈?/p>

銆銆闅忕潃榪戝勾鏉ヨ蔣鐩樼殑娌¤惤錛岃繖縐嶆柟娉曞熀鏈笂閫鍑轟簡鍘嗗彶鑸炲彴銆?/p>

銆銆3.7聽聽 灝嗚蔣浠朵笌鏈哄櫒紜歡淇℃伅緇撳悎

銆銆鐢ㄦ埛寰楀埌錛堜拱鍒版垨浠庣綉涓婁笅杞斤級杞歡鍚庯紝瀹夎鏃惰蔣浠朵粠鐢ㄦ埛鐨勬満鍣ㄤ笂鍙栧緱璇ユ満鍣ㄧ殑涓浜涚‖浠朵俊鎭紙濡傜‖鐩樺簭鍒楀彿銆丅OIS搴忓垪鍙風(fēng)瓑絳夛級錛岀劧鍚庢妸榪欎簺淇℃伅鍜岀敤鎴風(fēng)殑搴忓垪鍙楓佺敤鎴峰悕絳夎繘琛岃綆楋紝浠庤屽湪涓瀹氱▼搴︿笂灝嗚蔣浠跺拰紜歡閮ㄥ垎緇戝畾銆傜敤鎴烽渶瑕佹妸榪欎竴搴忓垪鍙風(fēng)敤Email銆佺數(shù)璇濇垨閭瘎絳夋柟娉曞瘎緇欒蔣浠舵彁渚涘晢鎴栧紑鍙戝晢錛岃蔣浠跺紑鍙戝晢鍒╃敤娉ㄥ唽鏈猴紙杞歡錛変駭鐢熻杞歡鐨勬敞鍐屽彿瀵勭粰鐢ㄦ埛鍗沖彲銆傝蔣浠跺姞瀵嗚櫧鐒跺姞瀵嗗己搴︽瘮紜歡鏂規(guī)硶杈冨急錛屼絾瀹冨叿鏈夐潪甯稿粔浠風(fēng)殑鎴愭湰銆佹柟渚跨殑浣跨敤鏂規(guī)硶絳変紭鐐廣傞潪甯擱傚悎鍋氫負(fù)閲囩敤鍏夌洏錛圕DROM錛夌瓑鏂瑰紡鍙戞巿杞歡鐨勫姞瀵嗘柟妗堛?/p>

銆銆姝ょ鍔犲瘑綆楁硶鐨勪紭鐐?/p>

銆銆路聽聽聽 涓嶅悓鏈哄櫒娉ㄥ唽鐮佷笉鍚屻傜敤鎴瘋幏寰椾竴涓瘑鐮佸彧鑳藉湪涓鍙版満鍣ㄤ笂娉ㄥ唽浣跨敤杞歡銆備笉鍚屼簬鐩墠澶у杞歡閲囩敤鐨勬敞鍐屾柟娉曪紝鍗沖彧瑕佺煡閬撴敞鍐岀爜錛屽彲鍦ㄤ換浣曟満鍣ㄤ笂瀹夎娉ㄥ唽銆?/p>

銆銆路聽聽聽 涓嶉渶瑕佷換浣曠‖浠舵垨杞洏

銆銆路聽聽聽 鍙互閫夋嫨鎺у埗杞歡榪愯鍦ㄤ粈涔堟満鍣ㄣ佽繍琛屽闀挎椂闂存垨嬈℃暟絳?/p>

銆銆路聽聽聽 鍙杞歡鍦ㄤ笉娉ㄥ唽鍓嶇殑鍔熻兘涓烘紨紺鴻蔣浠訛紝鍙兘榪愯涓孌墊椂闂存垨閮ㄥ垎鍔熻兘銆傛敞鍐屽悗灝辯珛鍗沖彉涓烘寮忚蔣浠?/p>

銆銆路聽聽聽 閲囩敤鐗瑰埆鎶鏈紝瑙e瘑鑰呭緢闅炬壘鍒頒駭鐢熸敞鍐屽彿鐮佺殑瑙勫緥

銆銆路聽聽聽 鍦ㄤ嬌鐢ㄦ敞鍐屽彿浜х敓杞歡錛堟敞鍐屾満錛夋椂鍙噰鐢ㄤ嬌鐢ㄥ瘑鐮併佸瘑閽ョ洏銆佹繪鏁伴檺鍒剁瓑鏂規(guī)硶

銆銆路聽聽聽 鏂逛究鏄撶敤錛屼環(huán)鏍間綆寤夈?/p>

銆銆榪欑鍔犲瘑榪樻湁浠ヤ笅鐗圭偣

銆銆1銆?娉ㄥ唽鍔犲瘑鐨勮蔣浠訛紝鍙兘鍦ㄤ竴鍙版満鍣ㄤ笂瀹夎浣跨敤銆傛妸杞歡鎷瘋礉鍒板叾瀹冩満鍣ㄤ笂涓嶈兘榪愯銆?/p>

銆銆2銆?鑻ョ敤鎴鋒兂鍦ㄥ彟涓鏈哄櫒涓婂畨瑁呰繍琛岋紝蹇呴』鎶婅蔣浠跺湪榪欎竴鏈哄櫒涓婅繍琛屾椂鐨勫簭鍒楀彿錛屽瘎緇欒蔣浠跺嚭鐗堝晢鎹㈠彇娉ㄥ唽瀵嗙爜銆傚綋鐒跺簲鍐嶄氦涓浠借蔣浠惰垂鐢ㄣ?/p>

銆銆3銆?姝ゅ姞瀵嗘柟娉曠壒鍒傚簲鍦ㄥ洜鐗圭綉涓婂彂甯冪殑杞歡鍙?qiáng)鐢ㄥ厜鐩樺彂甯冪殑枋Y浠躲?/p>

銆銆娉ㄩ噴錛?/p>

銆銆1銆佲滃姞瀵嗘妧鏈榪扳濋儴鍒嗗唴瀹瑰弬鑰冧簡澶у鏁欐潗鈥滃瘑鐮佸鍩虹鈥濄?/p>

銆銆2銆佲滃綋鍓嶆祦琛岀殑涓浜涜蔣浠朵繚鎶ゆ妧鏈濋儴鍒嗗唴瀹瑰弬鑰冧簡鈥滃姞瀵嗕笌瑙e瘑--杞歡淇濇姢鎶鏈強(qiáng)瀹屽叏瑙e喅鏂規(guī)鈥濅竴鏂囥?/p>

]]>
C++璧勬簮涔嬩笉瀹屽叏瀵煎紩http://m.shnenglu.com/eday/archive/2007/02/05/18382.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Mon, 05 Feb 2007 02:07:00 GMThttp://m.shnenglu.com/eday/archive/2007/02/05/18382.html銆銆1錛屽墠璦

銆銆鏃犳暟嬈″惉鍒扳滄垜瑕佸紑濮嬪涔?fàn)C++!鈥濈殑鍛愬枈錛屾棤鏁版鍚埌鈥淐++澶鏉備簡錛屾垜鐪熺殑瀛︿笉浼?xì)鈥濈殑鏃犲銆係tan Lippman鍏堢敓鏇懼湪銆奀++ Primer銆嬩竴涔︿腑鎸囧嚭鈥淐++鏄渶涓洪毦瀛︾殑楂樼駭紼嬪簭璁捐璇█涔嬩竴鈥濓紝浜轟滑甯稿皢鈥滀箣涓鈥濆幓鎺変互琛ㄨ揪鑷繁瀵笴++鐨勬暚鐣忋傝瘹鐒訛紝C++紼嬪簭璁捐璇█瀵逛簬瀛︿範(fàn)鑰呯殑紜湁寰堝闅句互閫捐秺鐨勯縛娌燂紝浣撶郴緇撴瀯鐨勫簽澶э紝搴旀帴涓嶆殗騫朵笉鏂墿鍏呯殑鐗規(guī)р︹﹂櫎姝や箣澶栵紝鍙傝冭祫鏂欎箣澶氫笌鍐楁潅浣垮畠鐨勫涔?fàn)鑰呮湜鑰屽嵈姝ワ紝嬈叉眰娣卞叆鑰呰嫤涓嶅牚璦銆傚笇鏈涜繖涓浠戒笉瀹屽叏瀵煎紩鑳藉鎴愪負(fù)鎮(zhèn)–++瀛︿範(fàn)涔嬭礬涓婄殑寮曡礬鐏?/p>

銆銆鎾板啓鏈枃鐨勫垵琛峰茍涓嶆墦綆楀甫棰嗗ぇ瀹朵綋楠屽彜鑰佺殑C++鍘嗗彶錛屽鏋滀綘鎯充簡瑙++鐨勫巻鍙蹭笌鍏跺墠鏈熷彂灞曚腑璇稿鎶鏈殑婕斿彉錛屼綘搴斿綋鍘誨弬鑰傿jarne鐨勩奣he Design and Evolution of C++銆嬨傚綋鐒朵篃涓嶆墦綆楃粰澶у涓涓棤鎵涓嶅寘鐨勫疂鍏革紙騫墮潪涓嶆兂錛氬叾涓鏄洜姘村鉤鏈夐檺錛屽叾浜屾棤濂圕++涔嬪崥澶х簿娣憋級錛屾墍緇欏嚭鐨勪粎浠呮槸涓浜涙垜浠涓哄浜庢兂瀛︿範(fàn)C++鐨勫箍澶ц鑰呮潵璇存渶閲嶈騫朵笖瑙︽墜鍙強(qiáng)鐨勫紑鍙戜笌瀛︿範(fàn)璧勬簮銆?/p>

銆銆鏈枃浠嬬粛騫跺垎鏋愪簡涓浜涚紪璇戝櫒錛屽紑鍙戠幆澧冿紝搴擄紝灝戦噺鐨勪功綾嶄互鍙?qiáng)鍙傝冪綉绔欙紝騫朵笖灝藉彲鑳藉皾璇曠潃緇欏嚭涓涓埄鐢ㄨ繖浜涜祫婧愮殑瀵煎紩錛屾湜瀵瑰鍚屾垜浠竴鏍風(fēng)殑鍒濆鑰呰兘澶熸湁鎵瑁ㄧ泭銆?/p>

聽聽聽 銆2錛岀紪璇戝櫒

銆銆鍦–++涔嬪鐨勪換浣曡璦涓紝緙栬瘧鍣ㄩ兘浠庢潵娌℃湁鍙楀埌榪囧姝や箣閲嶈銆傚洜涓篊++鏄竴闂ㄧ浉褰撳鏉傜殑璇█錛屾墍浠ョ紪璇戝櫒涔熼毦浜庢瀯寤恒傜洿鍒版渶榪戞垜浠墠寮濮嬭兘澶熶嬌鐢ㄤ笂瀹屽叏絎﹀悎C++鏍囧噯鐨勭紪璇戝櫒錛堝摝錛屼綘鍙兘浼?xì)璐f偅浜涚紪璇戝櫒鍘傚晢涓嶈兘灝芥棭鐨勬彁渚涚鍚堟爣鍑嗙殑緙栬瘧鍣紝榪欏彧鑳芥粬浠悇鑷淮緋葷潃鑷韓鐨勪竴濂楀埆浜轟笉鎰挎帴鍙楃殑鏍囧噯錛夈備粈涔堬紵浣犺榪欐棤鍏崇揣瑕侊紵鍝︼紝涓嶏紝浣犳墍闇瑕佺殑鏄拰鏍囧噯鍖朇++楂樺害鍏煎鐨勭紪璇戠幆澧冦傞暱榪滄潵鐪?br />錛屽彧鏈夎繖鏍風(fēng)殑緙栬瘧鍣ㄥC++寮鍙戜漢鍛樻潵璇存墠鏄渶鏈夋剰涔夌殑宸ュ叿錛屽挨鍏舵槸瀵逛簬紼嬪簭璁捐璇█鐨勫涔?fàn)鑰呫備竴鑷蟲ц浠g爜鍏峰鍙Щ妞嶆э紝騫惰涓闂ㄨ璦鍙?qiáng)鍏跺簱鐨勫簲鐢ㄦ洿湄?fù)騫挎硾銆傚棷錛屾槸鐨勶紝鎴戜滑榪欓噷鍙墦綆椾粙緇嶄竴浜涘叕璁ょ殑浼樼緙栬瘧鍣ㄣ?/p>

銆銆2.1 Borland C++

銆銆榪欎釜鏄疊orland C++ Builder鍜孊orland C++ Builder X榪欎袱縐嶅紑鍙戠幆澧冪殑鍚庡彴緙栬瘧鍣ㄣ傦紙鍝︼紝鎴戜箣鎵浠ュ皢涔嬪垎涓轟袱縐嶅紑鍙戠幆澧冧綘搴斿綋鑳芥槑鐧戒負(fù)浠涔堬紝姝eDelphi7鍒癉elphi8鐨勮漿鍙橈紝鏄潻鍛芥х殑涓や唬銆傦級Borland C++鐢辮佺墝寮鍙戝伐鍏峰巶鍟咮orland鍊懼姏鎵撻犮傝鍏徃鐨勭紪璇戝櫒绱犱互閫熷害蹇紝絀洪棿鏁堢巼楂樿憲縐幫紝Borland C++ 緋誨垪緙栬瘧鍣ㄧ鎵夸簡榪欎釜浼犵粺錛屽睘浜庨潪甯鎬紭璐ㄧ殑緙栬瘧鍣ㄣ傛爣鍑嗗寲鏂歸潰鏃╁湪5.5鐗堟湰鐨勭紪璇戝櫒涓鏍囧噯鍖朇++鐨勫吋瀹瑰氨杈懼埌浜?2.73%銆傜洰鍓嶆渶鏂扮増鏈槸Borland C++ Builder X涓殑6.0鐗堟湰錛屽畼鏂圭О100%絎﹀悎ANSI/ISO鐨凜++鏍囧噯浠ュ強(qiáng)C99鏍囧噯銆傚棷鈥﹁繖姝f槸鎴戝墠闈㈡墍鎸囩殑鈥滃畬鍏ㄧ鍚圕++鏍囧噯鐨勭紪璇戝櫒鈥濄?/p>

銆銆2.2 Visual C++

銆銆榪欎釜姝f槸鎴戜滑鐔熺煡鐨刅isual Studio 鍜?Visual Studio.net 2002, 2003浠ュ強(qiáng)2005 Whidbey涓甫鐨凜++緙栬瘧鍣ㄣ傜敱Microsoft鍏徃鐮斿埗銆傚湪Visual Studio 6.0涓紝鍥犱負(fù)緙栬瘧鍣ㄦ湁澶鍦版柟涓嶈兘涓庡悗鏉ュ嚭鐜扮殑C++鏍囧噯鐩稿惢鍚堣岄ケ鍙楁壒璇勶紙鎯蟲兂浣犲湪浣跨敤STL鐨勬椂鍊欑紪璇戞椂鎶ュ嚭鐨勯偅浜涗護(hù)浜哄帉鎭剁殑error鍜寃arning鍚э級銆俈C++6.0瀵規(guī)爣鍑嗗寲C+
+鐨勫吋瀹瑰彧鏈?3.43%銆備絾鏄殢鐫C++緙栬瘧鍣ㄨ璁″ぇ甯圫tanley Lippman浠ュ強(qiáng)璇稿C++紺劇兢杈句漢鐨勫姞鐩燂紝鍦╒isual Studio.NET 2003涓紝Visual C++緙栬瘧鍣ㄥ凡緇忔垚涓轟竴涓潪甯告垚鐔熷彲*鐨凜++緙栬瘧鍣ㄤ簡銆侱r.Dobb's Journal鐨勮瘎嫻嬫樉紺篤isual C++7.1瀵規(guī)爣鍑咰++鐨勫吋瀹規(guī)ч珮杈?8.22%錛屼竴搴︽垚涓篊BX涔嬪墠鍏煎鎬ф渶濂界殑緙栬瘧鍣ㄣ傜粨鍚堝己澶х殑Visual Studio.NET寮鍙戠幆澧冿紝鏄竴涓潪甯鎬笉閿欑殑閫夋嫨銆傝嚦浜嶹hidbey鏃朵唬鐨刅isual C++,浼間箮寰蔣鎵鏈鍏蟲敞鐨勬槸C++/CLI鈥︹︽垜浠笉鎯寵瘎璁哄井杞笅涓浠g殑C++緙栬瘧鍣ㄥ鏍囧噯鍖栧吋瀹瑰浣曪紝浣嗕粬紜疄瓚婃潵瓚婇傚悎.NET (鍏跺疄浣犲拰鎴戠殑鎰熻鍙兘鏄竴鏍風(fēng)殑錛屽井杞笉搴斿綋鎶婃爣鍑咰++榪欏潡鑲ヨ倝涓㈢粰Borland,鐒惰屽井杞彲鑳藉茍涓嶈繖鏍瘋涓?銆?/p>

銆銆2.3 GNU C++

銆銆钁楀悕鐨勫紑婧怌++緙栬瘧鍣ㄣ傛槸綾籙nix鎿嶄綔緋葷粺涓嬬紪鍐機(jī)++紼嬪簭鐨勯閫夈傜壒鐐規(guī)槸鏈夐潪甯稿ソ鐨勭Щ妞嶆э紝浣犲彲浠ュ湪闈炲父騫挎硾鐨勫鉤鍙頒笂浣跨敤瀹冿紝鍚屾椂涔熸槸緙栧啓璺ㄥ鉤鍙幫紝宓屽叆寮忕▼搴忓緢濂界殑閫夋嫨銆傚彟澶栧湪絎﹀悎鏍囧噯榪欎釜鏂歸潰涓鐩撮兘闈炲父濂斤紝GCC3.3澶ф鑳藉杈懼埌96.15%銆備絾鏄敱浜庡叾璺ㄥ鉤鍙扮殑鐗規(guī)э紝鍦ㄤ唬鐮佸昂瀵擱熷害絳変紭鍖栦笂鐣ュ井宸竴鐐廣?/p>

銆銆鍩轟簬GNU C++鐨勭紪璇戝櫒鏈夊緢澶氾紝姣斿錛?/p>

銆銆(1) Mingw

銆銆http://www.mingw.org/

銆銆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鍜學(xué)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>

銆銆寮鍙戠幆澧冨浜庣▼搴忓憳鐨勪綔鐢ㄤ笉璦鑰屽柣銆傞夋嫨鑷繁鏈濆鐩稿鐨勭幆澧冧篃涓嶆槸瀹規(guī)槗鐨勪簨鎯咃紝鐗瑰埆鏄湪IDE濡傛涓板瘜鐨勬儏鍐典笅銆備笅闈㈠氨鏄垜浠帹鑽愮殑涓浜涘父瑙佺殑C++寮鍙戠幆澧冿紝騫舵病鏈夊寘鎷竴浜涘皬鍨嬬殑錛岀綍瑙佺殑IDE銆傚叾涓換浣曚竴嬈鵑兘鏄姛鑳戒赴瀵岋紝鍙互鐢ㄤ綔鏃ュ父寮鍙戜嬌鐢ㄧ殑銆傚浜庝笉鍚屽眰闈㈢殑寮鍙戣咃紝璇峰弬瑙佸唴鏂囧叧浜庨傜敤瀵硅薄鐨勬弿榪般?/p>

銆銆3.1 Visual Studio 6.0

銆銆榪欎釜铏界劧鏄疢icrosoft鍏徃鐨勮佺増鏈殑寮鍙戠幆澧冿紝浣嗘槸閴翠簬鍏跺悗緇х増鏈琕isualStudio.NET鐨勫簽澶ц韓韜紝浠ュ強(qiáng)鍒濆鑰呭茍涓嶉偅涔堥珮鐨勫姛鑳借姹傦紝鎵浠ユ帹鑽愯繖涓紑鍙戠幆澧冪粰C(jī)++鐨勫垵瀛﹁咃紝渚涘叾瀛︿範(fàn)C++鐨勬渶鍩烘湰鐨勯儴鍒嗭紝姣斿C鐨勯偅閮ㄥ垎瀛愰泦錛屽綋鐒朵綘鍒寚鏈涗粬鑳藉鏀寔鏈鏂扮殑C99鏍囧噯銆傚湪鏃ュ父鐨勫紑鍙戜腑錛屼粛鐒舵湁寰堝鍏徃浣跨敤榪欎釜緇忓吀紼沖畾鐨勭幆澧冿紝姣斿絎旇呭氨鐪嬫浘浜茶鏈変簺鍏徃灝嗗叾緙栬瘧鍣ㄦ浛鎹負(fù)GCC鍋氭墜鏈哄紑鍙戜箣鐢ㄣ?/p>

銆銆3.2 Visual Studio.NET 2003

銆銆浣滀負(fù)Microsoft鍏徃瀹樻柟姝e紡鍙戝竷鐨勬渶鏂扮増鏈紑鍙戠幆澧冿紝鍏朵腑鏈夊お澶氭縺鍔ㄤ漢蹇冪殑鍔熻兘銆傜粨鍚堝叾鏈鏂扮殑C++緙栬瘧鍣ㄣ傚浜庢満鍣ㄩ厤緗瘮杈冨ソ鐨勫紑鍙戜漢鍛樻潵璇達(dá)紝浣跨敤榪欎釜寮鍙戠幆澧冨皢鑳芥弧瓚沖叾澶ч儴鍒嗙殑瑕佹眰銆傝繖閲屼笉鎵撶畻鍗曠嫭璇碫isual Studio Whidbey,铏界劧Visual Studio .NET 2005 - Whidbey紺懼尯棰勮鐗堝凡緇忔帹鍑猴紝浣嗘殏涓嶆槸寰堢ǔ瀹氾紝璇昏呭彲浠ヤ翰韜幓浣撻獙銆?/p>

銆銆3.3 Borland C++ Builder 6

銆銆榪欎釜騫朵笉鏄疊orland鐨凜++寮鍙戠幆澧冪殑鏈鏂扮増鏈傞夋嫨瀹冪殑鍘熷洜鏄畠涓嶆槸鐢↗ava鍐欑殑IDE錛岄熷害姣旇緝蹇傚畠鏈変竴涓緢瀹屽杽鐨凣UI紿椾綋璁捐鍣紝鍜孌elphi鍏辯敤涓涓猇CL銆傜敱浜庤繖浜涚壒鐐癸紝姣旇緝閫傚悎鍒濆鑰呬笂鎵嬨備絾鏄敱浜庡叾GUI鐨勪腑蹇冧綅緗紝鍙兘涓嶅埄浜庡浜嶤++璇█鐨勫涔?fàn)銆傝屼笖鍏朵負(fù)浜嗘敮鎸乂CL榪欎釜Object Pascal鍐欑殑搴撲篃瀵笴++榪涜浜嗕竴浜涚鏈夌殑鎵╁厖銆備嬌寰椾漢浠湁涓涓笉寰椾笉鎺ュ彈鐨勪簨瀹烇細(xì)鈥淏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,鎽掑純浜嗕互鍓嶄護(hù)浜烘棤濂堢殑鐗堟湰銆傚浜嶤++鐨勫紑鍙戞潵璇達(dá)紝浠庣紪璇戝櫒錛屽埌搴擄紝鍒板姛鑳介泦鎴愰兘鏄潪甯哥悊鎯崇殑銆傚彲浠ラ瑙侊紝Borland C++ Builder X 2.0寰堝煎緱C++鐖卞ソ鑰呮湡寰呫傚敮涓浠や漢闅懼牚涔嬪鏄綔涓轟竴涓狢++鐨勫紑鍙戝伐鍏鳳紝鍏禝DE鏄敤Java鍐欑殑錛屽湪閰嶇疆涓嶅鐞嗘兂鐨勬満鍣ㄤ笂璇鋒厧閲嶈冭檻鍐嶅畨瑁呫?/p>

銆銆3.5 Emacs + GCC

銆銆鍓嶉潰璁茬殑澶ч儴鍒嗘槸Windows鐜涓嬬殑闆嗘垚寮鍙戠幆澧冦侺inux涓婄殑寮鍙戣呮洿鍊懼悜浜庝嬌鐢‥macs鏉ョ紪杈慍++鐨勬枃浠訛紝鐢∕akefile鏉ュ懡浠CC鍋氱紪璇戙傝櫧鐒剁湅涓婂幓姣旇緝鏉炬暎錛屼絾鏄繖浜涗笢瑗跨患鍚堣搗鏉ヨ繕鏄竴涓紑0鍙戠幆澧冦傚鏋滀綘鑳藉濞寸啛鐨勪嬌鐢ㄨ繖鏍風(fēng)殑鐜鍐欑▼搴忥紝浣犵殑姘村鉤搴旇瓚沖鎸囧鎴戜滑鏉ュ啓榪欑瘒闄嬫枃浜嗐?/p>

銆銆3.6 Dev C++

銆銆GCC鏄竴涓緢濂界殑緙栬瘧鍣ㄣ傚湪Windows涓婄殑C++緙栬瘧鍣ㄤ竴鐩村拰鏍囧噯鏈夌潃涓孌佃窛紱葷殑鏃跺欙紝GCC灝辨槸涓涓Windows涓嬪紑鍙戣呮祦鍙f按鐨勭紪璇戝櫒銆侱ev-C++灝辨槸鑳藉璁〨CC璺戝湪Windows涓嬬殑宸ュ叿錛屼綔涓洪泦鎴愬紑鍙戠幆澧冿紝榪樻彁渚涗簡鍚屼笓涓欼DE鐩稿緹庣殑璇硶楂樹寒錛屼唬鐮佹彁紺猴紝璋冭瘯絳夊姛鑳姐傜敱浜庝嬌鐢―elphi寮鍙戯紝鍗犵敤鍐呭瓨灝戯紝閫熷害寰堝揩錛屾瘮杈冮傚悎杞婚噺綰х殑瀛︿範(fàn)鍜屼嬌鐢ㄣ?/p>

銆銆3.7 Eclipse + CDT

銆銆Eclipse鍙槸榪戞潵澶у悕榧庨紟鐨勫紑鍙戝伐鍏楓傛渶鏂頒竴鏈熺殑Jolt澶у灝遍緇欎簡榪欎釜鏉板嚭鐨勭鐗┿傝鍏剁濂囨槸鍥犱負(fù)錛屽畠鏈韓鏄敤Java鍐欑殑錛屼絾鏄嫢鏈夋瘮涓鑸琂ava鍐欑殑紼嬪簭蹇緱澶氱殑閫熷害銆傝屼笖鍥犱負(fù)鍏跺熀浜庢彃浠剁粍瑁呬竴鍒囩殑鍘熷垯錛屼嬌寰楄兘澶熸湁CDT榪欐牱鐨勬彃浠舵妸Eclipse鍙樻垚涓涓狢/C++鐨勫紑鍙戠幆澧冦傚鏋滀綘涓鐩寸敤Eclipse鍐橨ava鐨勭▼搴忥紝涓嶅Θ鐢ㄥ畠浣撻獙涓涓婥++寮鍙戠殑涔愯叮銆?/p>

--------------------------------------------------------------------------------

銆銆4錛屽伐鍏?/p>

銆銆C++鐨勮緟鍔╁伐鍏風(fēng)箒澶氾紝鎴戜滑鍒嗛棬鍒被鐨勪負(fù)澶у浣滀粙緇嶏細(xì)

銆銆4.1 鏂囨。綾?/p>

銆銆(1) Doxygen

銆銆鍙傝冪珯鐐癸細(xì)http://www.doxygen.org/

銆銆Doxygen鏄竴縐嶉傚悎C椋庢牸璇█錛堝C++銆丆銆両DL銆丣ava鐢氳嚦鍖呮嫭C#鍜孭HP錛夌殑銆佸紑鏀炬簮鐮佺殑銆佸熀浜庡懡浠よ鐨勬枃妗d駭鐢熷櫒銆?/p>

銆銆(2) C++2HTML

銆銆鍙傝冪珯鐐癸細(xì)http://www.bedaux.net/cpp2html/

銆銆鎶奀++浠g爜鍙樻垚璇硶楂樹寒鐨凥TML

銆銆(3) CodeColorizer

銆銆鍙傝冪珯鐐癸細(xì)http://www.chami.com/colorizer/

銆銆瀹冭兘鎶婂ソ鍑犵璇█鐨勬簮浠g爜鐫鑹蹭負(fù)HTML

銆銆(4) Doc-O-Matic

銆銆鍙傝冪珯鐐癸細(xì)http://www.doc-o-matic.com/

銆銆Doc-O_Matic涓轟綘鐨凜/C++錛孋++.net錛孌elphi/Pascal, VB.NET錛孋#鍜孞ava紼嬪簭鎴栬呯粍浠朵駭鐢熷噯紜殑鏂囨。銆侱oc-O-Matic浣跨敤婧愪唬鐮佷腑鐨勭鍙峰拰娉ㄩ噴浠ュ強(qiáng)澶栭儴鐨勬枃妗f枃浠跺垱寤轟笌嫻佽鐨勬枃妗f牱寮忎竴鑷寸殑鏂囨。銆?/p>

銆銆(5) DocVizor

銆銆鍙傝冪珯鐐癸細(xì)http://www.ucancode.net/Products/DocBuilder/Features.htm

銆銆DocVizor婊¤凍浜嗛潰鍚戝璞¤蔣浠跺紑鍙戣呯殑鍩烘湰瑕佹眰鈥斺斿畠璁╂垜浠兘澶熺湅鍒癈++宸ョ▼涓殑綾誨眰嬈$粨鏋勩侱ocVizor蹇熷湴浜х敓瀹屾暣鍙緵鎵撳嵃鐨勭被灞傛緇撴瀯鍥撅紝鍖呮嫭浠庣涓夋柟搴撲腑鏉ョ殑閭d簺綾伙紝闄ゆ涔嬪DocVizor榪樿兘浠庣被淇℃伅涓駭鐢烪TML鏂囦歡銆?/p>

銆銆(6) SourcePublisher C++

銆銆鍙傝冪珯鐐癸細(xì)http://www.scitools.com/sourcepublisher_c.html

銆銆緇欐簮浠g爜浜х敓鎻愪緵蹇熺洿瑙傜殑HTML鎶ヨ〃錛屽寘鎷唬鐮侊紝綾誨眰嬈$粨鏋勶紝璋冪敤鍜岃璋冪敤鏍?wèi)锛屽寘鍚拰琚寘鍚爲(wèi)銆傛敮鎸佸縐嶆搷浣滅郴緇熴?/p>

銆銆(7) Understand

銆銆鍙傝冪珯鐐癸細(xì)http://www.scitools.com/ucpp.html

銆銆鍒嗘瀽浠諱綍瑙勬ā鐨凜鎴栬匔++宸ョ▼錛屽府鍔╂垜浠洿濂界殑鐞嗚В浠ュ強(qiáng)緙栧啓鏂囨。銆?/p>

銆銆4.2 浠g爜綾?/p>

銆銆(1) CC-Rider

銆銆鍙傝冪珯鐐癸細(xì)http://www.cc-rider.com/

銆銆CC-Rider鏄敤浜嶤/C++紼嬪簭寮哄ぇ鐨勪唬鐮佸彲瑙嗗寲宸ュ叿錛岄氳繃浜や簰寮忔祻瑙堛佺紪杈戝強(qiáng)鑷姩鏂囦歡鏉ヤ績榪涚▼搴忕殑緇存寔鍜屽彂灞曘?/p>

銆銆(2) CodeInspect

銆銆鍙傝冪珯鐐癸細(xì)http://www.yokasoft.com/

銆銆涓縐嶆柊鐨凜/C++浠g爜鍒嗘瀽宸ュ叿銆傚畠媯鏌ユ垜浠殑婧愪唬鐮佹壘鍑洪潪鏍囧噯鐨勶紝鍙兘鐨勶紝浠ュ強(qiáng)鏅氱殑閿欒浠g爜銆?/p>

銆銆(3) CodeWizard

銆銆鍙傝冪珯鐐癸細(xì)http://www.parasoft.com/

銆銆鍏堣繘鐨凜/C++婧愪唬鐮佸垎鏋愬伐鍏鳳紝浣跨敤瓚呰繃500涓紪鐮佽鑼冭嚜鍔ㄥ寲鍦版爣鏄庡嵄闄╃殑錛屼絾鏄紪璇戝櫒涓嶈兘媯鏌ュ埌鐨勪唬鐮佺粨鏋勩?/p>

銆銆(4) C++ Validation Test Suites

銆銆鍙傝冪珯鐐癸細(xì)http://www.plumhall.com/suites.html

銆銆涓緇勭敤浜庢祴璇曠紪璇戝櫒鍜屽簱瀵逛簬鏍囧噯鍚誨悎紼嬪害鐨勪唬鐮佸簱銆?/p>

銆銆(5) CppRefactory

銆銆鍙傝冪珯鐐癸細(xì)http://cpptool.sourceforge.net/

銆銆CPPRefactory鏄竴涓嬌寰楀紑鍙戣呰兘澶熼噸鏋勪粬浠殑C++浠g爜鐨勭▼搴忋傜洰鐨勬槸浣垮緱C++浠g爜鐨勯噸鏋勮兘澶熷敖鍙兘鐨勬湁鏁堢巼鍜岀畝鍗曘?/p>

銆銆(6) Lzz

銆銆鍙傝冪珯鐐癸細(xì)http://www.lazycplusplus.com/

銆銆Lzz鏄竴涓嚜鍔ㄥ寲璁稿C++緙栫▼涓殑浣撳姏媧葷殑宸ュ叿銆傚畠鑳藉鑺傜渷鎴戜滑璁稿浜嬩歡騫朵笖浣垮緱緙栫爜鏇村姞鏈変箰瓚c傜粰鍑轟竴緋誨垪鐨勫0鏄庯紝Lzz浼?xì)缁欐垜浠垱寰忓ご鏂囦欢鍜屾簮鏂囦欢銆?/p>

銆銆(7) QA C++ Generation 2000

銆銆鍙傝冪珯鐐癸細(xì)http://www.programmingresearch.com/solutions/qacpp.htm

銆銆瀹冨叧娉ㄩ潰鍚戝璞$殑C++婧愪唬鐮侊紝瀵規(guī)湁鍏充簬璁捐錛屾晥鐜囷紝鍙?鎬э紝鍙淮鎶ゆх殑閮ㄥ垎鎻愬嚭璀﹀憡淇℃伅銆?/p>

銆銆(8) s-mail project - Java to C++DOL

銆銆鍙傝冪珯鐐癸細(xì)http://sadlocha.strefa.pl/s-mail/ja2dol.html

銆銆鎶奐ava婧愪唬鐮佺炕璇戜負(fù)鐩稿簲鐨凜++婧愪唬鐮佺殑鍛戒護(hù)琛屽伐鍏楓?/p>

銆銆(9) SNIP from Cleanscape Software International

銆銆鍙傝冪珯鐐癸細(xì)http://www.cleanscape.net/stdprod/snip/index.html

銆銆涓涓~騫崇紪鐮佸拰璁捐涔嬮棿娌熷鐨勬槗浜庝嬌鐢ㄧ殑C++寮鍙戝伐鍏鳳紝鑺傜渷澶ч噺緙栬緫鍜岃皟璇曠殑浜嬩歡錛屽畠榪樹嬌寰楀紑鍙戣呰兘澶熸寚瀹氳璁℃ā寮忎綔涓哄璞℃ā鍨嬶紝鑷姩浠庡璞℃ā鍨嬩腑浜х敓C++鐨勭被銆?/p>

銆銆(10) SourceStyler C++

銆銆鍙傝冪珯鐐癸細(xì)http://www.ochresoftware.com/

銆銆瀵笴/C++婧愪唬鐮佹彁渚涘畬鏁寸殑鏍煎紡鍖栧拰鎺掔増鎺у埗鐨勫伐鍏楓傛彁渚涘浜?5涓殑鏍煎紡鍖栭夐」浠ュ強(qiáng)瀹屽叏鏀寔ANSI C++銆?/p>

銆銆4.3 緙栬瘧綾?/p>

銆銆(1) Compilercache

銆銆鍙傝冪珯鐐癸細(xì)http://www.erikyyy.de/compilercache/

銆銆Compilercache鏄竴涓浣犵殑C鍜孋++緙栬瘧鍣ㄧ殑灝佽鑴氭湰銆傛瘡嬈℃垜浠繘琛岀紪璇戯紝灝佽鑴氭湰錛屾妸緙栬瘧鐨勭粨鏋滄斁鍏ョ紦瀛橈紝涓鏃︾紪璇戠浉鍚岀殑涓滆タ錛岀粨鏋滃皢浠庣紦瀛樹腑鍙栧嚭鑰屼笉鏄啀嬈$紪璇戙?/p>

銆銆(2) Ccache

銆銆鍙傝冪珯鐐癸細(xì)http://ccache.samba.org/

銆銆Ccache鏄竴涓紪璇戝櫒緙撳瓨銆傚畠浣跨敤璧鋒潵灝卞儚C/C++緙栬瘧鍣ㄧ殑緙撳瓨棰勫鐞嗗櫒錛岀紪璇戦熷害閫氬父鑳芥彁楂樻櫘閫氱紪璇戣繃紼嬬殑5~10鍊嶃?/p>

銆銆(3) Cmm (C++ with MultiMethods)

銆銆鍙傝冪珯鐐癸細(xì)http://www.op59.net/cmm/cmm-0.28/users.html

銆銆榪欐槸涓縐岰++璇█鐨勬墿灞曘傝鍏mm婧愪唬鐮佽緭鍑篊++鐨勬簮浠g爜錛屽姛鑳芥槸瀵笴++璇█娣誨姞浜嗗multimethod鐨勬敮鎸併?/p>

銆銆(4) The Frost Project

銆銆鍙傝冪珯鐐癸細(xì)http://frost.flewid.de/

銆銆Forst浣垮緱浣犺兘澶熷湪C++紼嬪簭涓儚鍘熺敓鐨凜++鐗規(guī)т竴鏍蜂嬌鐢╩ultimethod浠ュ強(qiáng)铏氬嚱鏁板弬鏁般傚畠鏄竴涓紪璇戝櫒鐨勫澹熾?/p>

銆銆4.4 嫻嬭瘯鍜岃皟璇曠被

銆銆(1) CPPUnit

銆銆CppUnit 鏄釜鍩轟簬 LGPL 鐨勫紑婧愰」鐩紝鏈鍒濈増鏈Щ妞嶈嚜 JUnit錛屾槸涓涓潪甯鎬紭縐鐨勫紑婧愭祴璇曟鏋躲侰ppUnit 鍜?JUnit 涓鏍蜂富瑕佹濇兂鏉ユ簮浜庢瀬闄愮紪紼嬨備富瑕佸姛鑳藉氨鏄鍗曞厓嫻嬭瘯榪涜綆$悊錛屽茍鍙繘琛岃嚜鍔ㄥ寲嫻嬭瘯銆?br />

銆銆(2) C++Test

銆銆鍙傝冪珯鐐癸細(xì)http://www.parasoft.com/

銆銆C++ Test鏄竴涓崟鍏冩祴璇曞伐鍏鳳紝瀹冭嚜鍔ㄥ寲浜咰鍜孋++綾伙紝鍑芥暟鎴栬呯粍浠剁殑嫻嬭瘯銆?/p>


銆銆(3) Cantata++

銆銆鍙傝冪珯鐐癸細(xì)http://www.iplbath.com/products/tools/pt400.shtml

銆銆璁捐鐨勭洰鐨勬槸涓轟簡婊¤凍鍦ㄥ悎鐞嗙殑緇忔祹寮閿涓嬩嬌鐢ㄨ繖涓伐鍏峰彲浠ヨ寮鍙戝伐紼嬪笀寮灞曞崟鍏冩祴璇曞拰闆嗘垚嫻嬭瘯鐨勯渶姹?

銆銆(4) Purify

銆銆鍙傝冪珯鐐癸細(xì)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鍐呭瓨涓嫻嬪拰璇婃柇閿欒錛屼互鍙?qiáng)鍙戠幇鍐呭瓨鍜岃祫婧愮殑娉勬紡銆傘銆

銆銆(6) Insure++

銆銆鍙傝冪珯鐐癸細(xì)http://www.parasoft.com/

銆銆涓涓嚜鍔ㄥ寲鐨勮繍琛屾椂紼嬪簭嫻嬭瘯宸ュ叿錛屾鏌ラ毦浠ュ療瑙夌殑閿欒,濡傚唴瀛樿鐩栵紝鍐呭瓨娉勬紡錛屽唴瀛樺垎閰嶉敊璇紝鍙橀噺鍒濆鍖栭敊璇紝鍙橀噺瀹氫箟鍐茬獊錛屾寚閽堥敊璇紝搴撻敊璇紝閫昏緫閿欒鍜岀畻娉曢敊璇瓑銆?/p>

銆銆(7) GlowCode

銆銆鍙傝冪珯鐐癸細(xì)http://www.glowcode.com/

銆銆GlowCode鍖呮嫭鍐呭瓨娉勬紡媯鏌ワ紝code profiler錛屽嚱鏁拌皟鐢ㄨ窡韙瓑鍔熻兘銆傜粰C(jī)++寮鍙戣呮彁渚涘畬鏁寸殑閿欒璇婃柇錛屽拰榪愯鏃舵ц兘鍒嗘瀽宸ュ叿鍖呫?/p>

銆銆(8) Stack Spy

銆銆鍙傝冪珯鐐癸細(xì)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

銆銆鍙傝冪珯鐐癸細(xì)http://www.dinkumware.com/

銆銆P.J. Plauger緙栧啓鐨勯珮鍝佽川鐨勬爣鍑嗗簱銆侾.J. Plauger鍗氬+鏄疍r. Dobb's紼嬪簭璁捐鏉板嚭濂栫殑鑾峰緱鑰呫傚叾緙栧啓鐨勫簱闀挎湡琚玀icrosoft閲囩敤錛屽茍涓旀渶榪態(tài)orland涔熷彇寰椾簡鍏禣EM鐨刲icense錛屽湪鍏禖/C++鐨勪駭鍝佷腑閲囩敤Dinkumware鐨勫簱銆?/p>

銆銆(2) RogueWave Standard C++ Library

銆銆鍙傝冪珯鐐癸細(xì)http://www.roguewave.com/

銆銆榪欎釜搴撳湪Borland C++ Builder鐨勬棭鏈熺増鏈腑鏇劇粡琚噰鐢紝鍚庢潵琚叾浠栫殑搴撶粰鏇挎崲浜嗐傜瑪鑰呬笉鎺ㄨ崘浣跨敤銆?/p>

銆銆(3) SGI STL

銆銆鍙傝冪珯鐐癸細(xì)http://www.roguewave.com/

銆銆SGI鍏徃鐨凜++鏍囧噯妯$増搴撱?/p>

銆銆(4) STLport

銆銆鍙傝冪珯鐐癸細(xì)http://www.stlport.org/

銆銆SGI STL搴撶殑璺ㄥ鉤鍙板彲縐繪鐗堟湰銆?/p>

銆銆5.2 鈥滃噯鈥濇爣鍑嗗簱 - Boost

銆銆鍙傝冪珯鐐癸細(xì)http://www.boost.org/

銆銆鍥藉唴闀滃儚錛?a >http://www.c-view.org/tech/lib/boost/index.htm

銆銆Boost搴撴槸涓涓粡榪囧崈閿ょ櫨鐐箋佸彲縐繪銆佹彁渚涙簮浠g爜鐨凜++搴擄紝浣滀負(fù)鏍囧噯搴撶殑鍚庡錛屾槸C++鏍囧噯鍖栬繘紼嬬殑鍙戝姩鏈轟箣涓銆?Boost搴撶敱C++鏍囧噯濮斿憳浼?xì)搴撳伐浣溇l勬垚鍛樺彂璧鳳紝鍦–++紺懼尯涓獎鍝嶇敋澶э紝鍏舵垚鍛樺凡榪?000浜恒?Boost搴撲負(fù)鎴戜滑甯︽潵浜嗘渶鏂般佹渶閰楓佹渶瀹炵敤鐨勬妧鏈紝鏄笉鎶樹笉鎵g殑鈥滃噯鈥濇爣鍑嗗簱銆?/p>

銆銆Boost涓瘮杈冩湁鍚嶆皵鐨勬湁榪欎箞鍑犱釜搴擄細(xì)

銆銆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涓櫤鑳芥寚閽堬紝瀛︿範(fàn)鏅鴻兘鎸囬拡蹇呰錛屼竴浠戒笉閿欑殑鍙傝冩槸鏉ヨ嚜CUJ鐨勬枃绔狅細(xì)

銆銆Smart Pointers in Boost錛屽摝錛岃繖綃囨枃绔犲彲浠ユ煡鍒幫紝CUJ鏄彁渚涘湪綰挎祻瑙堢殑銆備腑鏂囩増瑙佺瑪鑰呭湪銆奃r. Dobb's Journal杞歡鐮斿彂鏉傚織銆嬬7杈戜笂鐨勮瘧鏂囥?/p>

銆銆Boost鎬諱綋鏉ヨ鏄疄鐢ㄤ環(huán)鍊煎緢楂橈紝璐ㄩ噺寰堥珮鐨勫簱銆傚茍涓旂敱浜庡叾瀵硅法騫沖彴鐨勫己璋冿紝瀵規(guī)爣鍑咰++鐨勫己璋冿紝鏄紪鍐欏鉤鍙版棤鍏籌紝鐜頒唬C++鐨勫紑鍙戣呭繀澶囩殑宸ュ叿銆備絾鏄疊oost涓篃鏈夊緢澶氭槸瀹為獙鎬ц川鐨勪笢瑗匡紝鍦ㄥ疄闄呯殑寮鍙戜腑瀹炵敤闇瑕佽皚鎱庛傚茍涓斿緢澶欱oost涓殑搴撳姛鑳藉牚縐板璇█鍔熻兘鐨勬墿灞曪紝鍏舵瀯閫犵敤灝界簿宸х殑鎵嬫硶錛屼笉瑕佽錘鐒剁殑鑺辮垂鏃墮棿鐮旇銆侭oost鍙﹀涓闈紝姣斿Graph榪欐牱鐨勫簱鍒欐槸鍏鋒湁宸ヤ笟寮哄害錛岀粨鏋勮壇濂斤紝闈炲父鍊煎緱鐮旇鐨勭簿鍝佷唬鐮侊紝騫朵笖涔熷彲浠ユ斁蹇冪殑鍦ㄤ駭鍝佷唬鐮佷腑澶氬鍒╃敤銆?/p>

銆銆5.3 GUI

銆銆鍦ㄤ紬澶欳++鐨勫簱涓紝GUI閮ㄥ垎鐨勫簱綆楁槸姣旇緝綣佽崳錛屼篃姣旇緝寮曚漢娉ㄧ洰鐨勩傚湪瀹為檯寮鍙戜腑錛孏UI搴撶殑閫夋嫨涔熸槸闈炲父閲嶈鐨勪竴浠朵簨鎯咃紝涓嬮潰鎴戜滑緇艱堪涓涓嬪彲閫夋嫨鐨凣UI搴擄紝鍚勮嚜鐨勭壒鐐逛互鍙?qiáng)鐩稿厸_伐鍏風(fēng)殑鏀寔銆?/p>

銆銆(1) MFC

銆銆澶у悕榧庨紟鐨勫井杞熀紜綾誨簱錛圡icrosoft Foundation Class錛夈傚ぇ鍑″榪嘨C++鐨勪漢閮藉簲璇ョ煡閬撹繖涓簱銆傝櫧鐒朵粠鎶鏈搴﹁錛孧FC鏄笉澶ф紓浜殑錛屼絾鏄畠鏋勫緩浜嶹indows API 涔嬩笂錛岃兘澶熶嬌紼嬪簭鍛樼殑宸ヤ綔鏇村鏄?緙栫▼鏁堢巼楂橈紝鍑忓皯浜嗗ぇ閲忓湪寤虹珛 Windows 紼嬪簭鏃跺繀欏葷紪鍐欑殑浠g爜錛屽悓鏃跺畠榪樻彁渚涗簡鎵鏈変竴鑸?C++ 緙栫▼鐨勪紭鐐癸紝渚嬪緇ф壙鍜屽皝瑁呫侻FC 緙栧啓鐨勭▼搴忓湪鍚勪釜鐗堟湰鐨刉indows鎿嶄綔緋葷粺涓婃槸鍙Щ妞嶇殑錛屼緥濡傦紝鍦╓indows 3.1涓嬬紪鍐欑殑浠g爜鍙互寰堝鏄撳湴縐繪鍒?Windows NT 鎴?Windows 95 涓娿備絾鏄湪鏈榪戝彂灞曚互鍙?qiáng)瀹樻栆?guī)敮鎸佷笂鏃ユ笎鍔垮井銆?/p>

銆銆(2) QT

銆銆鍙傝冪綉绔欙細(xì)http://www.trolltech.com/

銆銆Qt鏄疶rolltech鍏徃鐨勪竴涓騫沖彴鐨凜++鍥懼艦鐢ㄦ埛鐣岄潰搴旂敤紼嬪簭妗嗘灦銆傚畠鎻愪緵緇欏簲鐢ㄧ▼搴忓紑鍙戣呭緩绔嬭壓鏈駭鐨勫浘褰㈢敤鎴風(fēng)晫闈㈡墍闇鐨勬墍鐢ㄥ姛鑳姐俀t鏄畬鍏ㄩ潰鍚戝璞$殑寰堝鏄撴墿灞曪紝騫朵笖鍏佽鐪熸鍦扮粍浠剁紪紼嬨傝嚜浠?996騫存棭浜涙椂鍊欙紝Qt榪涘叆鍟嗕笟棰嗗煙錛屽畠宸茬粡鎴愪負(fù)鍏ㄤ笘鐣岃寖鍥村唴鏁板崈縐嶆垚鍔熺殑搴旂敤紼嬪簭鐨勫熀紜銆俀t涔熸槸嫻佽鐨凩inux妗岄潰鐜KDE 鐨勫熀紜錛屽悓鏃跺畠榪樻敮鎸乄indows銆丮acintosh銆乁nix/X11絳夊縐嶅鉤鍙般?/p>

銆銆(3) WxWindows

銆銆鍙傝冪綉绔欙細(xì)http://www.wxwindows.org/

銆銆璺ㄥ鉤鍙扮殑GUI搴撱傚洜涓哄叾綾誨眰嬈℃瀬鍍廙FC錛屾墍浠ユ湁鏂囩珷浠嬬粛浠嶮FC鍒癢xWindows鐨勪唬鐮佺Щ妞嶄互瀹炵幇璺ㄥ鉤鍙扮殑鍔熻兘銆傞氳繃澶氬勾鐨勫紑鍙戜篃鏄竴涓棩瓚嬪畬鍠勭殑GUI搴擄紝鏀寔鍚屾牱涓嶅急浜庡墠闈袱涓簱銆傚茍涓旀槸瀹屽叏寮鏀炬簮浠g爜鐨勩傛柊榪戠殑C++ Builder X鐨凣UI璁捐鍣ㄥ氨鏄熀浜庤繖涓簱鐨勩?/p>

銆銆(4) Fox

銆銆鍙傝冪綉绔欙細(xì)http://www.fox-toolkit.org/

銆銆寮鏀炬簮浠g爜鐨凣UI搴撱備綔鑰呬粠鑷繁浜茶韓鐨勫紑鍙戠粡楠屼腑寰楀嚭浜嗕竴涓悊鎯崇殑GUI搴撳簲璇ユ槸浠涔堟牱瀛愮殑鎰熷彈鍑哄彂錛屼粠鑰屽紑濮嬩簡瀵硅繖涓簱鐨勫紑鍙戙傛湁鍏磋叮鐨勫彲浠ュ皾璇曚竴涓嬨?/p>


銆銆(5) WTL

銆銆鍩轟簬ATL鐨勪竴涓簱銆傚洜涓轟嬌鐢ㄤ簡澶ч噺ATL鐨勮交閲忕駭鎵嬫硶錛屾ā鏉跨瓑鎶鏈紝鍦ㄤ唬鐮佸昂瀵革紝浠ュ強(qiáng)閫熷害浼樺寲鏂歸潰鍋氬緱闈炲父鍒頒綅銆備富瑕侀潰鍚戠殑浣跨敤緹や綋鏄紑鍙慍OM杞婚噺綰т緵緗戠粶涓嬭澆鐨勫彲瑙嗗寲鎺т歡鐨勫紑鍙戣呫?/p>

銆銆(6) GTK

銆銆鍙傝冪綉绔欙細(xì)http://gtkmm.sourceforge.net/

銆銆GTK鏄竴涓ぇ鍚嶉紟榧庣殑C鐨勫紑婧怗UI搴撱傚湪Linux涓栫晫涓湁Gnome榪欐牱鐨勬潃鎵嬪簲鐢ㄣ傝孏TK灝辨槸榪欎釜搴撶殑C++灝佽鐗堟湰銆?/p>

銆銆5.4 緗戠粶閫氫俊

銆銆(1) ACE

銆銆鍙傝冪綉绔欙細(xì)http://www.cs.wustl.edu/~schmidt/ACE.html

銆銆C++搴撶殑浠h〃錛岃秴閲嶉噺綰х殑緗戠粶閫氫俊寮鍙戞鏋躲侫CE鑷傞厤閫氫俊鐜錛圓daptiveCommunication Environment錛夋槸鍙互鑷敱浣跨敤銆佸紑鏀炬簮浠g爜鐨勯潰鍚戝璞℃鏋訛紝鍦ㄥ叾涓疄鐜頒簡璁稿鐢ㄤ簬騫跺彂閫氫俊杞歡鐨勬牳蹇冩ā寮忋侫CE鎻愪緵浜嗕竴緇勪赴瀵岀殑鍙鐢–++鍖呰澶栬錛圵rapper Facade錛夊拰妗嗘灦緇勪歡錛屽彲璺ㄨ秺澶氱騫沖彴瀹屾垚閫氱敤鐨勯氫俊杞歡浠誨姟錛屽叾涓寘鎷細(xì)浜嬩歡澶氳礬鍒嗙鍜屼簨浠跺鐞嗗櫒鍒嗘淳銆佷俊鍙峰鐞嗐佹湇鍔″垵濮嬪寲銆佽繘紼嬮棿閫?br />淇°佸叡浜唴瀛樼鐞嗐佹秷鎭礬鐢便佸垎甯冨紡鏈嶅姟鍔ㄦ侊紙閲嶏級閰嶇疆銆佸茍鍙戞墽琛屽拰鍚屾錛岀瓑絳夈?/p>

銆銆(2) StreamModule

銆銆鍙傝冪綉绔欙細(xì)http://www.omnifarious.org/StrMod/

銆銆璁捐鐢ㄤ簬綆鍖栫紪鍐欏垎甯冨紡紼嬪簭鐨勫簱銆傚皾璇曠潃浣垮緱緙栧啓澶勭悊寮傛琛屼負(fù)鐨勭▼搴忔洿瀹規(guī)槗錛岃屼笉鏄敤鍚屾鐨勫澹沖寘璧峰紓姝ョ殑鏈川銆?/p>

銆銆(3) SimpleSocket

銆銆鍙傝冪綉绔欙細(xì)http://home.hetnet.nl/~lcbokkers/simsock.htm

銆銆榪欎釜綾誨簱璁╃紪鍐欏熀浜巗ocket鐨勫鎴?鏈嶅姟鍣ㄧ▼搴忔洿鍔犲鏄撱?/p>

銆銆(4) A Stream Socket API for C++

銆銆鍙傝冪綉绔欙細(xì)http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.h
tml

銆銆鍙堜竴涓Socket鐨勫皝瑁呭簱銆?/p>

銆銆5.5 XML

銆銆(1) Xerces

銆銆鍙傝冪綉绔欙細(xì)http://xml.apache.org/xerces-c/

銆銆Xerces-C++ 鏄竴涓潪甯稿仴澹殑XML瑙f瀽鍣紝瀹冩彁渚涗簡楠岃瘉錛屼互鍙?qiáng)SAX鍜孌OM API銆俋ML楠岃瘉鍦ㄦ枃妗g被鍨嬪畾涔?Document Type Definition錛孌TD)鏂歸潰鏈夊緢濂界殑鏀寔錛屽茍涓斿湪2001騫?2鏈堝鍔犱簡鏀寔W3C XML Schema 鐨勫熀鏈畬鏁寸殑寮鏀炬爣鍑嗐?/p>

銆銆(2) XMLBooster

銆銆鍙傝冪綉绔欙細(xì)http://www.xmlbooster.com/

銆銆榪欎釜搴撻氳繃浜х敓鐗瑰埗鐨刾arser鐨勫姙娉曟瀬澶х殑鎻愰珮浜哫ML瑙f瀽鐨勯熷害錛屽茍涓旇兘澶熶駭鐢熺浉搴旂殑GUI紼嬪簭鏉ヤ慨鏀硅繖涓猵arser銆傚湪DOM鍜孲AX涓ゅぇ涓繪祦XML瑙f瀽鍔炴硶涔嬪鎻愪緵浜嗗彟澶栦竴涓彲琛岀殑瑙e喅鏂規(guī)銆?/p>

銆銆(3) Pull Parser

銆銆鍙傝冪綉绔欙細(xì)http://www.extreme.indiana.edu/xgws/xsoap/xpp/

銆銆榪欎釜搴撻噰鐢╬ull鏂規(guī)硶鐨刾arser銆傚湪姣忎釜SAX鐨刾arser搴曞眰閮芥湁涓涓猵ull鐨刾arser錛岃繖涓獂pp鎶婅繖灞傛毚闇插嚭鏉ョ洿鎺ョ粰澶у浣跨敤銆傚湪瑕佸厖鍒嗚冭檻閫熷害鐨勬椂鍊欏煎緱灝濊瘯銆?br />
銆銆(4) Xalan

銆銆鍙傝冪綉绔欙細(xì)http://xml.apache.org/xalan-c/

銆銆Xalan鏄竴涓敤浜庢妸XML鏂囨。杞崲涓篐TML錛岀函鏂囨湰鎴栬呭叾浠朮ML綾誨瀷鏂囨。鐨刋SLT澶勭悊鍣ㄣ?/p>

銆銆(5) CMarkup

銆銆鍙傝冪綉绔欙細(xì)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++

銆銆鍙傝冪綉绔欙細(xì)http://www.oonumerics.org/blitz/

銆銆Blitz++ 鏄竴涓珮鏁堢巼鐨勬暟鍊艱綆楀嚱鏁板簱錛屽畠鐨勮璁$洰鐨勬槸甯屾湜寤虹珛涓濂楁棦鍏峰儚C++ 涓鏍鋒柟渚匡紝鍚屾椂鍙堟瘮Fortran閫熷害鏇村揩鐨勬暟鍊艱綆楃幆澧冦傞氬父錛岀敤C++鎵鍐欏嚭鐨勬暟鍊肩▼搴忥紝姣?Fortran鎱?0%宸﹀彸錛屽洜姝litz++姝f槸瑕佹敼鎺夎繖涓己鐐廣傛柟娉曟槸鍒╃敤C++鐨則emplate鎶鏈紝紼嬪簭鎵ц鐢氳嚦鍙互姣擣ortran鏇村揩銆侭litz++鐩墠浠嶅湪鍙戝睍涓紝瀵逛簬甯歌鐨凷VD錛孎FTs錛孮MRES絳夊父瑙佺殑綰挎т唬鏁版柟娉曞茍涓嶆彁渚涳紝涓嶈繃浣跨敤鑰呭彲浠ュ緢瀹規(guī)槗鍦板埄鐢˙litz++鎵鎻愪緵鐨勫嚱鏁版潵鏋勫緩銆?/p>

銆銆(2) POOMA

銆銆鍙傝冪綉绔欙細(xì)http://www.codesourcery.com/pooma/pooma

銆銆POOMA鏄竴涓厤璐圭殑楂樻ц兘鐨凜++搴擄紝鐢ㄤ簬澶勭悊騫惰寮忕瀛﹁綆椼侾OOMA鐨勯潰鍚戝璞¤璁℃柟渚夸簡蹇熺殑紼嬪簭寮鍙戯紝瀵瑰茍琛屾満鍣ㄨ繘琛屼簡浼樺寲浠ヨ揪鍒版渶楂樼殑鏁堢巼錛屾柟渚垮湪宸ヤ笟鍜岀爺絀剁幆澧冧腑浣跨敤銆?/p>

銆銆(3) MTL

銆銆鍙傝冪綉绔欙細(xì)http://www.osl.iu.edu/research/mtl/

銆銆Matrix Template Library(MTL)鏄竴涓珮鎬ц兘鐨勬硾鍨嬬粍浠跺簱錛屾彁渚涗簡鍚勭鏍煎紡鐭╅樀鐨勫ぇ閲忕嚎鎬т唬鏁版柟闈㈢殑鍔熻兘銆傚湪鏌愪簺搴旂敤浣跨敤楂樻ц兘緙栬瘧鍣ㄧ殑鎯呭喌涓嬶紝姣斿Intel鐨勭紪璇戝櫒錛屼粠浜х敓鐨勬眹緙栦唬鐮佸彲浠ョ湅鍑哄叾涓庢墜鍐欏嚑涔庢病鏈変袱鏍風(fēng)殑鏁堣兘銆?/p>

銆銆(4) CGAL

銆銆鍙傝冪綉绔欙細(xì)http://www.cgal.org/

銆銆Computational Geometry Algorithms Library鐨勭洰鐨勬槸鎶婂湪璁$畻鍑犱綍鏂歸潰鐨勫ぇ閮ㄥ垎閲嶈鐨勮В鍐蟲柟妗堝拰鏂規(guī)硶浠++搴撶殑褰㈠紡鎻愪緵緇欏伐涓氬拰瀛︽湳鐣岀殑鐢ㄦ埛銆?/p>

銆銆5.7 娓告垙寮鍙?/p>

銆銆(1) Audio/Video 3D C++ Programming Library

銆銆鍙傝冪綉绔欙細(xì)http://www.galacticasoftware.com/products/av/

銆銆AV3D鏄竴涓法騫沖彴錛岄珮鎬ц兘鐨凜++搴撱備富瑕佺殑鐗規(guī)ф槸鎻愪緵3D鍥懼艦錛屽0鏁堟敮鎸侊紙SB,浠ュ強(qiáng)S3M錛夛紝鎺у埗鎺ュ彛錛堥敭鐩橈紝榧犳爣鍜岄仴鎰燂級錛孹MS銆?/p>

銆銆(2) KlayGE

銆銆鍙傝冪綉绔欙細(xì)http://home.g365.net/enginedev/

銆銆鍥藉唴娓告垙寮鍙戦珮鎵嬭嚜宸辯敤C++寮鍙戠殑娓告垙寮曟搸銆侹layGE鏄竴涓紑鏀炬簮浠g爜銆佽法騫沖彴鐨勬父鎴忓紩鎿庯紝騫朵嬌鐢≒ython浣滆剼鏈璦銆侹layGE鍦↙GPL鍗忚涓嬪彂琛屻傛劅璋㈤練鏁忔晱鍏堢敓涓轟腑鍥芥父鎴忓紑鍙戜簨涓氭墍鍋氬嚭鐨勮礎(chǔ)鐚?/p>

銆銆(3) OGRE

銆銆鍙傝冪綉绔欙細(xì)http://www.ogre3d.org/

銆銆OGRE錛堥潰鍚戝璞$殑鍥懼艦娓叉煋寮曟搸錛夋槸鐢–++寮鍙戠殑錛屼嬌鐢ㄧ伒媧葷殑闈㈠悜瀵硅薄3D寮曟搸銆傚畠鐨勭洰鐨勬槸璁╁紑鍙戣呰兘鏇存柟渚垮拰鐩存帴鍦板紑鍙戝熀浜?D紜歡璁懼鐨勫簲鐢ㄧ▼搴忔垨娓告垙銆傚紩鎿庝腑鐨勭被搴撳鏇村簳灞傜殑緋葷粺搴擄紙濡傦細(xì)Direct3D鍜孫penGL錛夌殑鍏ㄩ儴浣跨敤緇嗚妭榪涜浜嗘娊璞★紝騫舵彁渚涗簡鍩轟簬鐜板疄涓栫晫瀵硅薄鐨勬帴鍙e拰鍏跺畠綾匯?/p>

銆銆5.8 綰跨▼

銆銆(1) C++ Threads

銆銆鍙傝冪綉绔欙細(xì)http://threads.sourceforge.net/

銆銆榪欎釜搴撶殑鐩爣鏄粰紼嬪簭鍛樻彁渚涙槗浜庝嬌鐢ㄧ殑綾伙紝榪欎簺綾昏緇ф壙浠ユ彁渚涘湪Linux鐜涓緢闅劇湅鍒扮殑澶ч噺鐨勭嚎紼嬫柟闈㈢殑鍔熻兘銆?/p>

銆銆(2) ZThreads

銆銆鍙傝冪綉绔欙細(xì)http://zthread.sourceforge.net/

銆銆涓涓厛榪涚殑闈㈠悜瀵硅薄錛岃法騫沖彴鐨凜++綰跨▼鍜屽悓姝ュ簱銆?br />

銆銆5.9 搴忓垪鍖?/p>

銆銆(1) s11n

銆銆鍙傝冪綉绔欙細(xì)http://s11n.net/

銆銆涓涓熀浜嶴TL鐨凜++搴擄紝鐢ㄤ簬搴忓垪鍖朠OD錛孲TL瀹瑰櫒浠ュ強(qiáng)鐢ㄦ埛瀹氫箟鐨勭被鍨嬨?/p>

銆銆(2) Simple XML Persistence Library

銆銆鍙傝冪綉绔欙細(xì)http://sxp.sourceforge.net/

銆銆榪欐槸涓涓妸瀵硅薄搴忓垪鍖栦負(fù)XML鐨勮交閲忕駭鐨凜++搴撱?/p>

銆銆5.10 瀛楃涓?/p>

銆銆(1) C++ Str Library

銆銆鍙傝冪綉绔欙細(xì)http://www.utilitycode.com/str/

銆銆鎿嶄綔瀛楃涓插拰瀛楃鐨勫簱錛屾敮鎸乄indows鍜屾敮鎸乬cc鐨勫縐嶅鉤鍙般傛彁渚涢珮搴︿紭鍖栫殑浠g爜錛屽茍涓旀敮鎸佸綰跨▼鐜鍜孶nicode錛屽悓鏃惰繕鏈夋鍒欒〃杈懼紡鐨勬敮鎸併?/p>

銆銆(2) Common Text Transformation Library

銆銆鍙傝冪綉绔欙細(xì)http://cttl.sourceforge.net/

銆銆榪欐槸涓涓В鏋愬拰淇敼STL瀛楃涓茬殑搴撱侰TTL substring綾誨彲浠ョ敤鏉ユ瘮杈冿紝鎻掑叆錛屾浛鎹互鍙?qiáng)鐢‥BNF鐨勮娉曡繘琛岃В鏋愩?/p>

銆銆(3) GRETA

銆銆鍙傝冪綉绔欙細(xì)http://research.microsoft.com/projects/greta/

銆銆榪欐槸鐢卞井杞爺絀墮櫌鐨勭爺絀朵漢鍛樺紑鍙戠殑澶勭悊姝e垯琛ㄨ揪寮忕殑搴撱傚湪灝忓瀷鍖歸厤鐨勬儏鍐典笅鏈夐潪甯鎬紭縐鐨勮〃鐜般?/p>

銆銆5.11 緇煎悎

銆銆(1) P::Classes

銆銆鍙傝冪綉绔欙細(xì)http://pclasses.com/

銆銆涓涓珮搴﹀彲縐繪鐨凜++搴旂敤紼嬪簭妗嗘灦銆傚綋鍓嶅叧娉ㄧ被鍨嬪拰綰跨▼瀹夊叏鐨剆ignal/slot鏈哄埗錛宨/o緋葷粺鍖呮嫭鍩轟簬鎻掍歡鐨勭綉緇滃崗璁忔槑鐨刬/o鏋舵瀯錛屽熀浜庢彃浠剁殑搴旂敤紼嬪簭娑堟伅鏃ュ織妗嗘灦錛岃闂畇ql鏁版嵁搴撶殑綾葷瓑絳夈?/p>

銆銆(2) ACDK - Artefaktur Component Development Kit

銆銆鍙傝冪綉绔欙細(xì)http://acdk.sourceforge.net/

銆銆榪欐槸涓涓鉤鍙版棤鍏崇殑C++緇勪歡妗嗘灦錛岀被浼間簬Java鎴栬?NET涓殑妗嗘灦錛堝弽灝勬満鍒訛紝綰跨▼錛孶nicode錛屽簾鏂欐敹闆嗭紝I/O錛岀綉緇滐紝瀹炵敤宸ュ叿錛孹ML錛岀瓑絳夛級錛屼互鍙?qiáng)瀵笿ava, Perl, Python, TCL, Lisp, COM 鍜?CORBA鐨勯泦鎴愩?/p>

銆銆(3) dlib C++ library

銆銆鍙傝冪綉绔欙細(xì)http://www.cis.ohio-state.edu/~kingd/dlib/

銆銆鍚勭鍚勬牱鐨勭被鐨勪竴涓患鍚堛傚ぇ鏁存暟錛孲ocket錛岀嚎紼嬶紝GUI錛屽鍣ㄧ被,浠ュ強(qiáng)嫻忚鐩綍鐨凙PI絳夌瓑銆?/p>

銆銆(4) Chilkat C++ Libraries

銆銆鍙傝冪綉绔欙細(xì)http://www.chilkatsoft.com/cpp_libraries.asp

銆銆榪欐槸鎻愪緵zip錛宔-mail錛岀紪鐮侊紝S/MIME錛孹ML絳夋柟闈㈢殑搴撱?/p>

銆銆(5) C++ Portable Types Library (PTypes)

銆銆鍙傝冪綉绔欙細(xì)http://www.melikyan.com/ptypes/

銆銆榪欐槸STL鐨勬瘮杈冪畝鍗曠殑鏇夸唬鍝侊紝浠ュ強(qiáng)鍙Щ妞嶇殑澶氱嚎紼嬪拰緗戠粶搴撱?/p>

銆銆(6) LFC

銆銆鍙傝冪綉绔欙細(xì)http://lfc.sourceforge.net/

銆銆鍝︼紝榪欏張鏄竴涓皾璇曟彁渚涗竴鍒囩殑C++搴?/p>

銆銆5.12 鍏朵粬搴?/p>

銆銆(1) Loki

銆銆鍙傝冪綉绔欙細(xì)http://www.moderncppdesign.com/

銆銆鍝︼紝浣犲彲鑳芥姳鎬ㄦ垜鏃╄鍜孊oost涓璧蜂粙緇嶅畠錛屼竴涓疄楠屾ц川鐨勫簱銆備綔鑰呭湪loki涓妸C++妯℃澘鐨勫姛鑳藉彂鎸ュ埌浜嗘瀬鑷淬傚茍涓斿皾璇曟妸綾諱技璁捐妯″紡榪欐牱鎬濇兂灞傞潰鐨勪笢瑗塊氳繃搴撴潵鎻愪緵銆傚悓鏃惰繕鎻愪緵浜嗘櫤鑳芥寚閽堣繖鏍鋒瘮杈冨疄鐢ㄧ殑鍔熻兘銆?/p>

銆銆(2) ATL

銆銆ATL(Active Template Library)

銆銆鏄竴緇勫皬宸с侀珮鏁堛佺伒媧葷殑綾伙紝榪欎簺綾諱負(fù)鍒涘緩鍙簰鎿嶄綔鐨凜OM緇勪歡鎻愪緵浜嗗熀鏈殑璁炬柦銆?/p>

銆銆(3) FC++: The Functional C++ Library

銆銆榪欎釜搴撴彁渚涗簡涓浜涘嚱鏁板紡璇█涓墠鏈夌殑瑕佺礌銆傚睘浜庣敤搴撴潵鎵╁厖璇█鐨勪竴涓唬琛ㄤ綔銆傚鏋滄兂瑕佸湪OOP涔嬪瀵繪壘鍙︿竴鍒嗙殑涔愯叮錛屽彲浠ュ幓鐪嬬湅鍑芥暟寮忕▼搴忚璁$殑涓栫晫銆傚ぇ甯圥eter Norvig鍦?鈥淭each Yourself rogramming in Ten Years鈥濅竴鏂囦腑灝卞皢鍑芥暟寮忚璦鍒椾負(fù)鑷沖皯搴斿綋瀛︿範(fàn)鐨?綾葷紪紼嬭璦涔嬩竴銆?/p>

銆銆(4) FACT!

銆銆鍙傝冪綉绔欙細(xì)http://www.kfa-juelich.de/zam/FACT/start/index.html

銆銆鍙﹀涓涓疄鐜板嚱鏁板紡璇█鐗規(guī)х殑搴?/p>

銆銆(5) Crypto++

銆銆鎻愪緵澶勭悊瀵嗙爜錛屾秷鎭獙璇侊紝鍗曞悜hash錛屽叕鍖欏姞瀵嗙郴緇熺瓑鍔熻兘鐨勫厤璐瑰簱銆?/p>

銆銆榪樻湁寰堝闈炲父嬋鍔ㄤ漢蹇冩垨鑰呮槸鏋佸叾瀹炵敤鐨凜++搴擄紝闄愪簬鎴戜滑鐨勬按騫充互鍙?qiáng)鏂囩珷鐨劷媷骞呬笉鑳藉寘鎷瑯q涙潵銆傚湪瀵逛簬榪欎簺宸茬粡鍖呭惈榪戞潵鐨勫簱鐨勪粙緇嶄腑錛岀敱浜庡茍涓嶆槸姣忎竴涓垜浠兘浣跨敤榪囷紝鎵浠ラ毦鍏嶆湁鍋忛涔嬪錛岃璇昏呰璋呫?/p>

--------------------------------------------------------------------------------

銆銆6錛屼功綾?/p>

銆銆浠ュ墠鐔婅妭鍏堢敓鏇炬挵鏂囪瘎璁虹浉瀵逛簬Java紼嬪簭璁捐璇█錛孋++鐨勫ソ涔﹀濡傜墰姣涖傝崳鑰鍏堢敓鍦ㄣ婄▼搴忓憳銆嬫潅蹇椾笂鎾版枃銆奀++紼嬪簭璁捐涔嬪洓涔︿簲緇忋嬩篃灝嗘湰棰嗗煙鍐呭嚑涔庢墍鏈夌殑緇忓吀涔︾睄浣滀簡鍏ㄩ潰鐨勪粙緇?浠諱綍鍏充簬涔︾殑璇勮姝ゆ椂鐪嬫潵渚挎槸寰堝浣欑殑浜嗐備釜浜烘祬瑙侊紝闄ら潪浣犳墦綆椾互C++浣滀負(fù)鍞竴鍏磋叮鎴栬呯敓瀛樹箣鏈紝涓鑸鑰呯‘瀹炴病鏈夎凍澶熺殑鏃墮棿鍜屽繀瑕佸皢20浣欐湰涔︾睄鍏ㄩ儴闃呰銆傛洿鏈夊弬鑰冧環(huán)鍊肩殑鏄崳鑰鍏堢敓鐨勫彟涓綃囨枃绔狅細(xì)銆婅嚦灝戝簲璇ラ槄
璇葷殑涔?jié)鏈珻++钁椾綔銆嬶紝鍙互浠庝笅闈㈢殑鍦板潃嫻忚鍒版鏂囷細(xì)

銆銆http://www.royaloo.com/articles/articles_2003/9CppBooks.htm

銆銆涓嬮潰鍑犳湰涔﹀浜庤蛋鍦–++鍒濆涔嬭礬涓婄殑璇昏呮槸鎴戜滑鏈鎰挎剰鎺ㄨ崘緇欏ぇ瀹剁殑錛?/p>

銆銆(1) 銆奀++ Primer銆?/p>

銆銆鍝︼紝涔熻浣犱細(xì)鎶辨ㄦ垜浠負(fù)浠涔堜笉鍏堜粙緇峊CPL,浣嗗浜庤蛋鍦ㄥ涔?fàn)涔嬭矾涓婄殑鍏ラ棬鑰咃紝鏈功鍐呭鏇翠負(fù)鍏ㄩ潰錛屾洿涓鴻緇嗘槗鎳傦紝鎴戜滑縐板畠涓衡淐++鐨勮秴綰у疂鍏糕濆茍涓嶈繃鍒嗐傞厤鏈変竴鏈笉閿欑殑涔?fàn)棰樿В绛斻奀++ Primer Answer Book銆嬪彲浠ヨ緟鍔╀綘鐨勫涔?fàn)涔嬭矾銆?/p>

銆銆(2) 銆奅ssential C++銆?/p>

銆銆濡傛灉璇淬奀++ Primer銆嬫槸C++棰嗗煙鐨勮秴綰у疂鍏革紝閭d箞姝や功浣滀負(fù)鎺屾彙C++鐨勫ぇ灞瑙傚綋涔嬫棤鎰с傛濡傘?NET澶у眬瑙傘嬩竴涔﹁兘澶熻璇昏呭叏鎻?NET錛屾湰涔﹁榪頒簡C++涓渶鏍稿績鐨勫叏閮ㄤ富棰樸備功铏戒笉鍘氾紝鍐呭綺劇偧錛屼笉澶變負(fù)銆奀++ Primer銆嬭鑰呰尪浣欓キ鍚庣殑涓婚鍥為【涔嬩綔銆?/p>

銆銆(3) 銆奣he C++ Programming Language銆?/p>

銆銆Bjarne涓轟綘甯︽潵鐨凜++鏁欑▼錛岀湡姝h兘澶熷憡璇変綘鎬庝箞鐢ㄦ墠鍙湡姝g殑C++鐨勫敮涓涓鏈功銆傝櫧鐒跺鍚屸滄煇鏌愮▼搴忚璁¤璦鈥濊繖鏍風(fēng)殑涔︾睄浼?xì)缁欏ぇ瀹朵竴涓唴瀹瑰叏鎻斤紝鍏ラ棬鍒扮簿閫氱殑鎰熻錛屼絾鏈功紜疄涓嶅お閫傚悎鍒濆鑰呴槄璇匯傚鏋滀綘鑷涓烘槸涓鍚嶅緢鏈夌粡楠岀殑C++紼嬪簭鍛橈紝閭h嚦灝戜篃瑕佸弽澶嶅拃鍤糂jarne鍏堢敓鎵寮鴻皟鐨勮嫢騫插唴瀹廣?/p>

銆銆(4) 銆奅ffective C++銆嬶紝銆奙ore Effective C++銆?/p>

銆銆鏄殑錛屾濡備竴浜汣++鐖卞ソ鑰呯粡甯鎬互璇昏繃涓庢病鏈夎榪囦笂榪頒袱鏈綔鍝佹潵鍖哄垎浣犳槸鍚︽槸C++楂樻墜銆傛垜浠篃鏋佸姏鎺ㄥ磭榪欎袱鏈憲浣溿傚湪鍚勭浠嬬粛C++涓撳緇忛獙鐨勪功綾嶉噷闈紝榪欎袱鏈槸鏈璐磋繎璇█鏈川錛岀湅鍚庢渶鑳藉鏈夎劚鑳庢崲楠ㄦ劅瑙夌殑涔︼紝璇繪涔︿綘闇姣忔棩涓夌渷姹濊韓銆?/p>

銆銆鎶鏈功綾嶄粊鑰呰浠侊紝榪囧鐨勮瘎璁哄弽鏃犲お澶氭剰涔夛紝鐢辮鑰呭枩濂介夋嫨鏈閫傚悎鑷繁鐨勪功鏂逛負(fù)涓婄瓥銆?/p>

--------------------------------------------------------------------------------

銆銆7錛岃祫婧愮綉绔?/p>

銆銆姝e鎴戜滑鍙互閫氳繃璁$畻鏈哄巻鍙蹭笂鐨勯噸瑕佷漢鐗╀簡瑙h綆楁満鍙茬殑鍙戝睍錛孋++鐩稿叧浜虹墿鐨勭綉绔欎篃鍙互浣挎垜浠緱鍒版渶鏈変環(huán)鍊肩殑鍙傝冧笌鍊熼壌錛屼笅闈㈢殑浜虹墿鎴戜滑璁や負(fù)娌℃湁浠嬬粛鐨勫繀瑕侊紝鍙洜涓嬮潰鐨勪漢鐗╁湪C++棰嗗煙鐨勫湴浣嶄紬鎵鍛ㄧ煡錛屾垜浠彧灝嗙浉鍏崇殑璧勬簮榪涜緗楀垪浠ヤ緵璇昏呭涔?fàn)锛屼粬浠湁鐨勫伐浣滀簬璐潪當(dāng)瀹為獙瀹ゅQ屾湁鐨勫伐浣滀簬鐭ュ悕緙栬瘧鍣ㄥ巶鍟嗭紝鏈夌殑鍦ㄤ笉鏂帹榪涜璦鐨勬爣鍑嗗寲錛屾湁鐨勪負(fù)璇昏呮挵鍐欎簡澶氶儴鍗冨彜濂囦綔鈥︹?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

銆銆闄や簡涓婅堪澶у笀鐨勪富欏靛錛屼互涓嬬殑緇煎悎綾籆++瀛︿範(fàn)鍙傝冪珯鐐規(guī)槸鎴戜滑闈炲父鎰挎剰鍚戝ぇ瀹舵帹鑽愮殑錛?/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++ 鏂伴椈緇勶細(xì)
銆銆浣犱笉濡ㄥ皾璇曚粠榪欓噷鎻愰棶鍜屽洖絳旈棶棰橈紝寰堝涓嶉敊鐨凲&A璧勬簮......

銆銆(1) .alt.comp.lang.learn.c-c++
銆銆榪欎釜綆鍗曚簺錛屽鏋滀綘鍜屾垜涓鏍鋒槸涓彍楦?/p>

銆銆(2) .comp.lang.c++.moderated
聽 鍡紝榪欎釜鏄劇劧姘村鉤楂樹竴浜?/p>

銆銆(3) .comp.std.c++
銆銆濡傛灉浣犻渶瑕佽璁烘爣鍑咰++鐩稿叧璇濋鐨勮瘽

--------------------------------------------------------------------------------

銆銆8錛屼笉寰椾笉鍐欑殑緇撴潫璇?/p>

銆銆緇撴潫鐨勬椂鍊欎篃鏄葷粨鐜扮姸錛屽睍鏈涙湭鏉ョ殑鏃跺欍傝櫧鐒禖++浠庤劚鑳庝簬C寮濮嬶紝涓璺壈闅懼潕鍧風(fēng)殑璧拌繃鏉ワ紝浣嗘槸鏃犺濡備綍C++宸茬粡鍙栧緱浜嗗伐涓氬熀紜鐨勫湴浣嶃傛枃绔犲垪涓劇殑澶ч噺鐩稿叧璧勬簮灝辨槸鏈濂界殑璇佹槑錛岃屼笟鐣岀殑澶ч噺鐢–++鍐欐垚鐨勪駭鍝佷唬鐮佷互鍙?qiáng)澶ч噺鐨凜++鑱屼笟宸ョ▼甯堝垯鏄渶鐩存帴鐨勮瘉鏄庛傚悓鏃訛紝鎴戜滑鍙互鐪嬪埌鍚勪釜楂樻牎鐨勮綆楁満涓撲笟閮藉紑璁炬湁C++榪欓棬璇劇▼錛岀綉緇滀笂瀵逛簬C++鐨勫涔?fàn)璁ㄨZ篃浠庢潵閮芥病鏈夊仠榪囥備絾鏄紝鍦↗ava鍜?NET涓ゅぇ浼佷笟寮鍙戝鉤鍙扮殑鍥存敾涓嬶紝緇欎漢鐨勬劅瑙夋槸C++瓚婃潵瓚娾滀笉琛屸濅簡銆?/p>

銆銆C++鍦ㄩ潰鍚戜紒涓氱殑杞歡寮鍙戜腑錛屽湪寮鍙戜究鎹鋒х瓑鏂歸潰鐨勭‘瑕佹瘮Java鍜孋#宸緢澶氾紝鍏朵腑涓涓棶棰樻槸C++璇█鏈韓姣旇緝澶嶆潅錛屽涔?fàn)鏇簿U挎瘮杈冮櫋宄紝鍙﹀涓涓棶棰樻槸C++鏍囧噯鍖栫殑鏃墮棿澶暱錛屼撫澶變簡寰堝鐨勫.澶ф満浼?xì)锛岃楄垂浜嗗緢澶氱簿鍔涘湪鍘傚晢鐨勪箣闂寸殑鏂椾簤涓婏紝鑰孋++鐨勬爣鍑嗗簱紱諱竴涓畬鍠勭殑紼嬪簭寮鍙戞鏋惰繕緙哄皯澶澶鐨勫唴瀹癸紝鍚勪釜絎笁鏂圭殑綾誨簱鍜屾鏋跺張鍦ㄤ竴鑷存у拰瀹屾暣鎬т笂娌℃硶鍜岄殢騫沖彴鎻愪緵鐨勬鏋剁浉鎻愬茍璁恒傞毦閬揅++鐪熺殑瑕侀鍑哄巻鍙茶垶鍙頒簡錛?/p>

銆銆浠嶤++鐩墠鐨勬椿璺冪▼搴︼紝浠ュ強(qiáng)搴旂敤鐜扮姸鏉ヨ鏄畬鍏ㄨ兘澶熻偗瀹欳++浠嶇劧鏄蔣浠跺伐涓氱殑鍩虹錛屼篃涓嶄細(xì)閫鍑哄巻鍙茶垶鍙扮殑銆傚彟澶栦粠Boost錛孡oki榪欎簺搴撲腑鎴戜滑涔熻兘澶熺湅鍒癈++鐨勫彂灞曢潪甯告椿璺冿紝瀵逛簬鏂版妧鏈柊鎬濈淮闈炲父嬋榪涳紝C++浠嶇劧騫挎硾鍙楀埌鍏蟲敞銆備粠ACE鍦ㄩ珮鎬ц兘閫氫俊棰嗗煙鐨勫簲鐢紝浠ュ強(qiáng)MTL榪欐牱鐨勫簱鍦ㄦ暟鍊艱綆楅鍩熺殑鍑鴻壊琛ㄧ幇錛屾垜浠彲浠ョ湅鍒癈++鍦ㄩ珮鎬ц兘搴旂敤鍦哄悎涓嬬殑涓嶅彲鏇夸唬鐨勪綔鐢紝鑰屽祵鍏ュ紡緋葷粺榪欐牱鐨勫唴瀛樺彈闄愬紑鍙戝鉤鍙?br />錛屾瘮濡係ymbian OS涓婏紝C++宸茬粡鍙戞尌鐫騫朵笖灝嗗彂鎸ユ洿澶х殑浣滅敤銆傚彲浠ラ瑙佺殑鏄互鍚庣殑杞歡鏃犺涓婂眰鐨勫簲鐢ㄦ庝箞鍙橈紝瀹冪殑搴曞眰鏍稿績閮戒細(xì)鏄敱C/C++榪欐牱鐨勭郴緇熺駭杞歡緙栧啓鐨勶紝姣斿Java铏氭嫙鏈猴紝.NET Framwork銆傚洜涓哄彧鏈夎繖鏍風(fēng)殑緋葷粺綰ц蔣浠舵墠鑳藉畬鍏ㄥ交搴曠殑鍙戞尌鏈哄櫒鐨勫姛鑳姐?/p>

銆銆闇瑕佺湅鍒扮殑鏄袱涓秼鍔匡紝涓涓秼鍔挎槸C++鍙樺緱鏇村姞澶嶆潅錛屾洿鍔犲闄㈡淳錛岄氳繃妯℃澘絳夋湁娼滃姏鐨勮娉曞洜绱犳瀯閫犺秺鏉ヨ秺綺懼閥鐨勫簱鎴愪負(fù)浜嗙幇浠++鐨勭儹鐐癸紝铏界劧鍦ㄥ埄鐢ㄥ簱瀹炵幇鏂扮殑緙栫▼鑼冨紡錛屼箖鑷寵璁℃ā寮忕瓑鏂歸潰寰堟湁寮鍒涙剰涔夛紝涔熺‘瀹炰駭鐢熶簡涓浜涜兘澶熶究鎹峰紑鍙戠殑宸ュ叿錛屼絾鏄洿澶氱殑鏄妸C++鍙樺緱鏇村姞寮哄ぇ錛屾洿鍔犲鏉傦紝涔熸洿鍔犻毦鎳傦紝浼間箮涔熸洿鍔犲闄㈡淳錛屼笉寰椾笉璇村畠姝e湪鍚戣竟緙樺寲閬撹礬鍙戝睍銆傚彟涓涓秼鍔挎槸C++鍦ㄤ富嫻佺殑浼佷笟搴旂敤寮
鍙戜腑宸茬粡閫愭笎閫鍑轟簡錛孍RP榪欐牱鐨勪紒涓氳蔣浠跺紑鍙戜腑鍩烘湰涓婁笉浼?xì)鑰冭檻C++錛岄櫎闈為渶瑕佽冭檻鎬ц兘鎴栬呭拰閬楃暀浠g爜鐨勯泦鎴愯繖浜涘洜绱犮侰++閫瀹堝埌緋葷粺綰у埆璇█錛屾垚涓鴻蔣浠跺伐涓氱殑鍩虹鏄ぇ鍔挎墍瓚嬨傜劧鑰屽弽鎬濅竴涓嬶紝鐪熺殑鏄瀹堜箞錛熻嚜浠嶴TL鍑虹幇錛屾棤鏁扮殑浜洪璧蜂簯娑岀殑寮濮嬫敮鎸丆++,浠栦滑鐙傚懠鈥滄垜鐪嬪埌娣卞娑堝け浜嗭紝鐩爣杞歡宸ョ▼鐨勫嚭鐜般傛垜鐪嬪埌浜嗗彲緇存姢鐨勪唬鐮併傗濇槸鐨勶紝STL鍦ㄥ彲緇存姢鎬т笅鍋氬緱濡傛鍑鴻壊銆備絾鏄張鎬庢牱鍛紵STL涓篊++閾哄鉤浜嗙幇浠h蔣浠跺伐紼嬬殑閬撹礬錛岃屽湪涓婂眰搴旂敤紼嬪簭杞歡寮鍙戦鍩熻繖鍧楀満鍦版棭涓嶅崟鐙睘浜嶤++,寰堝紼嬪簭璁捐璇█閮藉仛寰楀緢鍑鴻壊錛岀柉鐙傜殑鏀寔鑰呬細(xì)姣笉鐘硅鮑鍦拌鎴戜滑搴斿綋鏀寔C++,鍥犱負(fù)瀹冩槸涓栫晫涓婃渶媯掔殑璇█銆傝屽潶鐜囧湴璇達(dá)紝浣犵殑鑵版潌鐪熺殑閭d箞紜箞錛熶篃璁稿彧鏄湪閫冮伩涓浜涗簨瀹炪侰++鏄紭縐鐨勶紝榪欎笉鍙惁璁わ紝STL鐨勫嚭鐜拌C++涓搴﹁蛋涓婁簡鏈杈夌厡鐨勬椂鍒伙紝鐒惰岀幇鍦ㄧ湅鏉モ︹︽垜鐨勪竴浣嶆仼甯堟浘璦錛氱湡姝h兘澶熷皢STL搴旂敤寰楁穻婕撳敖鑷寸殑浜哄緢
淇濆畧鍦拌鍥藉唴涔熶笉瓚呰繃200浜猴紝鎴栬涓嶅姞鍏TL鑳藉浣緾++鍚戠潃瀹冨簲褰撳彂灞曠殑鏂瑰悜鍙戝睍鐨勬洿濂斤紝鑰岀幇鍦ㄧ湅鏉ワ紝C++涔熷簲褰撳洖棣栧埌鐪熸灞炰簬浠栫殑閭d竴鐗囧湥鍦頒笂鈥︹?/p>

]]>
鐢╓insock瀹炵幇璇煶鍏ㄥ弻宸ラ氫俊浣跨敤http://m.shnenglu.com/eday/archive/2007/01/31/18209.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Wed, 31 Jan 2007 03:47:00 GMThttp://m.shnenglu.com/eday/archive/2007/01/31/18209.html
銆銆涓銆佸紩璦顎?br />
銆銆Windows 95浣滀負(fù)寰満鐨勬搷浣滅郴緇燂紝宸茬粡瀹屽叏铻嶅叆浜嗙綉緇滀笌閫氫俊鍔熻兘錛屼笉浠呭彲浠ュ緩绔嬬函Windows 95鐜涓嬬殑鈥滃絳夌綉緇溾濓紝鑰屼笖鏀寔澶氱鍗忚錛屽TCP/IP銆両PX/SPX銆丯ETBUI絳夈傚湪TCP/IP鍗忚緇勪腑錛孴PC鏄竴縐嶉潰鍚戣繛鎺ョ殑鍗忎箟錛屼負(fù)鐢ㄦ埛鎻愪緵鍙潬鐨勩佸叏鍙屽伐鐨勫瓧鑺傛祦鏈嶅姟錛屽叿鏈夌‘璁ゃ佹祦鎺у埗銆佸璺鐢ㄥ拰鍚屾絳夊姛鑳斤紝閫備簬鏁版嵁浼犺緭銆俇DP鍗忚鍒欐槸鏃犺繛鎺ョ殑錛屾瘡涓垎緇勯兘鎼哄甫瀹屾暣鐨勭洰鐨勫湴鍧錛屽悇鍒嗙粍鍦ㄧ郴緇熶腑鐙珛浼犻併傚畠涓嶈兘淇濊瘉鍒嗙粍鐨勫厛鍚庨『搴忥紝涓嶈繘琛屽垎緇勫嚭閿欑殑鎭㈠涓庨噸浼狅紝鍥犳涓嶄繚璇佷紶杈撶殑鍙潬鎬э紝浣嗘槸錛屽畠鎻愪緵楂樹紶杈撴晥鐜囩殑鏁版嵁鎶ユ湇鍔★紝閫備簬瀹炴椂鐨勮闊熾佸浘鍍忎紶杈撱佸箍鎾秷鎭瓑緗戠粶浼犺緭銆?br />
銆銆Winsock鎺ュ彛涓鴻繘紼嬮棿閫氫俊鎻愪緵浜嗕竴縐嶆柊鐨勬墜孌碉紝瀹冧笉浣嗚兘鐢ㄤ簬鍚屼竴鏈哄櫒涓殑榪涚▼涔嬮棿閫氫俊錛岃屼笖鏀寔緗戠粶閫氫俊鍔熻兘銆傞殢鐫Windows 95鐨勬帹鍑恒俉insock宸茬粡琚寮忛泦鎴愬埌浜哤indows緋葷粺涓紝鍚屾椂鍖呮嫭浜?6浣嶅拰32浣嶇殑緙栫▼鎺ュ彛銆傝學(xué)insock鐨勫紑鍙戝伐鍏蜂篃鍙互鍦˙orland C++4.0銆乂isual C++2.0榪欎簺C緙栬瘧鍣ㄤ腑鎵懼埌錛屼富瑕佺敱涓涓悕涓簑insock.h鐨勫ご鏂囦歡鍜屽姩鎬佽繛鎺ュ簱winsock.dll鎴杦sodk32.dll緇勬垚錛岃繖涓ょ鍔ㄦ佽繛鎺ュ簱鍒嗗埆鐢ㄤ簬Win16鍜學(xué)in32鐨勫簲鐢ㄧ▼搴忋傤?br />
銆銆鏈枃閽堝璇濋煶鐨勫叏鍙屽伐浼犺緭瑕佹眰錛岄噰鐢║DP鍗忚瀹炵幇浜嗗疄鏃剁綉緇滈氫俊銆備嬌鐢╒isualC++2.0緙栬瘧鐜錛屽叾鍔ㄦ佽繛鎺ュ簱鍚嶄負(fù)wsock32.dll銆傤?

銆浜屻佷富瑕佸嚱鏁扮殑浣跨敤瑕佺偣顎?/b>

銆銆閫氳繃寤虹珛鍙屽鎺ュ瓧錛屽彲浠ュ緢鏂逛究鍦板疄鐜板叏鍙屽伐緗戠粶閫氫俊銆傤?br />
銆銆1.濂楁帴瀛楀緩绔嬪嚱鏁幫細(xì)顎?br />

SOCKET socket(int family,int type,int protocol)顎?

銆銆瀵逛簬UDP鍗忚錛屽啓涓猴細(xì)顎?br />
SOCKRET s;顎?br />s=socket(AF_INET,SOCK_DGRAM,0);顎?br />鎴杝=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)顎?/td>

銆銆涓轟簡寤虹珛涓や釜濂楁帴瀛楋紝蹇呴』瀹炵幇鍦板潃鐨勯噸澶嶇粦瀹氾紝鍗籌紝褰撲竴涓鎺ュ瓧宸茬粡緇戝畾鍒版煇鏈湴鍦板潃鍚庯紝涓轟簡璁╁彟涓涓鎺ュ瓧閲嶅浣跨敤璇ュ湴鍧錛屽繀欏諱負(fù)璋冪敤bind()鍑芥暟緇戝畾絎簩涓鎺ュ瓧涔嬪墠錛岄氳繃鍑芥暟setsockopt()涓鴻濂楁帴瀛楄緗甋O_REUSEADDR濂楁帴瀛楅夐」銆傞氳繃鍑芥暟getsockopt()鍙幏寰楀鎺ュ瓧閫夐」璁劇疆鐘舵併傞渶瑕佹敞鎰忕殑鏄紝涓や釜濂楁帴瀛楁墍瀵瑰簲鐨勭鍙e彿涓嶈兘鐩稿悓銆傤勬澶栵紝榪樻秹鍙?qiáng)鍒板鎺ュ瓧缂撳啿鍖虹殑璁揪|棶棰橈紝鎸夎瀹氾紝姣忎釜鍖虹殑璁劇疆鑼冨洿鏄細(xì)涓嶅皬浜?12涓瓧鑺傦紝澶уぇ浜?k瀛楄妭錛屾牴鎹渶瑕侊紝鏂囦腑閫夌敤浜?k瀛楄妭銆傤?br />
銆銆2.濂楁帴瀛楃粦瀹氬嚱鏁邦?br />
int bind(SOCKET s,struct sockaddr_in*name,int namelen)顎?/td>

銆銆s鏄垰鎵嶅垱寤哄ソ鐨勫鎺ュ瓧錛宯ame鎸囧悜鎻忚堪閫氳瀵硅薄鐨勭粨鏋勪綋鐨勬寚閽堬紝namelen鏄緇撴瀯浣撶殑闀垮害銆傝緇撴瀯浣撲腑鐨勫垎閲忓寘鎷細(xì)IP鍦板潃(瀵瑰簲name.sin_addr.s_addr)銆佺鍙e彿(name.sin_port)銆佸湴鍧綾誨瀷(name.sin_family錛屼竴鑸兘璧嬫垚AF_INET錛岃〃紺烘槸internet鍦板潃)銆傤?br />
銆銆(1)IP鍦板潃鐨勫~鍐欐柟娉曪細(xì)鍦ㄥ叏鍙屽伐閫氫俊涓紝瑕佹妸鐢ㄦ埛鍚嶅搴旂殑鐐瑰垎琛ㄧず娉曞湴鍧杞崲鎴?2浣嶉暱鏁存暟鏍煎紡鐨処P鍦板潃錛屼嬌鐢╥net_addr()鍑芥暟銆傤?br />
銆銆(2)绔彛鍙鋒槸鐢ㄤ簬琛ㄧず鍚屼竴鍙拌綆楁満涓嶅悓鐨勮繘紼?搴旂敤紼嬪簭)錛屽叾鍒嗛厤鏂規(guī)硶鏈変袱縐嶏細(xì)1)榪涚▼鍙互璁╃郴緇熶負(fù)濂楁帴瀛楄嚜鍔ㄥ垎閰嶄竴绔彛鍙鳳紝鍙鍦ㄨ皟鐢╞ind鍓嶅皢绔彛鍙鋒寚瀹氫負(fù)0鍗沖彲銆傜敱緋葷粺鑷姩鍒嗛厤鐨勭鍙e彿浣嶄簬1024~5000涔嬮棿錛岃?~1023涔嬮棿鐨勪換涓TCP鎴朥DP绔彛閮芥槸淇濈暀鐨勶紝緋葷粺涓嶅厑璁鎬換涓榪涚▼浣跨敤淇濈暀绔彛錛岄櫎闈炲叾鏈夋晥鐢ㄦ埛ID鏄浂(瓚呯駭鐢ㄦ埛)銆傤?br />
銆銆2)榪涚▼鍙負(fù)濂楁帴瀛楁寚瀹氫竴鐗瑰畾绔彛銆傝繖瀵逛簬闇瑕佺粰濂楁帴瀛楀垎閰嶄竴浼楁墍绔彛鐨勬湇鍔″櫒鏄緢鏈夌敤鐨勩傛寚瀹氳寖鍥翠負(fù)1024鍜?5536涔嬮棿銆傚彲浠繪剰鎸囧畾銆傤?br />
銆銆鍦ㄦ湰紼嬪簭涓紝瀵逛袱涓鎺ュ瓧鐨勭鍙e彿瑙勫畾涓?000鍜?001錛屽墠鑰呭搴斿彂閫佸鎺ュ瓧錛屽悗鑰呭搴旀帴鏀跺鎺ュ瓧銆?br />
銆銆绔彛鍙瘋浠庝竴涓?6浣嶆棤絎﹀彿鏁?u_short綾誨瀷鏁?浠庝富鏈哄瓧鑺傞『搴忚漿鎹㈡垚緗戠粶瀛楄妭欏哄簭錛屼嬌鐢╤tons()鍑芥暟銆傤?br />
銆銆鏍規(guī)嵁浠ヤ笂涓や釜鍑芥暟錛屽彲浠ョ粰鍑哄弻濂楁帴瀛楀緩绔嬩笌緇戝畾鐨勭▼搴忕墖鏂?br />
//璁劇疆鏈夊叧鐨勫叏灞鍙橀噺顎?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;
}
{

銆銆3.鏁版嵁鍙戦佷笌鎺ユ敹鍑芥暟錛涱?br />
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)

銆銆鍏朵腑錛屽弬鏁癴lags涓鑸彇0銆傤?br />
銆銆recvfrom()鍑芥暟瀹為檯涓婃槸璇誨彇sendto()鍑芥暟鍙戣繃鏉ョ殑涓涓暟鎹寘錛屽綋璇誨埌鐨勬暟鎹瓧鑺傚皯浜庤瀹氭帴鏀剁殑鏁扮洰鏃訛紝灝辨妸鏁版嵁鍏ㄩ儴鎺ユ敹錛屽茍榪斿洖瀹為檯鎺ユ敹鍒扮殑瀛楄妭鏁幫紱褰撹鍒扮殑鏁版嵁澶氫簬瑙勫畾鍊兼椂錛屽湪鏁版嵁鎶ユ枃鏂瑰紡涓嬶紝澶氫綑鐨勬暟鎹皢琚涪寮冦傝屽湪嫻佹柟寮忎笅錛屽墿浣欑殑鏁版嵁鐢變笅recvfrom()璇誨嚭銆備負(fù)浜嗗彂閫佸拰鎺ユ敹鏁版嵁錛屽繀欏誨緩绔嬫暟鎹彂閫佺紦鍐插尯鍜屾暟鎹帴鏀剁紦鍐插尯銆傝瀹氾細(xì)IP灞傜殑涓涓暟鎹姤鏈澶т笉瓚呰繃64K(鍚暟鎹姤澶?銆傚綋緙撳啿鍖鴻緗緱榪囧銆佽繃澶ф椂錛屽父鍥犲唴瀛樹笉澶熻屽鑷村鎺ュ瓧寤虹珛澶辮觸銆傚湪鍑忓皬緙撳啿鍖哄悗錛岃閿欒娑堝け銆傜粡榪囧疄楠岋紝鏂囦腑閫夌敤浜?K瀛楄妭銆傤?br />
銆銆姝ゅ錛岃繕搴旀敞鎰忚繖涓や釜鍑芥暟涓渶鍚庡弬鏁扮殑鍐欐硶錛岀粰sendto()鐨勬渶鍚庡弬鏁版槸涓涓暣鏁板鹼紝鑰宺ecvfrom()鐨勫垯鏄寚鍚戜竴鏁存暟鍊肩殑鎸囬拡銆傤?br />
銆銆4.濂楁帴瀛楀叧闂嚱鏁幫細(xì)closesocket(SOCKET s)顎?br />
銆銆閫氳緇撴潫鏃訛紝搴斿叧闂寚瀹氱殑濂楁帴瀛楋紝浠ラ噴涓庝箣鐩稿叧鐨勮祫婧愩傤?br />
銆銆鍦ㄥ叧闂鎺ュ瓧鏃訛紝搴斿厛瀵歸攣瀹氱殑鍚勭緙撳啿鍖哄姞浠ラ噴鏀俱傚叾紼嬪簭鐗囨柇涓猴細(xì)顎?br />
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>

銆銆涓夈乄insock鐨勭紪紼嬬壒鐐逛笌寮傛閫夋嫨鏈哄埗顎?/b>

銆銆1 闃誨鍙?qiáng)鍏跺鐞嗘柟寮忣?br />
銆銆鍦ㄧ綉緇滈氳涓紝鐢變簬緗戠粶鎷ユ尋鎴栦竴嬈″彂閫佺殑鏁版嵁閲忚繃澶х瓑鍘熷洜錛岀粡甯鎬細(xì)鍙戠敓浜ゆ崲鐨勬暟鎹湪鐭椂闂村唴涓嶈兘浼犻佸畬錛屾敹鍙戞暟鎹殑鍑芥暟鍥犳涓嶈兘榪斿洖錛岃繖縐嶇幇璞″彨鍋氶樆濉炪俉insock瀵規(guī)湁鍙兘闃誨鐨勫嚱鏁版彁渚涗簡涓ょ澶勭悊鏂瑰紡錛氶樆濉炲拰闈為樆濉炴柟寮忋傚湪闃誨鏂瑰紡涓嬶紝鏀跺彂鏁版嵁鐨勫嚱鏁板湪琚皟鐢ㄥ悗涓鐩磋鍒頒紶閫佸畬姣曟垨鑰呭嚭閿欐墠鑳借繑鍥炪傚湪闃誨鏈熼棿錛岃闃葷殑鍑芥暟涓嶄細(xì)鏂皟鐢ㄧ郴緇熷嚱鏁癎etMessage()鏉ヤ繚鎸佹秷鎭驚鐜殑姝e父榪涜銆傚浜庨潪闃誨鏂瑰紡錛屽嚱鏁拌璋冪敤鍚庣珛鍗寵繑鍥烇紝褰撲紶閫佸畬鎴愬悗鐢盬insock緇欑▼搴忓彂涓涓簨鍏堢害瀹氬ソ鐨勬秷鎭傤?br />
銆銆鍦ㄧ紪紼嬫椂錛屽簲灝介噺浣跨敤闈為樆濉炴柟寮忋傚洜涓哄湪闃誨鏂瑰紡涓嬶紝鐢ㄦ埛鍙兘浼?xì)闀挎棄櫁寸殑绛夊緟杩嚱E嬩腑璇曞浘鍏抽棴紼嬪簭錛屽洜涓烘秷鎭驚鐜繕鍦ㄨ搗浣滅敤錛屾墍浠ョ▼搴忕殑紿楀彛鍙兘琚叧闂紝榪欐牱褰撳嚱鏁頒粠Winsock鐨勫姩鎬佽繛鎺ュ簱涓繑鍥炴椂錛屼富紼嬪簭宸茬粡浠庡唴瀛樹腑鍒犻櫎錛岃繖鏄劇劧鏄瀬鍏跺嵄闄╃殑銆傤?br />
銆銆2 寮傛閫夋嫨鍑芥暟WSAAsyncSelect()鐨勪嬌鐢?br />
銆銆Winsock閫氳繃WSAAsyncSelect()鑷姩鍦拌緗鎺ュ瓧澶勪簬闈為樆濉炴柟寮忋備嬌鐢╓indowsSockets瀹炵幇Windows緗戠粶紼嬪簭璁捐鐨勫叧閿氨鏄畠鎻愪緵浜嗗緗戠粶浜嬩歡鍩轟簬娑堟伅鐨勫紓姝ュ瓨鍙栵紝鐢ㄤ簬娉ㄥ唽搴旂敤紼嬪簭鎰熷叴瓚g殑緗戠粶浜嬩歡銆傚畠璇鋒眰Windows Sockets DLL鍦ㄦ嫻嬪埌濂楁帴瀛椾笂鍙戠敓鐨勭綉緇滀簨浠舵椂錛屽悜紿楀彛鍙戦佷竴涓秷鎭傚UDP鍗忚錛岃繖浜涚綉緇滀簨浠朵富瑕佷負(fù)錛氼?br />
銆銆FD_READ 鏈熸湜鍦ㄥ鎺ュ瓧鏀跺埌鏁版嵁(鍗寵鍑嗗濂?鏃舵帴鏀墮氱煡錛涱?br />
銆銆FD_WRITE 鏈熸湜鍦ㄥ鎺ュ瓧鍙彂閫佹暟(鍗沖啓鍑嗗濂?鏃舵帴鏀墮氱煡錛涱?br />
銆銆FD_CLOSE 鏈熸湜鍦ㄥ鎺ュ瓧鍏抽棴鏃舵帴鐢?shù)閫氱煡顎?br />
銆銆娑堟伅鍙橀噺wParam鎸囩ず鍙戠敓緗戠粶浜嬩歡鐨勫鎺ュ瓧錛屽彉閲?Param鐨勪綆瀛楄妭鎻忚堪鍙戠敓鐨勭綉緇滀簨浠訛紝楂樺瓧鍖呭惈閿欒鐮併傚鍦ㄧ獥鍙e嚱鏁扮殑娑堟伅寰幆涓潎鍔犱竴涓垎鏀細(xì)顎?br />
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>

銆銆鍦ㄧ▼搴忕殑緙栧埗涓紝搴旀牴鎹渶瑕佺伒媧誨湴灝哤SAAsyncSelect()鍑界伒鏁忔斁鍦ㄧ浉搴旂殑娑堟伅寰幆涔嬩腑錛屽叾瀹冭鏄庡彲鍙傝鏂囩尞[1]銆傛澶栵紝搴旇鎸囧嚭鐨勬槸錛屼互涓婄▼搴忕墖鏂腑鐨勬秷鎭涓昏鏄負(fù)紼嬪簭璋冭瘯鏂逛究鑰岃緗殑錛岃屽湪姝e紡浜у搧涓笉鍐嶅嚭鐜般傚悓鏃訛紝鎸夌収紼嬪簭瀹歸敊璇璁★紝搴斿緩绔嬩竴涓笓闂ㄧ殑瀹歸敊澶勭悊鍑芥暟銆傜▼搴忎腑鍙兘鍑虹幇鐨勫悇縐嶉敊璇兘灝嗙敱璇ュ嚱鏁拌繘琛屽鐞嗭紝渚濇嵁閿欒鐨勫嵄瀹崇▼搴︿笉鍚岋紝寤虹珛鍑犵涓嶅悓鐨勫鐞嗘帾鏂姐傝繖鏍鳳紝鎵嶈兘淇濊瘉鍙屾柟閫氳瘽鐨勯『鍒╁拰鍙潬銆傤?br />
銆鍥涖佺粨璁侯?/b>

銆銆鏈枃鏄濯掍綋緗戠粶浼犺緭欏圭洰鐨勯噸瑕佸唴瀹逛箣涓錛岀洰鍓嶏紝緇撳悎紜歡鍏ㄥ弻宸ヨ闊沖崱絳夎澶囷紝宸茬粡鎴愬姛鍦板疄鐜頒簡璇濋煶鐨勫叏鍙屽伐鐨勯氫俊銆傛湁鍏蟲暣涓濯掍綋浼犺緭緋葷粺璁捐鐨勫唴瀹癸紝灝嗘湁鍙︽枃鍙欒堪銆?



]]>
鐢╒C++6.0鐨凷ockets API瀹炵幇涓涓亰澶╁紼嬪簭http://m.shnenglu.com/eday/archive/2007/01/31/18207.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Wed, 31 Jan 2007 03:34:00 GMThttp://m.shnenglu.com/eday/archive/2007/01/31/18207.html1.VC++緗戠粶緙栫▼鍙?qiáng)Windows Sockets API綆浠?/font>

銆銆VC++瀵圭綉緇滅紪紼嬬殑鏀寔鏈塻ocket鏀寔錛學(xué)inInet鏀寔錛孧API鍜孖SAPI鏀寔絳夈傚叾涓紝W(xué)indows Sockets API鏄疶CP/IP緗戠粶鐜閲岋紝涔熸槸Internet涓婅繘琛屽紑鍙戞渶涓洪氱敤鐨凙PI銆傛渶鏃╃編鍥藉姞宸炲ぇ瀛erkeley鍒嗘牎鍦║NIX涓嬩負(fù)TCP/IP鍗忚寮鍙戜簡涓涓狝PI錛岃繖涓狝PI灝辨槸钁楀悕鐨凚erkeley Socket鎺ュ彛(濂楁帴瀛?銆傚湪妗岄潰鎿嶄綔緋葷粺榪涘叆Windows鏃朵唬鍚庯紝浠嶇劧緇ф壙浜哠ocket鏂規(guī)硶銆傚湪TCP/IP緗戠粶閫氫俊鐜涓嬶紝Socket鏁版嵁浼犺緭鏄竴縐嶇壒孌婄殑I/O錛屽畠涔熺浉褰撲簬涓縐嶆枃浠舵弿榪扮錛屽叿鏈変竴涓被浼間簬鎵撳紑鏂囦歡鐨勫嚱鏁拌皟鐢?socket()銆傚彲浠ヨ繖鏍風(fēng)悊瑙o細(xì)Socket瀹為檯涓婃槸涓涓氫俊绔偣錛岄氳繃瀹冿紝鐢ㄦ埛鐨凷ocket紼嬪簭鍙互閫氳繃緗戠粶鍜屽叾浠栫殑Socket搴旂敤紼嬪簭閫氫俊銆係ocket瀛樺湪浜庝竴涓?閫氫俊鍩?(涓烘弿榪頒竴鑸殑綰跨▼濡備綍閫氳繃Socket榪涜閫氫俊鑰屽紩鍏ョ殑涓縐嶆娊璞℃蹇?閲岋紝騫朵笖涓庡彟涓涓煙鐨凷ocket浜ゆ崲鏁版嵁銆係ocket鏈変笁綾匯傜涓縐嶆槸SOCK_STREAM(嫻佸紡)錛屾彁渚涢潰鍚戣繛鎺ョ殑鍙潬鐨勯氫俊鏈嶅姟錛屾瘮濡倀elnet,http銆傜浜岀鏄疭OCK_DGRAM(鏁版嵁鎶?錛屾彁渚涙棤榪炴帴涓嶅彲闈犵殑閫氫俊錛屾瘮濡俇DP銆傜涓夌鏄疭OCK_RAW(鍘熷)錛屼富瑕佺敤浜庡崗璁殑寮鍙戝拰嫻嬭瘯錛屾敮鎸侀氫俊搴曞眰鎿嶄綔錛屾瘮濡傚IP鍜孖CMP鐨勭洿鎺ヨ闂?br />
銆銆2.Windows Socket鏈哄埗鍒嗘瀽

銆銆2.1涓浜涘熀鏈殑Socket緋葷粺璋冪敤

銆銆涓昏鐨勭郴緇熻皟鐢ㄥ寘鎷細(xì)socket()-鍒涘緩Socket錛沚ind()-灝嗗垱寤虹殑Socket涓庢湰鍦扮鍙g粦瀹氾紱connect()涓巃ccept()-寤虹珛Socket榪炴帴錛沴isten()-鏈嶅姟鍣ㄧ洃鍚槸鍚︽湁榪炴帴璇鋒眰錛泂end()-鏁版嵁鐨勫彲鎺х紦鍐插彂閫侊紱recv()-鍙帶緙撳啿鎺ユ敹錛沜losesocket()-鍏抽棴Socket銆?br />
銆銆2.2Windows Socket鐨勫惎鍔ㄤ笌緇堟

銆銆鍚姩鍑芥暟WSAStartup()寤虹珛涓嶹indows Sockets DLL鐨勮繛鎺ワ紝緇堟鍑芥暟WSAClearup()緇堟浣跨敤璇LL錛岃繖涓や釜鍑芥暟蹇呴』鎴愬浣跨敤銆?br />
銆銆2.3寮傛閫夋嫨鏈哄埗

銆銆Windows鏄竴涓潪鎶㈠崰寮忕殑鎿嶄綔緋葷粺錛岃屼笉閲囧彇UNIX鐨勯樆濉炴満鍒躲傚綋涓涓氫俊浜嬩歡浜х敓鏃訛紝鎿嶄綔緋葷粺瑕佹牴鎹緗夋嫨鏄惁瀵硅浜嬩歡鍔犱互澶勭悊錛學(xué)SAAsyncSelect()鍑芥暟灝辨槸鐢ㄦ潵閫夋嫨緋葷粺鎵瑕佸鐞嗙殑鐩稿簲浜嬩歡銆傚綋Socket鏀跺埌璁懼畾鐨勭綉緇滀簨浠朵腑鐨勪竴涓椂錛屼細(xì)緇欑▼搴忕獥鍙d竴涓秷鎭紝榪欎釜娑堟伅閲屼細(xì)鎸囧畾浜х敓緗戠粶浜嬩歡鐨凷ocket錛屽彂鐢熺殑浜嬩歡綾誨瀷鍜岄敊璇爜銆?br />
銆銆2.4寮傛鏁版嵁浼犺緭鏈哄埗

銆銆WSAAsyncSelect()璁懼畾浜哠ocket涓婄殑欏誨搷搴旈氫俊浜嬩歡鍚庯紝姣忓彂鐢熶竴涓繖鏍風(fēng)殑浜嬩歡灝變細(xì)浜х敓涓涓猈M_SOCKET娑堟伅浼犵粰紿楀彛銆傝屽湪紿楀彛鐨勫洖璋冨嚱鏁頒腑灝卞簲璇ユ坊鍔犵浉搴旂殑鏁版嵁浼犺緭澶勭悊浠g爜銆?br />
銆銆3.鑱婂ぉ瀹ょ▼搴忕殑璁捐璇存槑

銆銆3.1瀹炵幇鎬濇兂

銆銆鍦↖nternet涓婄殑鑱婂ぉ瀹ょ▼搴忎竴鑸兘鏄互鏈嶅姟鍣ㄦ彁渚涙湇鍔$榪炴帴鍝嶅簲錛屼嬌鐢ㄨ呴氳繃瀹㈡埛绔▼搴忕櫥褰曞埌鏈嶅姟鍣紝灝卞彲浠ヤ笌鐧誨綍鍦ㄥ悓涓鏈嶅姟鍣ㄤ笂鐨勭敤鎴蜂氦璋堬紝榪欐槸涓涓潰鍚戣繛鎺ョ殑閫氫俊榪囩▼銆傚洜姝わ紝紼嬪簭瑕佸湪TCP/IP鐜涓嬶紝瀹炵幇鏈嶅姟鍣ㄧ鍜屽鎴風(fēng)涓ら儴鍒嗙▼搴忋?br />
銆銆3.2鏈嶅姟鍣ㄧ宸ヤ綔嫻佺▼

銆銆鏈嶅姟鍣ㄧ閫氳繃socket()緋葷粺璋冪敤鍒涘緩涓涓猄ocket鏁扮粍鍚?鍗寵瀹氫簡鎺ュ彈榪炴帴瀹㈡埛鐨勬渶澶ф暟鐩?錛屼笌鎸囧畾鐨勬湰鍦扮鍙g粦瀹歜ind()錛屽氨鍙互鍦ㄧ鍙h繘琛屼睛鍚琹isten()銆傚鏋滄湁瀹㈡埛绔繛鎺ヨ姹傦紝鍒欏湪鏁扮粍涓夋嫨涓涓┖Socket錛屽皢瀹㈡埛绔湴鍧璧嬬粰榪欎釜Socket銆傜劧鍚庣櫥褰曟垚鍔熺殑瀹㈡埛灝卞彲浠ュ湪鏈嶅姟鍣ㄤ笂鑱婂ぉ浜嗐?br />
銆銆3.3瀹㈡埛绔伐浣滄祦紼?br />
銆銆瀹㈡埛绔▼搴忕浉瀵圭畝鍗曪紝鍙渶瑕佸緩绔嬩竴涓猄ocket涓庢湇鍔″櫒绔繛鎺ワ紝鎴愬姛鍚庨氳繃榪欎釜Socket鏉ュ彂閫佸拰鎺ユ敹鏁版嵁灝卞彲浠ヤ簡銆?br />
銆銆4.鏍稿績浠g爜鍒嗘瀽

銆銆闄愪簬綃囧箙錛岃繖閲屼粎緇欏嚭涓庣綉緇滅紪紼嬬浉鍏崇殑鏍稿績浠g爜錛屽叾浠栫殑璇稿鑱婂ぉ鏂囧瓧鐨勬湇鍔″櫒鍜屽鎴風(fēng)鏄劇ず璇昏呭彲浠ヨ嚜琛屾坊鍔犮?br />
銆銆4.1鏈嶅姟鍣ㄧ浠g爜

銆銆寮鍚湇鍔″櫒鍔熻兘:

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錛岀被鍨嬩負(fù)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 />銆銆銆// 浜х敓鐩稿簲浼犻掔粰紿楀彛鐨勬秷鎭負(fù)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;
}

銆銆鍝嶅簲瀹㈡埛鍙戦佽亰澶╂枃瀛楀埌鏈嶅姟鍣細(xì)ON_MESSAGE(WM_CLIENT_READ, OnClientRead)

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);
}

銆銆瀵逛簬瀹㈡埛鏂紑榪炴帴錛屼細(xì)浜х敓涓涓狥D_CLOSE娑堟伅錛屽彧欏葷浉搴斿湴鐢╟losesocket()鍏抽棴鐩稿簲鐨凷ocket鍗沖彲錛岃繖涓鐞嗘瘮杈冪畝鍗曘?br />
銆銆4.2瀹㈡埛绔唬鐮?br />
銆銆榪炴帴鍒版湇鍔″櫒錛?br />
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璁懼畾澶辮觸!");
}

銆銆鎺ユ敹鏈嶅姟鍣ㄧ鍙戦佺殑瀛楃涔熶嬌鐢ㄥ彲鎺х紦鍐叉帴鏀跺嚱鏁皉ecv()錛屽鎴風(fēng)鑱婂ぉ鐨勫瓧絎﹀彂閫佷嬌鐢ㄦ暟鎹彲鎺х紦鍐插彂閫佸嚱鏁皊end()錛岃繖涓や釜榪囩▼姣旇緝綆鍗曪紝鍦ㄦ灝變笉鍔犺禈榪頒簡銆?br />
銆銆5.灝忕粨

銆銆閫氳繃鑱婂ぉ瀹ょ▼搴忕殑緙栧啓錛屽彲浠ュ熀鏈簡瑙indows Sockets API緙栫▼鐨勫熀鏈繃紼嬪拰綺捐涔嬪銆傛湰紼嬪簭鍦╒C++6.0涓嬬紪璇戦氳繃錛屽湪浣跨敤windows 98/NT鐨勫眬鍩熺綉閲岃繍琛岃壇濂姐?br />


]]>
Windows Sockets API瀹炵幇緗戠粶寮傛閫氳http://m.shnenglu.com/eday/archive/2007/01/31/18206.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Wed, 31 Jan 2007 03:32:00 GMThttp://m.shnenglu.com/eday/archive/2007/01/31/18206.html鎽樿錛?/strong>鏈枃瀵瑰浣曚嬌鐢ㄩ潰鍚戣繛鎺ョ殑嫻佸紡濂楁帴瀛楀疄鐜板緗戝崱鐨勭紪紼嬩互鍙?qiáng)濡備綍瀹炵幇寮傛缃懢l滈氳絳夐棶棰樿繘琛屼簡璁ㄨ涓庨槓榪般?

銆銆涓銆?寮曡█

銆銆鍦?0騫翠唬鍒濓紝緹庡浗鍔犲埄紱忓凹浜氬ぇ瀛︿集鍏嬪埄鍒嗘牎鐨勭爺絀朵漢鍛樹負(fù)TCP/IP緗戠粶閫氫俊寮鍙戜簡涓涓笓闂ㄧ敤浜庣綉緇滈氳寮鍙戠殑API銆傝繖涓狝PI灝辨槸Socket鎺ュ彛錛堝鎺ュ瓧錛?-褰撲粖鍦═CP/IP緗戠粶鏈涓洪氱敤鐨勪竴縐岮PI錛屼篃鏄湪浜掕仈緗戜笂榪涜搴旂敤寮鍙戞渶涓洪氱敤鐨勪竴縐岮PI銆傚湪寰蔣鑱斿悎鍏跺畠鍑犲鍏徃鍏卞悓鍒跺畾浜嗕竴濂梂indows涓嬬殑緗戠粶緙栫▼鎺ュ彛Windows Sockets瑙勮寖鍚庯紝鐢變簬鍦ㄥ叾瑙勮寖涓紩鍏ヤ簡涓浜涘紓姝ュ嚱鏁幫紝澧炲姞浜嗗緗戠粶浜嬩歡寮傛閫夋嫨鏈哄埗錛屽洜姝ゆ洿鍔犵鍚圵indows鐨勬秷鎭┍鍔ㄧ壒鎬э紝浣跨綉緇滃紑鍙戜漢鍛樺彲浠ユ洿鍔犳柟渚跨殑榪涜楂樻ц兘緗戠粶閫氳紼嬪簭鐨勮璁°傛湰鏂囨帴涓嬫潵灝遍拡瀵筗indows Sockets API榪涜闈㈠悜榪炴帴鐨勬祦寮忓鎺ュ瓧緙栫▼浠ュ強(qiáng)瀵瑰紓姝ョ綉緇滈氳鐨勭紪紼嬪疄鐜扮瓑闂灞曞紑璁ㄨ銆?br />
銆銆浜屻?闈㈠悜榪炴帴鐨勬祦寮忓鎺ュ瓧緙栫▼妯″瀷鐨勮璁?/b>

銆銆鏈枃鍦ㄦ柟妗堥夋嫨涓婇噰鐢ㄤ簡鍦ㄧ綉緇滅紪紼嬩腑鏈甯哥敤鐨勪竴縐嶆ā鍨?-瀹㈡埛鏈?鏈嶅姟鍣ㄦā鍨嬨傝繖縐嶅鎴?鏈嶅姟鍣ㄦā鍨嬫槸涓縐嶉潪瀵圭О寮忕紪紼嬫ā寮忋傝妯″紡鐨勫熀鏈濇兂鏄妸闆嗕腑鍦ㄤ竴璧風(fēng)殑搴旂敤鍒掑垎鎴愪負(fù)鍔熻兘涓嶅悓鐨勪袱涓儴鍒嗭紝鍒嗗埆鍦ㄤ笉鍚岀殑璁$畻鏈轟笂榪愯錛岄氳繃瀹冧滑涔嬮棿鐨勫垎宸ュ悎浣滄潵瀹炵幇涓涓畬鏁寸殑鍔熻兘銆傚浜庤繖縐嶆ā寮忚岃█鍏朵腑涓閮ㄥ垎闇瑕佷綔涓烘湇鍔″櫒錛岀敤鏉ュ搷搴斿茍涓哄鎴鋒彁渚涘浐瀹氱殑鏈嶅姟錛涘彟涓閮ㄥ垎鍒欎綔涓哄鎴鋒満紼嬪簭鐢ㄦ潵鍚戞湇鍔″櫒鎻愬嚭璇鋒眰鎴栬姹傛煇縐嶆湇鍔°?br />
銆銆鏈枃閫夊彇浜嗗熀浜嶵CP/IP鐨勫鎴鋒満/鏈嶅姟鍣ㄦā鍨嬪拰闈㈠悜榪炴帴鐨勬祦寮忓鎺ュ瓧銆傚叾閫氫俊鍘熺悊涓猴細(xì)鏈嶅姟鍣ㄧ鍜屽鎴風(fēng)閮藉繀欏誨緩绔嬮氫俊濂楁帴瀛楋紝鑰屼笖鏈嶅姟鍣ㄧ搴斿厛榪涘叆鐩戝惉鐘舵侊紝鐒跺悗瀹㈡埛绔鎺ュ瓧鍙戝嚭榪炴帴璇鋒眰錛屾湇鍔″櫒绔敹鍒拌姹傚悗錛屽緩绔嬪彟涓涓鎺ュ瓧榪涜閫氫俊錛屽師鏉ヨ礋璐g洃鍚殑濂楁帴瀛椾粛榪涜鐩戝惉錛屽鏋滄湁鍏跺畠瀹㈡埛鍙戞潵榪炴帴璇鋒眰錛屽垯鍐嶅緩绔嬩竴涓鎺ュ瓧銆傞粯璁ょ姸鎬佷笅鏈澶氬彲鍚屾椂鎺ユ敹5涓鎴風(fēng)殑榪炴帴璇鋒眰錛屽茍涓庝箣寤虹珛閫氫俊鍏崇郴銆傚洜姝ゆ湰紼嬪簭鐨勮璁℃祦紼嬪簲褰撶敱鏈嶅姟鍣ㄩ鍏堝惎鍔紝鐒跺悗鍦ㄦ煇涓鏃跺埢鍚姩瀹㈡埛鏈哄茍浣垮叾涓庢湇鍔″櫒寤虹珛榪炴帴銆傛湇鍔″櫒涓庡鎴鋒満寮濮嬮兘蹇呴』璋冪敤Windows Sockets API鍑芥暟socket()寤虹珛涓涓鎺ュ瓧sockets,鐒跺悗鏈嶅姟鍣ㄦ柟璋冪敤bind()灝嗗鎺ュ瓧涓庝竴涓湰鍦扮綉緇滃湴鍧鎹嗘墡鍦ㄤ竴璧鳳紝鍐嶈皟鐢╨isten()浣垮鎺ュ瓧澶勪簬涓縐嶈鍔ㄧ殑鍑嗗鎺ユ敹鐘舵侊紝鍚屾椂瑙勫畾瀹冪殑璇鋒眰闃熷垪闀垮害銆傚湪姝や箣鍚庢湇鍔″櫒灝卞彲浠ラ氳繃璋冪敤accept()鏉ユ帴鏀跺鎴鋒満鐨勮繛鎺ャ?br />
銆銆鐩稿浜庢湇鍔″櫒錛屽鎴風(fēng)鐨勫伐浣滃氨鏄懼緱姣旇緝綆鍗曚簡錛屽綋瀹㈡埛绔墦寮濂楁帴瀛椾箣鍚庯紝渚垮彲閫氳繃璋冪敤connect()鍜屾湇鍔″櫒寤虹珛榪炴帴銆傝繛鎺ュ緩绔嬩箣鍚庯紝瀹㈡埛鍜屾湇鍔″櫒涔嬮棿灝卞彲浠ラ氳繃榪炴帴鍙戦佸拰鎺ユ敹璧勬枡銆傛渶鍚庤祫鏂欎紶閫佺粨鏉燂紝鍙屾柟璋冪敤closesocket()鍏抽棴濂楁帴瀛楁潵緇撴潫榪欐閫氳銆傛暣涓氳榪囩▼鐨勫叿浣撴祦紼嬫鍥懼彲澶ц嚧鐢ㄤ笅闈㈢殑嫻佺▼鍥炬潵琛ㄧず錛?br />

銆銆銆銆銆銆銆銆闈㈠悜榪炴帴鐨勬祦寮忓鎺ュ瓧緙栫▼嫻佺▼紺烘剰鍥?

涓夈?杞歡璁捐瑕佺偣浠ュ強(qiáng)寮傛閫氳鐨勫疄鐜?br />
銆銆鏍規(guī)嵁鍓嶉潰璁捐鐨勭▼搴忔祦紼嬶紝鍙皢紼嬪簭鍒掑垎涓轟袱閮ㄥ垎錛氭湇鍔″櫒绔拰瀹㈡埛绔傝屼笖鏁翠釜瀹炵幇榪囩▼鍙互澶ц嚧鐢ㄤ互涓嬪嚑涓潪甯稿叧閿殑Windows Sockets API鍑芥暟灝嗗叾鎯┛涓嬫潵錛?br />
銆銆鏈嶅姟鍣ㄦ柟錛?br />
socket()->bind()->listen->accept()->recv()/send()->closesocket()

銆銆瀹㈡埛鏈烘柟錛?br />
socket()->connect()->send()/recv()->closesocket()

銆銆鏈夐壌浜庝互涓婂嚑涓嚱鏁板湪鏁翠釜緗戠粶緙栫▼涓殑閲嶈鎬э紝鏈夊繀瑕佺粨鍚堢▼搴忓疄渚嬪鍏跺仛杈冩繁鍏ョ殑鍓栨瀽銆傛湇鍔″櫒绔簲鐢ㄧ▼搴忓湪浣跨敤濂楁帴瀛椾箣鍓嶏紝棣栧厛蹇呴』鎷ユ湁涓涓猄ocket錛岀郴緇熻皟鐢╯ocket()鍑芥暟鍚戝簲鐢ㄧ▼搴忔彁渚涘垱寤哄鎺ュ瓧鐨勬墜孌點傝濂楁帴瀛楀疄闄呬笂鏄湪璁$畻鏈轟腑鎻愪緵浜嗕竴涓氫俊鍩狅紝鍙互閫氳繃榪欎釜鍩犱笌浠諱綍涓涓叿鏈夊鎺ュ瓧鎺ュ彛鐨勮綆楁満閫氫俊銆傚簲鐢ㄧ▼搴忓湪緗戠粶涓婁紶杈撱佹帴鏀剁殑淇℃伅閮介氳繃榪欎釜濂楁帴瀛楁帴鍙f潵瀹炵幇鐨勩傚湪搴旂敤寮鍙戜腑濡傚悓浣跨敤鏂囦歡鍙ユ焺涓鏍鳳紝鍙互瀵瑰鎺ュ瓧鍙ユ焺榪涜璇誨啓鎿嶄綔錛?br />
sock=socket(AF_INET,SOCK_STREAM,0);

銆銆鍑芥暟鐨勭涓涓弬鏁扮敤浜庢寚瀹氬湴鍧鏃忥紝鍦╓indows涓嬩粎鏀寔AF_INET(TCP/IP鍦板潃)錛涚浜屼釜鍙傛暟鐢ㄤ簬鎻忚堪濂楁帴瀛楃殑綾誨瀷錛屽浜庢祦寮忓鎺ュ瓧鎻愪緵鏈塖OCK_STREAM錛涙渶鍚庝竴涓弬鏁版寚瀹氬鎺ュ瓧浣跨敤鐨勫崗璁紝涓鑸負(fù)0銆傝鍑芥暟鐨勮繑鍥炲間繚瀛樹簡鏂板鎺ュ瓧鐨勫彞鏌勶紝鍦ㄧ▼搴忛鍑哄墠鍙互鐢?closesocket(sock);鍑芥暟鏉ュ皢鍏墮噴鏀俱傛湇鍔″櫒鏂逛竴鏃﹁幏鍙栦簡涓涓柊鐨勫鎺ュ瓧鍚庡簲閫氳繃bind()灝嗚濂楁帴瀛椾笌鏈満涓婄殑涓涓鍙g浉鍏寵仈錛?br />
sockin.sin_family=AF_INET;
sockin.sin_addr.s_addr=0;
sockin.sin_port=htons(USERPORT);
bind(sock,(LPSOCKADDR)&sockin,sizeof(sockin)));

銆銆璇ュ嚱鏁扮殑絎簩涓弬鏁版槸涓涓寚鍚戝寘鍚湁鏈満IP鍦板潃鍜岀鍙d俊鎭殑sockaddr_in緇撴瀯綾誨瀷鐨勬寚閽堬紝鍏舵垚鍛樻弿榪頒簡鏈湴绔彛鍙峰拰鏈湴涓繪満鍦板潃錛岀粡榪嘼ind()灝嗘湇鍔″櫒榪涚▼鍦ㄧ綉緇滀笂鏍囪瘑鍑烘潵銆傞渶瑕佹敞鎰忕殑鏄敱浜?024浠ュ唴鐨勫煚鍙烽兘鏄繚鐣欑殑鍩犲彿鍥犳濡傛棤鐗瑰埆闇瑕佷竴鑸笉鑳藉皢sockin.sin_port鐨勫煚鍙瘋緗負(fù)1024浠ュ唴鐨勫箋傜劧鍚庤皟鐢╨isten()鍑芥暟寮濮嬩睛鍚紝鍐嶉氳繃accept()璋冪敤絳夊緟鎺ユ敹榪炴帴浠ュ畬鎴愯繛鎺ョ殑寤虹珛錛?br />
//榪炴帴璇鋒眰闃熷垪闀垮害涓?錛屽嵆鍙厑璁告湁涓涓姹?鑻ユ湁澶氫釜璇鋒眰,
//鍒欏嚭鐜伴敊璇紝緇欏嚭閿欒浠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;
}

銆銆榪欓噷涔嬫墍浠ユ妸accept()鏀懼埌涓涓嚎紼嬩腑鍘繪槸鍥犱負(fù)鍦ㄦ墽琛屽埌璇ュ嚱鏁版椂濡傛病鏈夊鎴瘋繛鎺ユ湇鍔″櫒鐨勮姹傚埌鏉ワ紝鏈嶅姟鍣ㄥ氨浼?xì)鍋滃湪accept璇彞涓婄瓑寰呰繛鎺ヨ姹傜殑鍒版潵錛岃繖鍔垮繀浼?xì)寮曡碉L(fēng)▼搴忕殑闃誨錛岃櫧鐒朵篃鍙互閫氳繃璁劇疆濂楁帴瀛椾負(fù)闈為樆濉炴柟寮忎嬌鍦ㄦ病鏈夊鎴風(fēng)瓑寰呮椂鍙互浣縜ccept錛堬級鍑芥暟璋冪敤绔嬪嵆榪斿洖錛屼絾榪欑杞濂楁帴瀛楃殑鏂瑰紡浼?xì)鋴蒀PU澶勪簬蹇欑瓑寰呮柟寮忥紝浠庤岄檷浣庣▼搴忕殑榪愯鏁堢巼澶уぇ嫻垂緋葷粺璧勬簮銆傝冭檻鍒拌繖縐嶆儏鍐碉紝灝嗗鎺ュ瓧璁劇疆涓洪樆濉炲伐浣滄柟寮忥紝騫朵負(fù)鍏跺崟鐙紑杈熶竴涓瓙綰跨▼錛屽皢鍏墮樆濉炴帶鍒跺湪瀛愮嚎紼嬭寖鍥村唴鑰屼笉浼?xì)閫犳垚鏁翠釜搴旂敤紼嬪簭鐨勯樆濉炪傚浜庣綉緇滀簨浠剁殑鍝嶅簲鏄劇劧瑕侀噰鍙栧紓姝ラ夋嫨鏈哄埗錛屽彧鏈夐噰鍙栬繖縐嶆柟寮忔墠鍙互鍦ㄧ敱緗戠粶瀵規(guī)柟鎵寮曡搗鐨勪笉鍙鐭ョ殑緗戠粶浜嬩歡鍙戠敓鏃惰兘椹笂鍦ㄨ繘紼嬩腑鍋氬嚭鍙?qiáng)鏃剁殑鍝嶅簲澶勭悊锛岃屽湪娌℃湁緗戠粶浜嬩歡鍒拌揪鏃跺垯鍙互澶勭悊鍏朵粬浜嬩歡錛岃繖縐嶆晥鐜囨槸寰堥珮鐨勶紝鑰屼笖瀹屽叏絎﹀悎Windows鎵鏍囨鐨勬秷鎭Е鍙戝師鍒欍傚墠闈㈤偅孌典唬鐮佷腑鐨刉SAAsyncSelect()鍑芥暟渚挎槸瀹炵幇緗戠粶浜嬩歡寮傛閫夋嫨鐨勬牳蹇冨嚱鏁般?br />
銆銆閫氳繃絎洓涓弬鏁版敞鍐屽簲鐢ㄧ▼搴忔劅鍏村彇鐨勭綉緇滀簨浠訛紝鍦ㄨ繖閲岄氳繃FD_READ|FD_CLOSE鎸囧畾浜嗙綉緇滆鍜岀綉緇滄柇寮涓ょ浜嬩歡錛屽綋榪欑浜嬩歡鍙戠敓鏃跺彉浼?xì)鍙戝嚭鐢苯W笁涓弬鏁版寚瀹氱殑鑷畾涔夋秷鎭疻M_SOCKET_MSG錛屾帴鏀惰娑堟伅鐨勭獥鍙i氳繃絎簩涓弬鏁版寚瀹氬叾鍙ユ焺銆傚湪娑堟伅澶勭悊鍑芥暟涓彲浠ラ氳繃瀵規(guī)秷鎭弬鏁頒綆瀛楄妭榪涜鍒ゆ柇鑰屽尯鍒嚭鍙戠敓鐨勬槸浣曠緗戠粶浜嬩歡錛?br />
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;
}
}

銆銆鍦ㄨ繖閲岄渶瑕佸疄鐜板鑷畾涔夋秷鎭疻M_SOCKET_MSG鐨勫搷搴旓紝闇瑕佸湪澶存枃浠跺拰瀹炵幇鏂囦歡涓垎鍒坊鍔犲叾娑堟伅鏄犲皠鍏崇郴錛?br />
銆銆澶存枃浠訛細(xì)

//{{AFX_MSG(CNetServerView)
//}}AFX_MSG
void OnSocket(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()

銆銆瀹炵幇鏂囦歡錛?br />
BEGIN_MESSAGE_MAP(CNetServerView, CView)
//{{AFX_MSG_MAP(CNetServerView)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_SOCKET_MSG,OnSocket)
END_MESSAGE_MAP()

銆銆鍦ㄨ繘琛屽紓姝ラ夋嫨浣跨敤WSAAsyncSelect()鍑芥暟鏃訛紝鏈変互涓嬪嚑鐐歸渶瑕佸紩璧風(fēng)壒鍒殑娉ㄦ剰錛?br />
銆銆1錛?榪炵畫浣跨敤涓ゆWSAAsyncSelect()鍑芥暟鏃訛紝鍙湁絎簩嬈¤緗殑浜嬩歡鏈夋晥錛屽錛?br />
WSAAsyncSelect(s,hwnd,wMsg1,FD_READ);
WSAAsyncSelect(s,hwnd,wMsg2,FD_CLOSE);

銆銆榪欐牱鍙湁褰揊D_CLOSE浜嬩歡鍙戠敓鏃舵墠浼?xì)鍙戦亀Msg2娑堟伅銆?br />
銆銆2錛庡彲浠ュ湪璁劇疆榪囧紓姝ラ夋嫨鍚庨氳繃鍐嶆璋冪敤WSAAsyncSelect(s,hwnd,0,0);鐨勫艦寮忓彇娑堝湪濂楁帴瀛椾笂鎵璁劇疆鐨勫紓姝ヤ簨浠躲?br />
銆銆3錛嶹indows Sockets DLL鍦ㄤ竴涓綉緇滀簨浠跺彂鐢熷悗錛岄氬父鍙細(xì)緇欑浉搴旂殑搴旂敤紼嬪簭鍙戦佷竴涓秷鎭紝鑰屼笉鑳藉彂閫佸涓秷鎭備絾閫氳繃浣跨敤涓浜涘嚱鏁伴殣寮忓湴鍏佽閲嶅彂姝や簨浠剁殑娑堟伅錛岃繖鏍峰氨鍙兘鍐嶆鎺ユ敹鍒扮浉搴旂殑娑堟伅銆?br />
銆銆4錛庡湪璋冪敤榪嘽losesocket()鍑芥暟鍏抽棴濂楁帴瀛椾箣鍚庝笉浼?xì)鍐嶅彂鐢烣D_CLOSE浜嬩歡銆?br />
銆銆浠ヤ笂鍩烘湰瀹屾垚浜嗘湇鍔″櫒鏂圭殑紼嬪簭璁捐錛屼笅闈㈠浜庡鎴風(fēng)鐨勫疄鐜板垯瑕佺畝鍗曞浜嗭紝鍦ㄧ敤socket()鍒涘緩瀹屽鎺ュ瓧涔嬪悗鍙渶閫氳繃璋冪敤connect()瀹屾垚鍚屾湇鍔″櫒鐨勮繛鎺ュ嵆鍙紝鍓╀笅鐨勫伐浣滃悓鏈嶅姟鍣ㄥ畬鍏ㄤ竴鏍鳳細(xì)鐢╯end()/recv()鍙戦?鎺ユ敹鏀舵嵁錛岀敤closesocket()鍏抽棴濂楁帴瀛楋細(xì)

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));

銆銆鏈枃閲囧彇鐨勬槸鍙潬鐨勯潰鍚戣繛鎺ョ殑嫻佸紡濂楁帴瀛椼傚湪鏁版嵁鍙戦佷笂鏈墂rite()銆亀ritev()鍜宻end()絳変笁涓嚱鏁板彲渚涢夋嫨錛屽叾涓墠涓ょ鍒嗗埆鐢ㄤ簬緙撳啿鍙戦佸拰闆嗕腑鍙戦侊紝鑰宻end()鍒欎負(fù)鍙帶緙撳啿鍙戦侊紝騫朵笖榪樺彲浠ユ寚瀹氫紶杈撴帶鍒舵爣蹇椾負(fù)MSG_OOB榪涜甯﹀鏁版嵁鐨勫彂閫佹垨鏄負(fù)MSG_DONTROUTE瀵誨緞鎺у埗閫夐」銆傚湪淇″鍦板潃鐨勭綉緇滃彿閮ㄥ垎鎸囧畾鏁版嵁鍙戦侀渶瑕佺粡榪囩殑緗戠粶鎺ュ彛錛屼嬌鍏跺彲浠ヤ笉緇忚繃鏈湴瀵誨緞鏈哄埗鐩存帴鍙戦佸嚭鍘匯傝繖涔熸槸鍏跺悓write()鍑芥暟鐨勭湡姝e尯鍒墍鍦ㄣ傜敱浜庢帴鏀舵暟鎹郴緇熻皟鐢ㄥ拰鍙戦佹暟鎹郴緇熻皟鐢ㄦ槸涓涓瀵瑰簲鐨勶紝鍥犳瀵逛簬鏁版嵁鐨勬帴鏀訛紝鍦ㄦ涓嶅啀璧樿堪錛岀浉搴旂殑涓変釜鎺ユ敹鍑芥暟鍒嗗埆涓猴細(xì)read()銆乺eadv()鍜宺ecv()銆傜敱浜庡悗鑰呭姛鑳戒笂鐨勫叏闈紝鏈枃鍦ㄥ疄鐜頒笂閫夋嫨浜唖end()-recv()鍑芥暟瀵癸紝鍦ㄥ叿浣撶紪紼嬩腑搴斿綋瑙嗗叿浣撴儏鍐電殑涓嶅悓鐏墊椿閫夋嫨閫傚綋鐨勫彂閫?鎺ユ敹鍑芥暟瀵廣?br />
銆銆灝忕粨錛?/b>TCP/IP鍗忚鏄洰鍓嶅悇緗戠粶鎿嶄綔緋葷粺涓昏鐨勯氳鍗忚錛屼篃鏄?Internet鐨勯氳鍗忚錛屾湰鏂囬氳繃Windows Sockets API瀹炵幇浜嗗鍩轟簬TCP/IP鍗忚鐨勯潰鍚戣繛鎺ョ殑嫻佸紡濂楁帴瀛楃綉緇滈氳紼嬪簭鐨勮璁★紝騫墮氳繃寮傛閫氳鍜屽綰跨▼絳夋墜孌墊彁楂樹簡紼嬪簭鐨勮繍琛屾晥鐜囷紝閬垮厤浜嗛樆濉炵殑鍙戠敓銆?br />


]]>
TCP/IP Winsock緙栫▼瑕佺偣http://m.shnenglu.com/eday/archive/2007/01/31/18203.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Wed, 31 Jan 2007 02:53:00 GMThttp://m.shnenglu.com/eday/archive/2007/01/31/18203.html
銆銆1銆佸揩閫熼氫俊

銆銆Winsock鐨凬agle綆楁硶灝嗛檷浣庡皬鏁版嵁鎶ョ殑鍙戦侀熷害錛岃岀郴緇熼粯璁ゆ槸浣跨敤Nagle綆楁硶,浣跨敤

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");;

銆銆2銆丼OCKET鐨凷egMentSize鍜屾敹鍙戠紦鍐?

銆銆TCPSegMentSize鏄彂閫佹帴鍙楁椂鍗曚釜鏁版嵁鎶ョ殑鏈澶ч暱搴︼紝緋葷粺榛樿涓?460錛屾敹鍙戠紦鍐插ぇ灝忎負(fù)8192銆?

銆銆鍦⊿OCK_STREAM鏂瑰紡涓嬶紝濡傛灉鍗曟鍙戦佹暟鎹秴榪?460錛岀郴緇熷皢鍒嗘垚澶氫釜鏁版嵁鎶ヤ紶閫侊紝鍦ㄥ鏂規(guī)帴鍙楀埌鐨勫皢鏄竴涓暟鎹祦錛屽簲鐢ㄧ▼搴忛渶瑕佸鍔犳柇甯х殑鍒ゆ柇銆傚綋鐒跺彲浠ラ噰鐢ㄤ慨鏀規(guī)敞鍐岃〃鐨勬柟寮忔敼鍙?460鐨勫ぇ灝忥紝浣哅icrcoSoft璁や負(fù)1460鏄渶浣蟲晥鐜囩殑鍙傛暟錛屼笉寤鴻淇敼銆?

銆銆鍦ㄥ伐鎺х郴緇熶腑錛屽緩璁叧闂璑agle綆楁硶錛屾瘡嬈″彂閫佹暟鎹皬浜?460涓瓧鑺傦紙鎺ㄨ崘1400錛夛紝榪欐牱姣忔鍙戦佺殑鏄竴涓畬鏁寸殑鏁版嵁鎶ワ紝鍑忓皯瀵規(guī)柟瀵規(guī)暟鎹祦鐨勬柇甯у鐞嗐?

銆銆3銆佸悓姝ユ柟寮忎腑鍑忓皯鏂綉鏃禼onnect鍑芥暟鐨勯樆濉炴椂闂?

銆銆鍚屾鏂瑰紡涓殑鏂綉鏃禼onnect鐨勯樆濉炴椂闂翠負(fù)20縐掑乏鍙籌紝鍙噰鐢╣ethostbyaddr浜嬪厛鍒ゆ柇鍒版湇鍔′富鏈虹殑璺緞鏄惁鏄氱殑錛屾垨鑰呭厛ping涓涓嬪鏂逛富鏈虹殑IP鍦板潃銆?

銆銆A銆侀噰鐢╣ethostbyaddr闃誨鏃墮棿涓嶇鎴愬姛涓庡惁涓?縐掑乏鍙熾?

銆銆渚嬪瓙錛?

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);;

}

銆銆B銆侀噰鐢≒ING鏂瑰紡鏃墮棿綰?縐掑乏鍙?

銆銆鏆傜暐

4銆佸悓姝ユ柟寮忎腑瑙e喅recv錛宻end闃誨闂

銆銆閲囩敤select鍑芥暟瑙e喅錛屽湪鏀跺彂鍓嶅厛媯鏌ヨ鍐欏彲鐢ㄧ姸鎬併?

銆銆A銆佽

銆銆渚嬪瓙錛?

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

{

璇繪暟鎹?

}

銆銆B銆佸啓

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

{

//鍙戦?

}

銆銆5銆佹敼鍙楾CP鏀跺彂緙撳啿鍖哄ぇ灝?

銆銆緋葷粺榛樿涓?192錛屽埄鐢ㄥ涓嬫柟寮忓彲鏀瑰彉銆?

SOCKET sConnect;

sConnect=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

int nrcvbuf=1024*20;

int err=setsockopt(

sConnect,

SOL_SOCKET,

SO_SNDBUF,//鍐欑紦鍐詫紝璇葷紦鍐蹭負(fù)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

);

銆銆6銆佹湇鍔℃柟鍚屼竴绔彛澶欼P鍦板潃鐨刡ind鍜宭isten

銆銆鍦ㄥ彲闈犳ц姹傞珮鐨勫簲鐢ㄤ腑錛岃姹備嬌鐢ㄥ弻緗戝拰澶氱綉緇滈氶亾錛屽啀鏈嶅姟鏂瑰緢瀹規(guī)槗瀹炵幇錛岀敤濡備笅鏂瑰紡鍙緩绔嬪鎴峰鏈満鎵鏈塈P鍦板潃鍦ㄧ鍙?024涓嬬殑璇鋒眰鏈嶅姟銆?

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);

銆銆鍦ㄥ鎴鋒柟瑕佸鏉備竴浜涳紝榪炴帴鏂悗錛岄噸鑱斾笉鎴愬姛鍒欏簲鎹笅涓涓狪P鍦板潃榪炴帴銆備篃鍙噰鐢ㄥ悓鏃惰繛鎺ュソ鍚庡鐢ㄧ殑鏂瑰紡銆?

銆銆7銆佺敤TCP/IP Winsock瀹炵幇鍙樼Client/Server

銆銆浼犵粺鐨凜lient/Server涓哄鎴烽棶銆佹湇鍔$瓟錛屾敹鍙戞槸鎴愬鍑虹幇鐨勩傝屽彉縐嶇殑Client/Server鏄寚鍦ㄨ繛鎺ユ椂鏈夊鎴峰拰鏈嶅姟涔嬪垎錛屽緩绔嬪ソ閫氫俊榪炴帴鍚庯紝涓嶅啀鏈変弗鏍肩殑瀹㈡埛鍜屾湇鍔′箣鍒嗭紝浠諱綍鏂歸兘鍙富鍔ㄥ彂閫侊紝闇瑕佹垨涓嶉渶瑕佸洖絳旂湅搴旂敤鑰岃█錛岃繖縐嶆柟寮忓湪宸ユ帶琛屼笟寰堟湁鐢紝姣斿RTDB浣滀負(fù)I/O Server鐨勫鎴鳳紝浣咺/O Server涔熷彲涓誨姩鍚慠TDB鍙戦佸紑鍏崇姸鎬佸彉浣嶃侀殢鍗充簨浠剁瓑淇℃伅銆傚湪寰堝ぇ紼嬪害涓婂噺灝戜簡緗戠粶閫氫俊璐熻嵎銆佹彁楂樹簡鏁堢巼銆?

銆銆閲囩敤1-6鐨凾CP/IP緙栫▼瑕佺偣錛屽湪Client鍜孲erver鏂瑰潎宸叉帴鏀朵紭鍏堬紝閫傚綋鎺у埗鏃跺簭灝辮兘瀹炵幇銆?br />

]]>
鍩轟簬Visual C++鐨刉insock API鐮旂┒http://m.shnenglu.com/eday/archive/2007/01/31/18202.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Wed, 31 Jan 2007 02:51:00 GMThttp://m.shnenglu.com/eday/archive/2007/01/31/18202.html
銆銆寰蔣涓篤C瀹氫箟浜哤insock綾誨CAsyncSocket綾誨拰媧劇敓浜嶤AsyncSocket 鐨凜Socket綾伙紝瀹冧滑綆鍗曟槗鐢紝璇昏呮湅鍙嬪綋鐒跺彲浠ヤ嬌鐢ㄨ繖浜涚被鏉ュ疄鐜拌嚜宸辯殑緗戠粶紼嬪簭錛屼絾鏄負(fù)浜嗘洿濂界殑浜嗚ВWinsock API緙栫▼鎶鏈紝鎴戜滑榪欓噷鎺㈣鎬庢牱浣跨敤搴曞眰鐨凙PI鍑芥暟瀹炵幇綆鍗曠殑 Winsock 緗戠粶搴旂敤紼嬪紡璁捐錛屽垎鍒鏄庡浣曞湪Server绔拰Client绔搷浣淪ocket錛屽疄鐜板熀浜嶵CP/IP鐨勬暟鎹紶閫侊紝鏈鍚庣粰鍑虹浉鍏崇殑婧愪唬鐮併?br />
銆銆鍦╒C涓繘琛學(xué)INSOCK鐨凙PI緙栫▼寮鍙戠殑鏃跺欙紝闇瑕佸湪欏圭洰涓嬌鐢ㄤ笅闈笁涓枃浠訛紝鍚﹀垯浼?xì)鍑虹幇缂栬瘧閿欒銆?br />
銆銆1錛嶹INSOCK.H: 榪欐槸WINSOCK API鐨勫ご鏂囦歡錛岄渶瑕佸寘鍚湪欏圭洰涓?br />
銆銆2錛嶹SOCK32.LIB: WINSOCK API榪炴帴搴撴枃浠躲傚湪浣跨敤涓紝涓瀹氳鎶婂畠浣滀負(fù)欏圭洰鐨勯潪緙虹渷鐨勮繛鎺ュ簱鍖呭惈鍒伴」鐩枃浠朵腑鍘匯?

銆銆3錛嶹INSOCK.DLL: WINSOCK鐨勫姩鎬佽繛鎺ュ簱錛屼綅浜嶹INDOWS鐨勫畨瑁呯洰褰曚笅銆?br />
銆銆涓銆佹湇鍔″櫒绔搷浣?socket錛堝鎺ュ瓧錛?/b>

銆銆1)鍦ㄥ垵濮嬪寲闃舵璋冪敤WSAStartup()

銆銆姝ゅ嚱鏁板湪搴旂敤紼嬪簭涓垵濮嬪寲Windows Sockets DLL 錛屽彧鏈夋鍑芥暟璋冪敤鎴愬姛鍚庯紝搴旂敤紼嬪簭鎵嶅彲浠ュ啀璋冪敤鍏朵粬Windows Sockets DLL涓殑API鍑芥暟銆傚湪紼嬪紡涓皟鐢ㄨ鍑芥暟鐨勫艦寮忓涓嬶細(xì)WSAStartup((WORD)((1<<8|1)錛岋紙LPWSADATA錛?amp;WSAData)錛屽叾涓?1<<8|1)琛ㄧず鎴戜滑鐢ㄧ殑鏄疻inSocket1.1鐗堟湰錛學(xué)SAata鐢ㄦ潵瀛樺偍緋葷粺浼犲洖鐨勫叧浜嶹inSocket鐨勮祫鏂欍?br />
銆銆2)寤虹珛Socket

銆銆鍒濆鍖朩inSock鐨勫姩鎬佽繛鎺ュ簱鍚庯紝闇瑕佸湪鏈嶅姟鍣ㄧ寤虹珛涓涓洃鍚殑Socket錛屼負(fù)姝ゅ彲浠ヨ皟鐢⊿ocket()鍑芥暟鐢ㄦ潵寤虹珛榪欎釜鐩戝惉鐨凷ocket錛屽茍瀹氫箟姝ocket鎵浣跨敤鐨勯氫俊鍗忚銆傛鍑芥暟璋冪敤鎴愬姛榪斿洖Socket瀵硅薄錛屽け璐ュ垯榪斿洖INVALID_SOCKET(璋冪敤WSAGetLastError()鍙緱鐭ュ師鍥狅紝鎵鏈塛inSocket 鐨勫嚱鏁伴兘鍙互浣跨敤榪欎釜鍑芥暟鏉ヨ幏鍙栧け璐ョ殑鍘熷洜)銆?br />
SOCKET PASCAL FAR socket( int af, int type, int protocol )
鍙傛暟: af:鐩墠鍙彁渚?PF_INET(AF_INET)錛?br />type錛歋ocket 鐨勭被鍨?(SOCK_STREAM銆丼OCK_DGRAM)錛?br />protocol錛氶氳鍗忓畾(濡傛灉浣跨敤鑰呬笉鎸囧畾鍒欒涓?)錛?br />
濡傛灉瑕佸緩绔嬬殑鏄伒浠嶵CP/IP鍗忚鐨剆ocket錛岀浜屼釜鍙傛暟type搴斾負(fù)SOCK_STREAM錛屽涓篣DP錛堟暟鎹姤錛夌殑socket錛屽簲涓篠OCK_DGRAM銆?br />
銆銆3)緇戝畾绔彛

銆銆鎺ヤ笅鏉ヨ涓烘湇鍔″櫒绔畾涔夌殑榪欎釜鐩戝惉鐨凷ocket鎸囧畾涓涓湴鍧鍙?qiáng)绔彛锛圥ort錛夛紝榪欐牱瀹㈡埛绔墠鐭ラ亾寰呬細(xì)瑕佽繛鎺ュ摢涓涓湴鍧鐨勫摢涓鍙o紝涓烘鎴戜滑瑕佽皟鐢╞ind()鍑芥暟錛岃鍑芥暟璋冪敤鎴愬姛榪斿洖0錛屽惁鍒欒繑鍥濻OCKET_ERROR銆?br />int PASCAL FAR bind( SOCKET s, const struct sockaddr FAR *name,int namelen );

鍙?鏁幫細(xì) s錛歋ocket瀵硅薄鍚嶏紱
name錛歋ocket鐨勫湴鍧鍊鹼紝榪欎釜鍦板潃蹇呴』鏄墽琛岃繖涓▼寮忔墍鍦ㄦ満鍣ㄧ殑IP鍦板潃錛?br />namelen錛歯ame鐨勯暱搴︼紱

銆銆濡傛灉浣跨敤鑰呬笉鍦ㄦ剰鍦板潃鎴栫鍙g殑鍊鹼紝閭d箞鍙互璁懼畾鍦板潃涓篒NADDR_ANY錛屽強(qiáng)Port涓?錛學(xué)indows Sockets 浼?xì)鑷姩灏嗗叾璁惧畾閫傚綋涔嬪湴鍧鍙?qiáng)Port (1024 鍒?5000涔嬮棿鐨勫?銆傛鍚庡彲浠ヨ皟鐢╣etsockname()鍑芥暟鏉ヨ幏鐭ュ叾琚瀹氱殑鍊箋?br />
銆銆4錛夌洃鍚?br />
銆銆褰撴湇鍔″櫒绔殑Socket瀵硅薄緇戝畾瀹屾垚涔嬪悗,鏈嶅姟鍣ㄧ蹇呴』寤虹珛涓涓洃鍚殑闃熷垪鏉ユ帴鏀跺鎴風(fēng)鐨勮繛鎺ヨ姹傘俵isten()鍑芥暟浣挎湇鍔″櫒绔殑Socket 榪涘叆鐩戝惉鐘舵侊紝騫惰瀹氬彲浠ュ緩绔嬬殑鏈澶ц繛鎺ユ暟(鐩墠鏈澶у奸檺鍒朵負(fù) 5, 鏈灝忓間負(fù)1)銆傝鍑芥暟璋冪敤鎴愬姛榪斿洖0錛屽惁鍒欒繑鍥濻OCKET_ERROR銆?br />
int PASCAL FAR listen( SOCKET s, int backlog );
鍙?鏁幫細(xì) s錛氶渶瑕佸緩绔嬬洃鍚殑Socket錛?br />backlog錛氭渶澶ц繛鎺ヤ釜鏁幫紱

銆銆鏈嶅姟鍣ㄧ鐨凷ocket璋冪敤瀹宭isten錛堬級鍚庯紝濡傛灉姝ゆ椂瀹㈡埛绔皟鐢╟onnect錛堬級鍑芥暟鎻愬嚭榪炴帴鐢寵鐨勮瘽錛孲erver 绔繀欏誨啀璋冪敤accept() 鍑芥暟錛岃繖鏍鋒湇鍔″櫒绔拰瀹㈡埛绔墠綆楁寮忓畬鎴愰氫俊紼嬪簭鐨勮繛鎺ュ姩浣溿備負(fù)浜嗙煡閬撲粈涔堟椂鍊欏鎴風(fēng)鎻愬嚭榪炴帴瑕佹眰錛屼粠鑰屾湇鍔″櫒绔殑Socket鍦ㄦ伆褰撶殑鏃跺欒皟鐢╝ccept()鍑芥暟瀹屾垚榪炴帴鐨勫緩绔嬶紝鎴戜滑灝辮浣跨敤WSAAsyncSelect錛堬級鍑芥暟錛岃緋葷粺涓誨姩鏉ラ氱煡鎴戜滑鏈夊鎴風(fēng)鎻愬嚭榪炴帴璇鋒眰浜嗐傝鍑芥暟璋冪敤鎴愬姛榪斿洖0錛屽惁鍒欒繑鍥濻OCKET_ERROR銆?br />
int PASCAL FAR WSAAsyncSelect( SOCKET s, HWND hWnd,unsigned int wMsg, long lEvent );
鍙傛暟錛?s錛歋ocket 瀵硅薄錛?br />hWnd 錛氭帴鏀舵秷鎭殑紿楀彛鍙ユ焺錛?br />wMsg錛氫紶緇欑獥鍙g殑娑堟伅錛?br />lEvent錛氳娉ㄥ唽鐨勭綉緇滀簨浠訛紝涔熷嵆鏄簲鐢ㄧ▼搴忓悜紿楀彛鍙戦佹秷鎭殑緗戣礬浜嬩歡錛岃鍊間負(fù)涓嬪垪鍊糉D_READ銆丗D_WRITE銆丗D_OOB銆丗D_ACCEPT銆丗D_CONNECT銆丗D_CLOSE鐨勭粍鍚堬紝鍚勪釜鍊肩殑鍏蜂綋鍚剰涓篎D_READ錛氬笇鏈涘湪濂楁帴瀛桽鏀跺埌鏁版嵁鏃舵敹鍒版秷鎭紱FD_WRITE錛氬笇鏈涘湪濂楁帴瀛桽涓婂彲浠ュ彂閫佹暟鎹椂鏀跺埌娑堟伅錛汧D_ACCEPT錛氬笇鏈涘湪濂楁帴瀛桽涓婃敹鍒拌繛鎺ヨ姹傛椂鏀跺埌娑堟伅錛汧D_CONNECT錛氬笇鏈涘湪濂楁帴瀛桽涓婅繛鎺ユ垚鍔熸椂鏀跺埌娑堟伅錛汧D_CLOSE錛氬笇鏈涘湪濂楁帴瀛桽涓婅繛鎺ュ叧闂椂鏀跺埌娑堟伅錛汧D_OOB錛氬笇鏈涘湪濂楁帴瀛桽涓婃敹鍒板甫澶栨暟鎹椂鏀跺埌娑堟伅銆?

銆銆鍏蜂綋搴旂敤鏃訛紝wMsg搴旀槸鍦ㄥ簲鐢ㄧ▼搴忎腑瀹氫箟鐨勬秷鎭悕縐幫紝鑰屾秷鎭粨鏋勪腑鐨刲Param鍒欎負(fù)浠ヤ笂鍚勭緗戠粶浜嬩歡鍚嶇О銆傛墍浠ワ紝鍙互鍦ㄧ獥鍙e鐞嗚嚜瀹氫箟娑堟伅鍑芥暟涓嬌鐢ㄤ互涓嬬粨鏋勬潵鍝嶅簲Socket鐨勪笉鍚屼簨浠訛細(xì)銆銆

switch(lParam)銆
銆 {case FD_READ:
銆銆銆 鈥︺銆
銆 break;
case FD_WRITE銆?br />銆銆銆 鈥?br />銆 break;
銆銆銆 鈥?br />}

銆銆5錛夋湇鍔″櫒绔帴鍙楀鎴風(fēng)鐨勮繛鎺ヨ姹?br />
銆銆褰揅lient鎻愬嚭榪炴帴璇鋒眰鏃訛紝Server 绔痟wnd瑙嗙獥浼?xì)鏀跺埌Winsock Stack閫佹潵鎴戜滑鑷畾涔夌殑涓涓秷鎭紝榪欐椂錛屾垜浠彲浠ュ垎鏋恖Param錛岀劧鍚庤皟鐢ㄧ浉鍏崇殑鍑芥暟鏉ュ鐞嗘浜嬩歡銆備負(fù)浜嗕嬌鏈嶅姟鍣ㄧ鎺ュ彈瀹㈡埛绔殑榪炴帴璇鋒眰錛屽氨瑕佷嬌鐢╝ccept() 鍑芥暟錛岃鍑芥暟鏂板緩涓Socket涓庡鎴風(fēng)鐨凷ocket鐩擱氾紝鍘熷厛鐩戝惉涔婼ocket緇х畫榪涘叆鐩戝惉鐘舵侊紝絳夊緟浠栦漢鐨勮繛鎺ヨ姹傘傝鍑芥暟璋冪敤鎴愬姛榪斿洖涓涓柊浜х敓鐨凷ocket瀵硅薄錛屽惁鍒欒繑鍥濱NVALID_SOCKET銆?br />
SOCKET PASCAL FAR accept( SCOKET s, struct sockaddr FAR *addr,int FAR *addrlen );
鍙傛暟錛歴錛歋ocket鐨勮瘑鍒爜錛?br />addr錛氬瓨鏀炬潵榪炴帴鐨勫鎴風(fēng)鐨勫湴鍧錛?br />addrlen錛歛ddr鐨勯暱搴?/td>

銆銆6錛夌粨鏉?socket 榪炴帴

銆銆緇撴潫鏈嶅姟鍣ㄥ拰瀹㈡埛绔殑閫氫俊榪炴帴鏄緢綆鍗曠殑錛岃繖涓榪囩▼鍙互鐢辨湇鍔″櫒鎴栧鎴鋒満鐨勪換涓绔惎鍔紝鍙璋冪敤closesocket()灝卞彲浠ヤ簡錛岃岃鍏抽棴Server绔洃鍚姸鎬佺殑socket錛屽悓鏍蜂篃鏄埄鐢ㄦ鍑芥暟銆傚彟澶栵紝涓庣▼搴忓惎鍔ㄦ椂璋冪敤WSAStartup()鎲ㄦ暟鐩稿搴旓紝紼嬪紡緇撴潫鍓嶏紝闇瑕佽皟鐢?WSACleanup() 鏉ラ氱煡Winsock Stack閲婃斁Socket鎵鍗犵敤鐨勮祫婧愩傝繖涓や釜鍑芥暟閮芥槸璋冪敤鎴愬姛榪斿洖0錛屽惁鍒欒繑鍥濻OCKET_ERROR銆?br />
int PASCAL FAR closesocket( SOCKET s );
鍙?鏁幫細(xì)s錛歋ocket 鐨勮瘑鍒爜錛?br />int PASCAL FAR WSACleanup( void );
鍙?鏁幫細(xì) 鏃?/td>

浜屻佸鎴風(fēng)Socket鐨勬搷浣?br />
銆銆1錛夊緩绔嬪鎴風(fēng)鐨凷ocket

銆銆瀹㈡埛绔簲鐢ㄧ▼搴忛鍏堜篃鏄皟鐢╓SAStartup() 鍑芥暟鏉ヤ笌Winsock鐨勫姩鎬佽繛鎺ュ簱寤虹珛鍏崇郴錛岀劧鍚庡悓鏍瘋皟鐢╯ocket() 鏉ュ緩绔嬩竴涓猅CP鎴朥DP socket錛堢浉鍚屽崗瀹氱殑 sockets 鎵嶈兘鐩擱氾紝TCP 瀵?TCP錛孶DP 瀵?UDP錛夈備笌鏈嶅姟鍣ㄧ鐨剆ocket 涓嶅悓鐨勬槸錛屽鎴風(fēng)鐨剆ocket 鍙互璋冪敤 bind() 鍑芥暟錛岀敱鑷繁鏉ユ寚瀹欼P鍦板潃鍙?qiáng)port鍙風(fēng)爜錛涗絾鏄篃鍙互涓嶈皟鐢?bind()錛岃岀敱 Winsock鏉ヨ嚜鍔ㄨ瀹欼P鍦板潃鍙?qiáng)port鍙風(fēng)爜銆?br />
銆銆2錛夋彁鍑鴻繛鎺ョ敵璇?br />
銆銆瀹㈡埛绔殑Socket浣跨敤connect()鍑芥暟鏉ユ彁鍑轟笌鏈嶅姟鍣ㄧ鐨凷ocket寤虹珛榪炴帴鐨勭敵璇鳳紝鍑芥暟璋冪敤鎴愬姛榪斿洖0錛屽惁鍒欒繑鍥濻OCKET_ERROR銆?br />
int PASCAL FAR connect( SOCKET s, const struct sockaddr FAR *name, int namelen );
鍙?鏁幫細(xì)s錛歋ocket 鐨勮瘑鍒爜錛?br />name錛歋ocket鎯寵榪炴帴鐨勫鏂瑰湴鍧錛?br />namelen錛歯ame鐨勯暱搴?/td>

銆銆涓夈佹暟鎹殑浼犻?/b>

銆銆铏界劧鍩轟簬TCP/IP榪炴帴鍗忚錛堟祦濂楁帴瀛楋級鐨勬湇鍔℃槸璁捐瀹㈡埛鏈?鏈嶅姟鍣ㄥ簲鐢ㄧ▼搴忔椂鐨勪富嫻佹爣鍑嗭紝浣嗘湁浜涙湇鍔′篃鏄彲浠ラ氳繃鏃犺繛鎺ュ崗璁紙鏁版嵁鎶ュ鎺ュ瓧錛夋彁渚涚殑銆傚厛浠嬬粛涓涓婽CP socket 涓嶶DP socket 鍦ㄤ紶閫佹暟鎹椂鐨勭壒鎬э細(xì)Stream (TCP) Socket 鎻愪緵鍙屽悜銆佸彲闈犮佹湁嬈″簭銆佷笉閲嶅鐨勮祫鏂欎紶閫併侱atagram (UDP) Socket 铏界劧鎻愪緵鍙屽悜鐨勯氫俊錛屼絾娌℃湁鍙潬銆佹湁嬈″簭銆佷笉閲嶅鐨勪繚璇侊紝鎵浠DP浼犻佹暟鎹彲鑳戒細(xì)鏀跺埌鏃犳搴忋侀噸澶嶇殑璧勬枡錛岀敋鑷寵祫鏂欏湪浼犺緭榪囩▼涓嚭鐜伴仐婕忋傜敱浜嶶DP Socket 鍦ㄤ紶閫佽祫鏂欐椂錛屽茍涓嶄繚璇佽祫鏂欒兘瀹屾暣鍦伴佽揪瀵規(guī)柟錛屾墍浠ョ粷澶у鏁板簲鐢ㄧ▼搴忛兘鏄噰鐢═CP澶勭悊Socket錛屼互淇濊瘉璧勬枡鐨勬紜с備竴鑸儏鍐典笅TCP Socket 鐨勬暟鎹彂閫佸拰鎺ユ敹鏄皟鐢╯end() 鍙?qiáng)recv() 榪欎袱涓嚱鏁版潵杈炬垚錛岃?UDP Socket鍒欐槸鐢╯endto() 鍙?qiáng)recvfrom() 榪欎袱涓嚱鏁幫紝榪欎袱涓嚱鏁拌皟鐢ㄦ垚鍔熷彂鎸ュ彂閫佹垨鎺ユ敹鐨勮祫鏂欑殑闀垮害錛屽惁鍒欒繑鍥濻OCKET_ERROR銆?br />
int PASCAL FAR send( SOCKET s, const char FAR *buf,int len, int flags );
鍙傛暟錛歴錛歋ocket 鐨勮瘑鍒爜
buf錛氬瓨鏀捐浼犻佺殑璧勬枡鐨勬殏瀛樺尯
len buf錛氱殑闀垮害
flags錛氭鍑芥暟琚皟鐢ㄧ殑鏂瑰紡

銆銆瀵逛簬Datagram Socket鑰岃█錛岃嫢鏄?datagram 鐨勫ぇ灝忚秴榪囬檺鍒訛紝鍒欏皢涓嶄細(xì)閫佸嚭浠諱綍璧勬枡錛屽茍浼?xì)浼犲洖閿欒鍊箋傚Stream Socket 璦錛孊locking 妯″紡涓嬶紝鑻ユ槸浼犻佺郴緇熷唴鐨勫偍瀛樼┖闂翠笉澶熷瓨鏀捐繖浜涜浼犻佺殑璧勬枡錛宻end()灝嗕細(xì)琚玝lock浣忥紝鐩村埌璧勬枡閫佸畬涓烘錛涘鏋滆Socket琚瀹氫負(fù) Non-Blocking 妯″紡錛岄偅涔堝皢瑙嗙洰鍓嶇殑output buffer絀洪棿鏈夊灝戯紝灝遍佸嚭澶氬皯璧勬枡錛屽茍涓嶄細(xì)琚?block 浣忋俧lags 鐨勫煎彲璁句負(fù) 0 鎴?MSG_DONTROUTE鍙?MSG_OOB 鐨勭粍鍚堛?br />
int PASCAL FAR recv( SOCKET s, char FAR *buf, int len, int flags );
鍙傛暟錛歴錛歋ocket 鐨勮瘑鍒爜
buf錛氬瓨鏀炬帴鏀跺埌鐨勮祫鏂欑殑鏆傚瓨鍖?br />len buf錛氱殑闀垮害
flags錛氭鍑芥暟琚皟鐢ㄧ殑鏂瑰紡

銆銆瀵筍tream Socket 璦錛屾垜浠彲浠ユ帴鏀跺埌鐩墠input buffer鍐呮湁鏁堢殑璧勬枡錛屼絾鍏舵暟閲忎笉瓚呰繃len鐨勫ぇ灝忋?br />
銆銆鍥涖佽嚜瀹氫箟鐨凜MySocket綾葷殑瀹炵幇浠g爜錛?/font>

銆銆鏍規(guī)嵁涓婇潰鐨勭煡璇嗭紝鎴戣嚜瀹氫箟浜嗕竴涓畝鍗曠殑CMySocket綾伙紝涓嬮潰鏄垜瀹氫箟鐨勮綾葷殑閮ㄥ垎瀹炵幇浠g爜錛?br />
//////////////////////////////////////
CMySocket::CMySocket() : file://綾葷殑鏋勯犲嚱鏁?br />{
銆WSADATA wsaD;
銆memset( m_LastError, 0, ERR_MAXLENGTH );
銆// m_LastError鏄被鍐呭瓧絎︿覆鍙橀噺,鍒濆鍖栫敤鏉ュ瓨鏀炬渶鍚庨敊璇鏄庣殑瀛楃涓詫紱
銆// 鍒濆鍖栫被鍐卻ockaddr_in緇撴瀯鍙橀噺錛屽墠鑰呭瓨鏀懼鎴風(fēng)鍦板潃錛屽悗鑰呭搴斾簬鏈嶅姟鍣ㄧ鍦板潃;
銆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 );//鏍規(guī)嵁璁$畻鏈哄悕寰楀埌璇ヨ綆楁満鐨勭浉鍏沖唴瀹癸紱
銆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';
}

銆銆鏈変簡涓婅堪綾葷殑瀹氫箟錛屽氨鍙互鍦ㄧ綉緇滅▼搴忕殑鏈嶅姟鍣ㄥ拰瀹㈡埛绔垎鍒畾涔塁MySocket瀵硅薄錛屽緩绔嬭繛鎺ワ紝浼犻佹暟鎹簡銆備緥濡傦紝涓轟簡鍦ㄦ湇鍔″櫒鍜屽鎴風(fēng)鍙戦佹暟鎹紝闇瑕佸湪鏈嶅姟鍣ㄧ瀹氫箟涓や釜CMySocket瀵硅薄ServerSocket1鍜孲erverSocket2錛屽垎鍒敤浜庣洃鍚拰榪炴帴錛屽鎴風(fēng)瀹氫箟涓涓狢MySocket瀵硅薄ClientSocket錛岀敤浜庡彂閫佹垨鎺ユ敹鏁版嵁錛屽鏋滃緩绔嬬殑榪炴帴鏁板ぇ浜庝竴錛屽彲浠ュ湪鏈嶅姟鍣ㄧ鍐嶅畾涔塁MySocket瀵硅薄錛屼絾瑕佹敞鎰忚繛鎺ユ暟涓嶈澶т簬浜斻?br />
銆銆鐢變簬Socket API鍑芥暟榪樻湁璁稿錛屽鑾峰彇榪滅鏈嶅姟鍣ㄣ佹湰鍦板鎴鋒満鐨処P鍦板潃銆佷富鏈哄悕絳夌瓑錛岃鑰呭彲浠ュ啀姝ゅ熀紜涓婂CMySocket琛ュ厖瀹屽杽錛屽疄鐜版洿澶氱殑鍔熻兘銆?br />

]]>
Windows Socket1.1 紼嬪簭璁捐http://m.shnenglu.com/eday/archive/2007/01/30/18190.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Tue, 30 Jan 2007 14:07:00 GMThttp://m.shnenglu.com/eday/archive/2007/01/30/18190.html涓銆佺畝浠?br />
銆銆Windows Sockets 鏄粠 Berkeley Sockets 鎵╁睍鑰屾潵鐨勶紝鍏跺湪緇ф壙 Berkeley Sockets 鐨勫熀紜涓婏紝鍙堣繘琛屼簡鏂扮殑鎵╁厖銆傝繖浜涙墿鍏呬富瑕佹槸鎻愪緵浜嗕竴浜涘紓姝ュ嚱鏁幫紝騫跺鍔犱簡絎﹀悎WINDOWS娑堟伅椹卞姩鐗規(guī)х殑緗戠粶浜嬩歡寮傛閫夋嫨鏈哄埗銆?br />
銆銆Windows Sockets鐢變袱閮ㄥ垎緇勬垚錛氬紑鍙戠粍浠跺拰榪愯緇勪歡銆?br />
銆銆寮鍙戠粍浠訛細(xì)Windows Sockets 瀹炵幇鏂囨。銆佸簲鐢ㄧ▼搴忔帴鍙?API)寮曞叆搴撳拰涓浜涘ご鏂囦歡銆?br />
銆銆榪愯緇勪歡錛歐indows Sockets 搴旂敤紼嬪簭鎺ュ彛鐨勫姩鎬侀摼鎺ュ簱(WINSOCK.DLL)銆?

銆銆浜屻佷富瑕佹墿鍏呰鏄?/b>

銆銆1銆佸紓姝ラ夋嫨鏈哄埗錛?br />
銆銆Windows Sockets 鐨勫紓姝ラ夋嫨鍑芥暟鎻愪緵浜嗘秷鎭満鍒剁殑緗戠粶浜嬩歡閫夋嫨錛屽綋浣跨敤瀹冪櫥璁扮綉緇滀簨浠跺彂鐢熸椂錛屽簲鐢ㄧ▼搴忕浉搴旂獥鍙e嚱鏁板皢鏀跺埌涓涓秷鎭紝娑堟伅涓寚紺轟簡鍙戠敓鐨勭綉緇滀簨浠訛紝浠ュ強(qiáng)涓庝簨浠剁浉鍏崇殑涓浜涗俊鎭?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 />

鍊鹼細(xì)鍚箟錛?/td>
FD_READ鏈熸湜鍦ㄥ鎺ュ瓧涓婃敹鍒版暟鎹紙鍗寵鍑嗗濂斤級鏃舵帴鍒伴氱煡
FD_WRITE鏈熸湜鍦ㄥ鎺ュ瓧涓婂彲鍙戦佹暟鎹紙鍗沖啓鍑嗗濂斤級鏃舵帴鍒伴氱煡
FD_OOB鏈熸湜鍦ㄥ鎺ュ瓧涓婃湁甯﹀鏁版嵁鍒拌揪鏃舵帴鍒伴氱煡
FD_ACCEPT鏈熸湜鍦ㄥ鎺ュ瓧涓婃湁澶栨潵榪炴帴鏃舵帴鍒伴氱煡
FD_CONNECT鏈熸湜鍦ㄥ鎺ュ瓧榪炴帴寤虹珛瀹屾垚鏃舵帴鍒伴氱煡
FD_CLOSE鏈熸湜鍦ㄥ鎺ュ瓧鍏抽棴鏃舵帴鍒伴氱煡

銆銆渚嬪錛氭垜浠鍦ㄥ鎺ュ瓧璇誨噯澶囧ソ鎴栧啓鍑嗗濂芥椂鎺ュ埌閫氱煡錛岃鍙ュ涓嬶細(xì)

rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);

銆銆濡傛灉鎴戜滑闇瑕佹敞閿瀵瑰鎺ュ瓧緗戠粶浜嬩歡鐨勬秷鎭彂閫侊紝鍙灝?lEvent 璁劇疆涓?

銆銆2銆佸紓姝ヨ姹傚嚱鏁?br />
銆銆鍦?Berkeley Sockets 涓姹傛湇鍔℃槸闃誨鐨勶紝W(xué)INDOWS SICKETS 闄や簡鏀寔榪欎竴綾誨嚱鏁板錛岃繕澧炲姞浜嗙浉搴旂殑寮傛璇鋒眰鍑芥暟(WSAAsyncGetXByY();)銆?

銆銆3銆侀樆濉炲鐞嗘柟娉?br />
銆銆Windows Sockets 涓轟簡瀹炵幇褰撲竴涓簲鐢ㄧ▼搴忕殑濂楁帴瀛楄皟鐢ㄥ浜庨樆濉炴椂錛岃兘澶熸斁寮僀PU璁╁叾瀹冨簲鐢ㄧ▼搴忚繍琛岋紝瀹冨湪璋冪敤澶勪簬闃誨鏃朵究榪涘叆涓涓彨鈥淗OOK鈥濈殑渚嬬▼錛屾渚嬬▼璐熻矗鎺ユ敹鍜屽垎閰峎INDOWS娑堟伅錛屼嬌寰楀叾瀹冨簲鐢ㄧ▼搴忎粛鐒惰兘澶熸帴鏀跺埌鑷繁鐨勬秷鎭茍鍙栧緱鎺у埗鏉冦?br />
銆銆WINDOWS 鏄潪鎶㈠厛鐨勫浠誨姟鐜錛屽嵆鑻ヤ竴涓▼搴忎笉涓誨姩鏀懼純鍏舵帶鍒舵潈錛屽埆鐨勭▼搴忓氨涓嶈兘鎵ц銆傚洜姝ゅ湪璁捐Windows Sockets 紼嬪簭鏃訛紝灝界緋葷粺鏀寔闃誨鎿嶄綔錛屼絾榪樻槸鍙嶅紼嬪簭鍛樹嬌鐢ㄨ鎿嶄綔銆備絾鐢變簬 SUN 鍏徃涓嬬殑 Berkeley Sockets 鐨勫鎺ュ瓧榛樿鎿嶄綔鏄樆濉炵殑錛學(xué)INDOWS 浣滀負(fù)縐繪鐨?SOCKETS 涔熶笉鍙伩鍏嶅榪欎釜鎿嶄綔鏀寔銆?br />
銆銆鍦╓indows Sockets 瀹炵幇涓紝瀵逛簬涓嶈兘绔嬪嵆瀹屾垚鐨勯樆濉炴搷浣滃仛濡備笅澶勭悊錛欴LL鍒濆鍖栤啋寰幆鎿嶄綔銆傚湪寰幆涓紝瀹冨彂閫佷換浣?WINDOWS 娑堟伅錛屽茍媯鏌ヨ繖涓?Windows Sockets 璋冪敤鏄惁瀹屾垚錛屽湪蹇呰鏃訛紝瀹冨彲浠ユ斁寮僀PU璁╁叾瀹冨簲鐢ㄧ▼搴忔墽琛岋紙褰撶劧浣跨敤瓚呯嚎紼嬬殑CPU灝變笉浼?xì)鏈墭q欎釜楹葷儲浜哵_^錛夈傛垜浠彲浠ヨ皟鐢?WSACancelBlockingCall() 鍑芥暟鍙栨秷姝ら樆濉炴搷浣溿?br />
銆銆鍦?Windows Sockets 涓紝鏈変竴涓粯璁ょ殑闃誨澶勭悊渚嬬▼ BlockingHook() 綆鍗曞湴鑾峰彇騫跺彂閫?WINDOWS 娑堟伅銆傚鏋滆瀵瑰鏉傜▼搴忚繘琛屽鐞嗭紝W(xué)indows Sockets 涓繕鏈?WSASetBlockingHook() 鎻愪緵鐢ㄦ埛瀹夎鑷繁鐨勯樆濉炲鐞嗕緥紼嬭兘鍔涳紱涓庤鍑芥暟鐩稿搴旂殑鍒欐槸 SWAUnhookBlockingHook()錛屽畠鐢ㄤ簬鍒犻櫎鍏堝墠瀹夎鐨勪換浣曢樆濉炲鐞嗕緥紼嬶紝騫墮噸鏂板畨瑁呴粯璁ょ殑澶勭悊渚嬬▼銆傝娉ㄦ剰錛岃璁¤嚜宸辯殑闃誨澶勭悊渚嬬▼鏃訛紝闄や簡鍑芥暟 WSACancelBlockingHook() 涔嬪錛屽畠涓嶈兘浣跨敤鍏跺畠鐨?Windows Sockets API 鍑芥暟銆傚湪澶勭悊渚嬬▼涓皟鐢?WSACancelBlockingHook()鍑芥暟灝嗗彇娑堝浜庨樆濉炵殑鎿嶄綔錛屽畠?yōu)畣缁撴潫闃诲弩@鐜?/p>

銆銆4銆佸嚭閿欏鐞?br />
銆銆Windows Sockets 涓轟簡鍜屼互鍚庡綰跨▼鐜錛圵INDOWS/UNIX錛夊吋瀹癸紝瀹冩彁渚涗簡涓や釜鍑洪敊澶勭悊鍑芥暟鏉ヨ幏鍙栧拰璁劇疆褰撳墠綰跨▼鐨勬渶榪戦敊璇彿銆傦紙WSAGetLastEror()鍜學(xué)SASetLastError()錛?/p>

銆銆5銆佸惎鍔ㄤ笌緇堟

銆銆浣跨敤鍑芥暟 WSAStartup() 鍜?WSACleanup() 鍚姩鍜岀粓姝㈠鎺ュ瓧銆?br />
涓夈乄indows Sockets緗戠粶紼嬪簭璁捐鏍稿績

銆銆鎴戜滑緇堜簬鍙互寮濮嬬湡姝g殑 Windows Sockets 緗戠粶紼嬪簭璁捐浜嗐備笉榪囨垜浠繕鏄厛鐪嬩竴鐪嬫瘡涓?Windows Sockets 緗戠粶紼嬪簭閮借娑夊強(qiáng)鐨勫唴瀹廣傝鎴戜滑涓姝ユ鎱㈡參璧般?/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() 鍑芥暟鍏抽棴鐨勪絾浠嶆湁鏈彂閫佹暟鎹殑濂楁帴瀛椾笉鍙楀獎鍝嶏紝鏈彂閫佺殑鏁版嵁浠嶅皢琚彂閫併傜▼搴忚繍琛屾椂鍙兘浼?xì)澶殝啤璋冪?WSAStartuo() 鍑芥暟錛屼絾蹇呴』淇濊瘉姣忔璋冪敤鏃剁殑 wVersionRequested 鐨勫兼槸鐩稿悓鐨勩?/p>

銆銆2銆佸紓姝ヨ姹傛湇鍔?br />
銆銆Windows Sockets 闄ゆ敮鎸?Berkeley Sockets 涓悓姝ヨ姹傦紝榪樺鍔犱簡浜嗕竴綾誨紓姝ヨ姹傛湇鍔″嚱鏁?WSAAsyncGerXByY()銆傝鍑芥暟鏄樆濉炶姹傚嚱鏁扮殑寮傛鐗堟湰銆傚簲鐢ㄧ▼搴忚皟鐢ㄥ畠鏃訛紝鐢?Windows Sockets DLL 鍒濆鍖栬繖涓鎿嶄綔騫惰繑鍥炶皟鐢ㄨ咃紝姝ゅ嚱鏁拌繑鍥炰竴涓紓姝ュ彞鏌勶紝鐢ㄦ潵鏍囪瘑榪欎釜鎿嶄綔銆傚綋緇撴灉瀛樺偍鍦ㄨ皟鐢ㄨ呮彁渚涚殑緙撳啿鍖猴紝騫朵笖鍙戦佷竴涓秷鎭埌搴旂敤紼嬪簭鐩稿簲紿楀彛銆傚父鐢ㄧ粨鏋勫涓嬶細(xì)

HANDLE taskHnd;
char hostname="rs6000";
taskHnd = WSAAsyncBetHostByName(hWnd,wMsg,hostname,buf,buflen);

銆銆闇瑕佹敞鎰忕殑鏄紝鐢變簬 Windows 鐨勫唴瀛樺鍍忓彲浠ヨ緗負(fù)鍙Щ鍔ㄥ拰鍙涪寮冿紝鍥犳鍦ㄦ搷浣滃唴瀛樺璞℃槸錛屽繀欏諱繚璇?WIindows Sockets DLL 瀵硅薄鏄彲鐢ㄧ殑銆?

銆銆3銆佸紓姝ユ暟鎹紶杈?br />
銆銆浣跨敤 send() 鎴?sendto() 鍑芥暟鏉ュ彂閫佹暟鎹紝浣跨敤 recv() 鎴杛ecvfrom() 鏉ユ帴鏀舵暟鎹俉indows Sockets 涓嶉紦鍔辯敤鎴蜂嬌鐢ㄩ樆濉炴柟寮忎紶杈撴暟鎹紝鍥犱負(fù)閭f牱鍙兘浼?xì)闃诲鏁翠?Windows 鐜銆備笅闈㈡垜浠湅涓涓紓姝ユ暟鎹紶杈撳疄渚嬶細(xì)

銆銆鍋囪濂楁帴瀛?s 鍦ㄨ繛鎺ュ緩绔嬪悗錛屽凡緇忎嬌鐢ㄤ簡鍑芥暟 WSAAsyncSelect() 鍦ㄥ叾涓婃敞鍐屼簡緗戠粶浜嬩歡 FD_READ 鍜?FD_WRITE錛屽茍涓?wMsg 鍊間負(fù) 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)){...}


]]>Winsocket緙栫▼涔嬪鎺ュ瓧鍘熺悊http://m.shnenglu.com/eday/archive/2007/01/30/18189.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Tue, 30 Jan 2007 14:04:00 GMThttp://m.shnenglu.com/eday/archive/2007/01/30/18189.html涓銆佸鎴鋒満/鏈嶅姟鍣ㄦā寮?br />
銆銆鍦═CP/IP緗戠粶涓袱涓繘紼嬮棿鐨勭浉浜掍綔鐢ㄧ殑涓繪満妯″紡鏄鎴鋒満/鏈嶅姟鍣ㄦā寮?Client/Server model)銆傝妯″紡鐨勫緩绔嬪熀浜庝互涓嬩袱鐐癸細(xì)1銆侀潪瀵圭瓑浣滅敤錛?銆侀氫俊瀹屽叏鏄紓姝ョ殑銆傚鎴鋒満/鏈嶅姟鍣ㄦā寮忓湪鎿嶄綔榪囩▼涓噰鍙栫殑鏄富鍔ㄨ紺烘柟寮忥細(xì)

銆銆棣栧厛鏈嶅姟鍣ㄦ柟瑕佸厛鍚姩錛屽茍鏍規(guī)嵁璇風(fēng)ず鎻愪緵鐩稿簲鏈嶅姟錛氾紙榪囩▼濡備笅錛?br />
銆銆1銆佹墦寮涓閫氫俊閫氶亾騫跺憡鐭ユ湰鍦頒富鏈猴紝瀹冩効鎰忓湪鏌愪竴涓叕璁ゅ湴鍧涓婃帴鏀跺鎴瘋姹傘?br />
銆銆2銆佺瓑寰呭鎴瘋姹傚埌杈捐绔彛銆?br />
銆銆3銆佹帴鏀跺埌閲嶅鏈嶅姟璇鋒眰錛屽鐞嗚璇鋒眰騫跺彂閫佸簲絳斾俊鍙楓?br />
銆銆4銆佽繑鍥炵浜屾錛岀瓑寰呭彟涓瀹㈡埛璇鋒眰

銆銆5銆佸叧闂湇鍔″櫒銆?br />
銆銆瀹㈡埛鏂癸細(xì)

銆銆1銆佹墦寮涓閫氫俊閫氶亾錛屽茍榪炴帴鍒版湇鍔″櫒鎵鍦ㄤ富鏈虹殑鐗瑰畾绔彛銆?br />
銆銆2銆佸悜鏈嶅姟鍣ㄥ彂閫佹湇鍔¤姹傛姤鏂囷紝絳夊緟騫舵帴鏀跺簲絳旓紱緇х畫鎻愬嚭璇鋒眰鈥︹?br />
銆銆3銆佽姹傜粨鏉熷悗鍏抽棴閫氫俊閫氶亾騫剁粓姝€?/p>

銆銆浜屻佸熀鏈鎺ュ瓧

銆銆涓轟簡鏇村ソ璇存槑濂楁帴瀛楃紪紼嬪師鐞嗭紝緇欏嚭鍑犱釜鍩烘湰鐨勫鎺ュ瓧錛屽湪浠ュ悗鐨勭瘒騫呬腑浼?xì)缁欏嚭鏇磋缁嗙殑鋴社敤璇存槑銆?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 闈㈠悜榪炴帴鐨勫簲鐢ㄧ▼搴忔祦紼嬪浘




]]>Winsocket緙栫▼涔婽CP/IP浣撶郴緇撴瀯http://m.shnenglu.com/eday/archive/2007/01/30/18188.html鐙涔?jié)鍓?/dc:creator>鐙涔?jié)鍓?/author>Tue, 30 Jan 2007 13:59:00 GMThttp://m.shnenglu.com/eday/archive/2007/01/30/18188.html涓銆乀CP/IP 浣撶郴緇撴瀯涓庣壒鐐?/strong>

銆銆1銆乀CP/IP浣撶郴緇撴瀯

銆銆TCP/IP鍗忚瀹為檯涓婂氨鏄湪鐗╃悊緗戜笂鐨勪竴緇勫畬鏁寸殑緗戠粶鍗忚銆傚叾涓璗CP鏄彁渚涗紶杈撳眰鏈嶅姟錛岃孖P鍒欐槸鎻愪緵緗戠粶灞傛湇鍔°俆CP/IP鍖呮嫭浠ヤ笅鍗忚錛氾紙緇撴瀯濡傚浘1.1錛?/p>


(鍥?.1)

銆銆IP錛?緗戦棿鍗忚(Internet Protocol) 璐熻矗涓繪満闂存暟鎹殑璺敱鍜岀綉緇滀笂鏁版嵁鐨勫瓨鍌ㄣ傚悓鏃朵負(fù)ICMP錛孴CP錛屻銆銆UDP鎻愪緵鍒嗙粍鍙戦佹湇鍔°傜敤鎴瘋繘紼嬮氬父涓嶉渶瑕佹秹鍙?qiáng)杩欎竴灞傘?br />
銆銆ARP錛?鍦板潃瑙f瀽鍗忚(Address Resolution Protocol)
銆銆銆姝ゅ崗璁皢緗戠粶鍦板潃鏄犲皠鍒扮‖浠跺湴鍧銆?br />
銆銆RARP錛?鍙嶅悜鍦板潃瑙f瀽鍗忚(Reverse Address Resolution Protocol)
銆銆銆姝ゅ崗璁皢紜歡鍦板潃鏄犲皠鍒扮綉緇滃湴鍧

銆銆ICMP錛?緗戦棿鎶ユ枃鎺у埗鍗忚(Internet Control Message Protocol)
銆銆銆姝ゅ崗璁鐞嗕俊鍏沖拰涓繪満鐨勫樊閿欏拰浼犻佹帶鍒躲?br />
銆銆TCP錛?浼犻佹帶鍒跺崗璁?Transmission Control Protocol)
銆銆銆榪欐槸涓縐嶆彁渚涚粰鐢ㄦ埛榪涚▼鐨勫彲闈犵殑鍏ㄥ弻宸ュ瓧鑺傛祦闈㈠悜榪炴帴鐨勫崗璁傚畠瑕佷負(fù)鐢ㄦ埛榪涚▼鎻愪緵铏氱數(shù)璺湇鍔★紝騫朵負(fù)鏁版嵁鍙潬浼犺緭寤虹珛媯鏌ャ傦紙娉細(xì)澶у鏁扮綉緇滅敤鎴風(fēng)▼搴忎嬌鐢═CP錛?br />
銆銆UDP錛?鐢ㄦ埛鏁版嵁鎶ュ崗璁?User Datagram Protocol)
銆銆銆榪欐槸鎻愪緵緇欑敤鎴瘋繘紼嬬殑鏃犺繛鎺ュ崗璁紝鐢ㄤ簬浼犻佹暟鎹屼笉鎵ц姝g‘鎬ф鏌ャ?br />
銆銆FTP錛?鏂囦歡浼犺緭鍗忚(File Transfer Protocol)
銆銆銆鍏佽鐢ㄦ埛浠ユ枃浠舵搷浣滅殑鏂瑰紡錛堟枃浠剁殑澧炪佸垹銆佹敼銆佹煡銆佷紶閫佺瓑錛変笌鍙︿竴涓繪満鐩鎬簰閫氫俊銆?br />
銆銆SMTP錛?綆鍗曢偖浠朵紶閫佸崗璁?Simple Mail Transfer Protocol)
銆銆銆SMTP鍗忚涓虹郴緇熶箣闂翠紶閫佺數(shù)瀛愰偖浠躲?br />
銆銆TELNET錛氱粓绔崗璁?Telnet Terminal Procotol)
銆銆銆鍏佽鐢ㄦ埛浠ヨ櫄緇堢鏂瑰紡璁塊棶榪滅▼涓繪満

銆銆HTTP錛?瓚呮枃鏈紶杈撳崗璁?Hypertext Transfer Procotol)
銆銆
銆銆TFTP: 綆鍗曟枃浠朵紶杈撳崗璁?Trivial File Transfer Protocol)

銆銆2銆乀CP/IP鐗圭偣

銆銆TCP/IP鍗忚鐨勬牳蹇冮儴鍒嗘槸浼犺緭灞傚崗璁?TCP銆乁DP)錛岀綉緇滃眰鍗忚(IP)鍜岀墿鐞嗘帴鍙e眰錛岃繖涓夊眰閫氬父鏄湪鎿嶄綔緋葷粺鍐呮牳涓疄鐜般傚洜姝ょ敤鎴蜂竴鑸笉娑夊強(qiáng)銆傜紪紼嬫椂錛岀紪紼嬬晫闈㈡湁涓ょ褰㈠紡錛氫竴銆佹槸鐢卞唴鏍稿績鐩存帴鎻愪緵鐨勭郴緇熻皟鐢紱浜屻佷嬌鐢ㄤ互搴撳嚱鏁版柟寮忔彁渚涚殑鍚勭鍑芥暟銆傚墠鑰呬負(fù)鏍稿唴瀹炵幇錛屽悗鑰呬負(fù)鏍稿瀹炵幇銆傜敤鎴鋒湇鍔¤閫氳繃鏍稿鐨勫簲鐢ㄧ▼搴忔墠鑳藉疄鐜幫紝鎵浠ヨ浣跨敤濂楁帴瀛?socket)鏉ュ疄鐜般?br />
銆銆鍥?.2鏄疶CP/IP鍗忚鏍稿績涓庡簲鐢ㄧ▼搴忓叧緋誨浘銆?br />

(鍥?.2)

銆銆浜屻佷笓鐢ㄦ湳璇?/b>

銆銆1銆佸鎺ュ瓧

銆銆濂楁帴瀛楁槸緗戠粶鐨勫熀鏈瀯浠躲傚畠鏄彲浠ヨ鍛藉悕鍜屽鍧鐨勯氫俊绔偣錛屼嬌鐢ㄤ腑鐨勬瘡涓涓鎺ュ瓧閮芥湁鍏剁被鍨嬪拰涓涓笌涔嬬浉榪炲惉榪涚▼銆傚鎺ュ瓧瀛樺湪閫氫俊鍖哄煙錛堥氫俊鍖哄煙鍙堢О鍦板潃綈囷級涓傚鎺ュ瓧鍙笌鍚屼竴鍖哄煙涓殑濂楁帴瀛椾氦鎹㈡暟鎹紙璺ㄥ尯鍩熸椂錛岄渶瑕佹墽琛屾煇鍜岃漿鎹㈣繘紼嬫墠鑳藉疄鐜幫級銆俉INDOWS 涓殑濂楁帴瀛楀彧鏀寔涓涓煙鈥斺旂綉闄呭煙銆傚鎺ュ瓧鍏鋒湁綾誨瀷銆?br />
銆銆WINDOWS SOCKET 1.1 鐗堟湰鏀寔涓ょ濂楁帴瀛楋細(xì)嫻佸鎺ュ瓧(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>

]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              一本色道久久综合亚洲精品小说 | 国产一区在线播放| 亚洲精品久久| 麻豆av福利av久久av| 亚洲欧美另类在线观看| 欧美午夜不卡| 亚洲一级在线| 在线午夜精品| 欧美午夜久久| 一本色道久久88亚洲综合88| 欧美大尺度在线| 玖玖国产精品视频| 亚洲黄色av| 亚洲大胆视频| 久久夜色精品一区| 在线播放亚洲| 欧美aⅴ99久久黑人专区| 久久精品理论片| 欧美日韩伦理在线| 亚洲精品看片| 欧美激情视频网站| 老司机一区二区三区| 亚洲国产一区二区三区在线播| 欧美1级日本1级| 欧美不卡视频| 亚洲午夜精品久久| 中文在线资源观看视频网站免费不卡| 国产精品va| 欧美在线视频不卡| 久久蜜臀精品av| 最新亚洲一区| 亚洲最新在线视频| 国产麻豆午夜三级精品| 久久久综合精品| 欧美 日韩 国产一区二区在线视频| 亚洲精品中文字幕在线观看| 99视频精品| 国内精品久久久| 亚洲国产精品精华液2区45| 欧美日韩麻豆| 久久精品五月| 欧美区日韩区| 久久久999成人| 欧美69视频| 欧美一级视频免费在线观看| 美日韩精品视频| 亚洲影院免费| 久久久www成人免费精品| 亚洲另类春色国产| 午夜精品久久| 亚洲免费观看高清完整版在线观看熊| 在线亚洲电影| 在线看国产一区| 夜夜狂射影院欧美极品| 激情一区二区| 亚洲深夜福利视频| 一区精品在线播放| 一区二区三区国产精品| 在线观看国产精品淫| 一区二区三区四区国产| 18成人免费观看视频| 亚洲中字黄色| 一区二区三区av| 美国十次了思思久久精品导航| 亚洲网站在线观看| 久久香蕉国产线看观看av| 亚洲视频精选| 欧美精品一二三| 久久综合色播五月| 国产精品乱码| 99视频超级精品| 亚洲人成在线播放| 久久一区二区精品| 久久久夜精品| 国产手机视频一区二区| 在线亚洲电影| 亚洲影院一区| 欧美日韩一区在线视频| 欧美va亚洲va香蕉在线| 99riav1国产精品视频| 国产精品久99| 亚洲大片免费看| 激情五月婷婷综合| 午夜精品视频网站| 午夜精品在线| 国产精品你懂的在线| 99re热精品| 亚洲一二三四区| 欧美日韩亚洲一区二区三区四区| 亚洲第一精品福利| 亚洲国产精品成人一区二区| 久久人人超碰| 欧美大片第1页| **性色生活片久久毛片| 久久裸体视频| 欧美顶级少妇做爰| 亚洲国产欧美一区二区三区同亚洲| 亚洲嫩草精品久久| 欧美中文在线免费| 国内成+人亚洲| 久久综合精品国产一区二区三区| 噜噜爱69成人精品| 91久久国产综合久久蜜月精品 | 久久精品免费| 黄色在线成人| 欧美黑人在线观看| 99riav国产精品| 欧美一区二区高清在线观看| 国外成人在线视频| 欧美大片国产精品| 一本色道88久久加勒比精品| 性色av一区二区三区在线观看| 国产精品国产三级国产aⅴ入口 | 欧美福利视频在线| 99精品国产福利在线观看免费| 亚洲欧美成人网| 国产视频一区免费看| 久热爱精品视频线路一| 亚洲靠逼com| 欧美一区二区在线看| 一区二区三区在线免费观看| 欧美精品免费在线| 亚洲欧美日本另类| 欧美黄色免费| 亚洲欧美伊人| 好吊色欧美一区二区三区视频| 欧美/亚洲一区| 中文在线资源观看网站视频免费不卡| 欧美一区1区三区3区公司| 激情综合激情| 欧美日韩视频在线一区二区观看视频| 午夜精品久久一牛影视| 欧美激情亚洲| 欧美伊人久久久久久午夜久久久久| 伊人成人在线视频| 欧美午夜电影在线观看| 久久久久久久性| 亚洲午夜电影在线观看| 欧美刺激午夜性久久久久久久| 国产精品夜夜夜| 欧美激情综合色综合啪啪| 欧美一级久久久| 99re这里只有精品6| 麻豆成人av| 欧美一级二区| 国语自产精品视频在线看| 亚洲精品久久久蜜桃| 欧美在线一区二区| 日韩视频在线播放| 国产在线不卡| 国产精品国内视频| 欧美国产91| 久久精品日产第一区二区三区| 一区二区三区视频免费在线观看| 男人的天堂亚洲在线| 欧美一级夜夜爽| 亚洲欧美区自拍先锋| 亚洲久久视频| 在线观看欧美黄色| 国产欧美日韩激情| 国产精品99免视看9| 欧美日韩精品免费观看视频完整| 久久精品人人做人人综合 | 欧美一区二区在线播放| 夜夜精品视频| 亚洲欧洲一区二区三区在线观看| 久久亚洲欧美| 久久精品视频网| 久久精品九九| 香蕉久久夜色精品国产| 亚洲视频欧美在线| 国产精品久久久| 欧美日韩亚洲视频| 欧美日本在线看| 欧美成人国产一区二区| 久久久水蜜桃| 六月天综合网| 免费一区视频| 欧美成人精品福利| 免费视频一区二区三区在线观看| 久久综合99re88久久爱| 久久亚洲欧美| 免费观看亚洲视频大全| 久久全球大尺度高清视频| 久久久一二三| 久久综合五月| 欧美激情亚洲一区| 欧美另类专区| 欧美日韩一区二区三区在线视频| 欧美精品一区二区三区久久久竹菊| 免费在线欧美黄色| 欧美日韩国产经典色站一区二区三区| 欧美成人黄色小视频| 欧美日韩国产不卡| 欧美性大战久久久久久久蜜臀| 欧美亚男人的天堂| 国产日韩欧美中文| 红桃视频欧美| 亚洲精品乱码久久久久久按摩观| 亚洲美女色禁图|