锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
2 bool GetProxyIP( std::wstring& strIP )
3 {
4 strIP.clear();
5 LPCWSTR pszIP = GetEditBoxText( IDC_DLG_LOGIN_SETTING_EDIT_ADDRESS );
6 if( pszIP == NULL || !wcscmp( pszIP, TEXT("") ) )
7 return false;
8
9 std::wstring strTemp = pszIP;
10 std::wstring::size_type nPos1, nPos2;
11 nPos1 = nPos2 = 0;
12 int nIP[4] = {0};
13 std::wstring::size_type i = 0;
14 for( ; (i < 4) && (nPos2 != std::wstring::npos ); ++i )
15 {
16 if( nPos2 == 0 )
17 nPos1 = nPos2;
18 else
19 nPos1 = nPos2 + 1;
20
21 nPos2 = strTemp.find( TEXT('.'), nPos1);
22 std::wstring::size_type nCount = std::wstring::npos;
23 if( nPos2 != std::wstring::npos )
24 nCount = nPos2 - nPos1;
25
26 std::wstring strSub = strTemp.substr(nPos1, nCount);
27 if( strSub == TEXT("") )
28 return false;
29
30 int nValue = _wtoi( strSub.c_str() );
31 if( nValue < 0 || nValue > 255 )
32 return false;
33 nIP[i] = nValue;
34 }
35
36 if( i < 4 )
37 return false;
38 wchar_t szIP[100] = {0};
39 wsprintf( szIP, TEXT("%d.%d.%d.%d"), nIP[0], nIP[1], nIP[2], nIP[3] );
40 strIP = szIP;
41 return true;
42 }
]]>
浣滆咃細(xì) Chandrasekhar Vuppalapati
緲昏瘧錛歟astvc
Character range(decimal) | Type | Values | Safe/Unsafe |
0-31 | ASCII Control Characters | These characters are not printable | Unsafe |
32-47 | Reserved Characters | '' ''!?#$%&''()*+,-./ | Unsafe |
48-57 | ASCII Characters and Numbers | 0-9 | Safe |
58-64 | Reserved Characters | :;<=>?@ | Unsafe |
65-90 | ASCII Characters | A-Z | Safe |
91-96 | Reserved Characters | [\]^_` | Unsafe |
97-122 | ASCII Characters | a-z | Safe |
123-126 | Reserved Characters | {|}~ | Unsafe |
127 | Control Characters | '' '' | Unsafe |
128-255 | Non-ASCII Characters | '' '' | Unsafe |
鎵鏈変笉瀹夊叏鐨凙SCII瀛楃閮介渶瑕佺紪鐮侊紝渚嬪錛岃寖鍥?32-47, 58-64, 91-96, 123-126)銆?br />涓嬭〃鎻忚堪浜嗚繖浜涘瓧絎︿負(fù)浠涔堜笉瀹夊叏銆?
Character | Unsafe Reason | Character Encode |
"<" | Delimiters around URLs in free text | %3C |
> | Delimiters around URLs in free text | %3E |
. | Delimits URLs in some systems | %22 |
# | It is used in the World Wide Web and in other systems to delimit a URL from a fragment/anchor identifier that might follow it. | %23 |
{ | Gateways and other transport agents are known to sometimes modify such characters | %7B |
} | Gateways and other transport agents are known to sometimes modify such characters | %7D |
| | Gateways and other transport agents are known to sometimes modify such characters | %7C |
\ | Gateways and other transport agents are known to sometimes modify such characters | %5C |
^ | Gateways and other transport agents are known to sometimes modify such characters | %5E |
~ | Gateways and other transport agents are known to sometimes modify such characters | %7E |
[ | Gateways and other transport agents are known to sometimes modify such characters | %5B |
] | Gateways and other transport agents are known to sometimes modify such characters | %5D |
` | Gateways and other transport agents are known to sometimes modify such characters | %60 |
+ | Indicates a space (spaces cannot be used in a URL) | %20 |
/ | Separates directories and subdirectories | %2F |
? | Separates the actual URL and the parameters | %3F |
& | Separator between parameters specified in the URL | %26 |
濡備綍瀹炵幇
瀛楃鐨刄RL緙栫爜鏄皢瀛楃杞崲鍒?浣?6榪涘埗騫跺湪鍓嶉潰鍔犱笂''%''鍓嶇紑銆備緥濡傦紝US-ASCII瀛楃闆嗕腑絀烘牸鏄?0榪涘埗
鐨?2鎴?6榪涘埗鐨?0錛屽洜姝わ紝URL緙栫爜鏄?20銆?/p>
URLEncode: URLEncode鏄竴涓狢++綾伙紝鏉ュ疄鐜板瓧絎︿覆鐨刄RL緙栫爜銆侰URLEncode綾誨寘鍚涓嬪嚱鏁幫細(xì)
isUnsafeString
decToHex
convert
URLEncode
URLEncode()鍑芥暟瀹屾垚緙栫爜榪囩▼錛孶RLEncode媯鏌ユ瘡涓瓧絎︼紝鐪嬫槸鍚﹀畨鍏ㄣ傚鏋滀笉瀹夊叏灝嗙敤%16榪涘埗鍊艱繘琛岃漿鎹㈠茍娣誨姞
鍒板師濮嬪瓧絎︿覆涓?/p>
浠g爜鐗囨柇 :
class CURLEncode { private: static CString csUnsafeString; CString (char num, int radix); bool isUnsafe(char compareChar); CString convert(char val); public: CURLEncode() { }; virtual ~CURLEncode() { }; CString (CString vData); }; bool CURLEncode::isUnsafe(char compareChar) { bool bcharfound = false; char tmpsafeChar; int m_strLen = 0; m_strLen = csUnsafeString.GetLength(); for(int ichar_pos = 0; ichar_pos < m_strLen ;ichar_pos++) { tmpsafeChar = csUnsafeString.GetAt(ichar_pos); if(tmpsafeChar == compareChar) { bcharfound = true; break; } } int char_ascii_value = 0; //char_ascii_value = __toascii(compareChar); char_ascii_value = (int) compareChar; if(bcharfound == false && char_ascii_value > 32 && char_ascii_value < 123) { return false; } // found no unsafe chars, return false else { return true; } return true; } CString CURLEncode::decToHex(char num, int radix) { int temp=0; CString csTmp; int num_char; num_char = (int) num; if (num_char < 0) num_char = 256 + num_char; while (num_char >= radix) { temp = num_char % radix; num_char = (int)floor(num_char / radix); csTmp = hexVals[temp]; } csTmp += hexVals[num_char]; if(csTmp.GetLength() < 2) { csTmp += ''0''; } CString strdecToHex(csTmp); // Reverse the String strdecToHex.MakeReverse(); return strdecToHex; } CString CURLEncode::convert(char val) { CString csRet; csRet += "%"; csRet += decToHex(val, 16); return csRet; }
鍘熸枃鍑哄錛?a target="_blank">http://msdn.microsoft.com/msdnmag/issues/1000/Winsock/
閫氬父瑕佸紑鍙戠綉緇滃簲鐢ㄧ▼搴忓茍涓嶆槸涓浠惰交鏉劇殑浜嬫儏錛屼笉榪囷紝瀹為檯涓婂彧瑕佹帉鎻″嚑涓叧閿殑鍘熷垯涔熷氨鍙互浜嗏斺斿垱寤哄拰榪炴帴涓涓鎺ュ瓧錛屽皾璇曡繘琛岃繛鎺ワ紝鐒跺悗鏀跺彂鏁版嵁銆傜湡姝i毦鐨勬槸瑕佸啓鍑轟竴涓彲浠ユ帴綰沖皯鍒欎竴涓紝澶氬垯鏁板崈涓繛鎺ョ殑緗戠粶搴旂敤紼嬪簭銆傛湰鏂囧皢璁ㄨ濡備綍閫氳繃Winsock2鍦╓indows NT 鍜?Windows 2000涓婂紑鍙戦珮鎵╁睍鑳藉姏鐨刉insock搴旂敤紼嬪簭銆傛枃绔犱富瑕佺殑鐒︾偣鍦ㄥ鎴鋒満/鏈嶅姟鍣ㄦā鍨嬬殑鏈嶅姟鍣ㄨ繖涓鏂癸紝褰撶劧錛屽叾涓殑璁稿瑕佺偣瀵規(guī)ā鍨嬬殑鍙屾柟閮介傜敤銆?
API涓庡搷搴旇妯?/strong>
閫氳繃Win32鐨勯噸鍙營/O鏈哄埗錛屽簲鐢ㄧ▼搴忓彲浠ユ彁璇蜂竴欏笽/O鎿嶄綔錛岄噸鍙犵殑鎿嶄綔璇鋒眰鍦ㄥ悗鍙板畬鎴愶紝鑰屽悓涓鏃墮棿鎻愯鎿嶄綔鐨勭嚎紼嬪幓鍋氬叾浠栫殑浜嬫儏銆傜瓑閲嶅彔鎿嶄綔瀹屾垚鍚庣嚎紼嬫敹鍒版湁鍏崇殑閫氱煡銆傝繖縐嶆満鍒跺閭d簺鑰楁椂鐨勬搷浣滆岃█鐗瑰埆鏈夌敤銆備笉榪囷紝鍍廤indows 3.1涓婄殑WSAAsyncSelect()鍙?qiáng)Unix涓嬬殑select()閭f牱鐨勫嚱鏁拌櫧鐒舵槗浜庝嬌鐢紝浣嗘槸瀹冧滑涓嶈兘婊¤凍鍝嶅簲瑙勬ā鐨勯渶瑕併傝屽畬鎴愮鍙f満鍒舵槸閽堝鎿嶄綔緋葷粺鍐呴儴榪涜浜嗕紭鍖栵紝鍦╓indows NT 鍜?Windows 2000涓婏紝浣跨敤浜嗗畬鎴愮鍙g殑閲嶅彔I/O鏈哄埗鎵嶈兘澶熺湡姝f墿澶х郴緇熺殑鍝嶅簲瑙勬ā銆?/p>
瀹屾垚绔彛
涓涓畬鎴愮鍙e叾瀹炲氨鏄竴涓氱煡闃熷垪錛岀敱鎿嶄綔緋葷粺鎶婂凡緇忓畬鎴愮殑閲嶅彔I/O璇鋒眰鐨勯氱煡鏀懼叆鍏朵腑銆傚綋鏌愰」I/O鎿嶄綔涓鏃﹀畬鎴愶紝鏌愪釜鍙互瀵硅鎿嶄綔緇撴灉榪涜澶勭悊鐨勫伐浣滆呯嚎紼嬪氨浼?xì)鏀跺堫C竴鍒欓氱煡銆傝屽鎺ュ瓧鍦ㄨ鍒涘緩鍚庯紝鍙互鍦ㄤ換浣曟椂鍊欎笌鏌愪釜瀹屾垚绔彛榪涜鍏寵仈銆?/p>
閫氬父鎯呭喌涓嬶紝鎴戜滑浼?xì)鍦ㄥ簲鐢ńE嬪簭涓垱寤轟竴瀹氭暟閲忕殑宸ヤ綔鑰呯嚎紼嬫潵澶勭悊榪欎簺閫氱煡銆傜嚎紼嬫暟閲忓彇鍐充簬搴旂敤紼嬪簭鐨勭壒瀹氶渶瑕併傜悊鎯崇殑鎯呭喌鏄紝綰跨▼鏁伴噺絳変簬澶勭悊鍣ㄧ殑鏁伴噺錛屼笉榪囪繖涔熻姹備換浣曠嚎紼嬮兘涓嶅簲璇ユ墽琛岃濡傚悓姝ヨ鍐欍佺瓑寰呬簨浠墮氱煡絳夐樆濉炲瀷鐨勬搷浣滐紝浠ュ厤綰跨▼闃誨銆傛瘡涓嚎紼嬮兘灝嗗垎鍒頒竴瀹氱殑CPU鏃墮棿錛屽湪姝ゆ湡闂磋綰跨▼鍙互榪愯錛岀劧鍚庡彟涓涓嚎紼嬪皢鍒嗗埌涓涓椂闂寸墖騫跺紑濮嬫墽琛屻傚鏋滄煇涓嚎紼嬫墽琛屼簡闃誨鍨嬬殑鎿嶄綔錛屾搷浣滅郴緇熷皢鍓ュず鍏舵湭浣跨敤鐨勫墿浣欐椂闂寸墖騫惰鍏跺畠綰跨▼寮濮嬫墽琛屻備篃灝辨槸璇達(dá)紝鍓嶄竴涓嚎紼嬫病鏈夊厖鍒嗕嬌鐢ㄥ叾鏃墮棿鐗囷紝褰撳彂鐢熻繖鏍風(fēng)殑鎯呭喌鏃訛紝搴旂敤紼嬪簭搴旇鍑嗗鍏跺畠綰跨▼鏉ュ厖鍒嗗埄鐢ㄨ繖浜涙椂闂寸墖銆?/p>
瀹屾垚绔彛鐨勪嬌鐢ㄥ垎涓轟袱姝ャ傞鍏堝垱寤哄畬鎴愮鍙o紝濡備互涓嬩唬鐮佹墍紺猴細(xì)
HANDLE hIocp; hIocp = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, (ULONG_PTR)0, 0); if (hIocp == NULL) { // Error }瀹屾垚绔彛鍒涘緩鍚庯紝瑕佹妸灝嗕嬌鐢ㄨ瀹屾垚绔彛鐨勫鎺ュ瓧涓庝箣鍏寵仈璧鋒潵銆傛柟娉曟槸鍐嶆璋冪敤CreateIoCompletionPort ()鍑芥暟錛岀涓涓弬鏁癋ileHandle璁句負(fù)濂楁帴瀛楃殑鍙ユ焺錛岀浜屼釜鍙傛暟ExistingCompletionPort 璁句負(fù)鍒氬垰鍒涘緩鐨勯偅涓畬鎴愮鍙g殑鍙ユ焺銆?br />浠ヤ笅浠g爜鍒涘緩浜嗕竴涓鎺ュ瓧錛屽茍鎶婂畠鍜屽墠闈㈠垱寤虹殑瀹屾垚绔彛鍏寵仈璧鋒潵錛?
SOCKET s; s = socket(AF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) { // Error if (CreateIoCompletionPort((HANDLE)s, hIocp, (ULONG_PTR)0, 0) == NULL) { // Error } ... }
鍦ㄥ垱寤轟簡瀹屾垚绔彛銆佸皢涓涓垨澶氫釜濂楁帴瀛椾笌涔嬬浉鍏寵仈涔嬪悗錛屾垜浠氨瑕佸垱寤鴻嫢騫蹭釜綰跨▼鏉ュ鐞嗗畬鎴愰氱煡銆傝繖浜涚嚎紼嬩笉鏂驚鐜皟鐢℅etQueuedCompletionStatus ()鍑芥暟騫惰繑鍥炲畬鎴愰氱煡銆?/p>
涓嬮潰錛屾垜浠厛鏉ョ湅鐪嬪簲鐢ㄧ▼搴忓浣曡窡韙繖浜涢噸鍙犳搷浣溿傚綋搴旂敤紼嬪簭璋冪敤涓涓噸鍙犳搷浣滃嚱鏁版椂錛岃鎶婃寚鍚戜竴涓猳verlapped緇撴瀯鐨勬寚閽堝寘鎷湪鍏跺弬鏁頒腑銆傚綋鎿嶄綔瀹屾垚鍚庯紝鎴戜滑鍙互閫氳繃GetQueuedCompletionStatus()鍑芥暟涓嬁鍥炶繖涓寚閽堛備笉榪囷紝鍗曟槸鏍規(guī)嵁榪欎釜鎸囬拡鎵鎸囧悜鐨刼verlapped 緇撴瀯錛屽簲鐢ㄧ▼搴忓茍涓嶈兘鍒嗚鯨絀剁珶瀹屾垚鐨勬槸鍝釜鎿嶄綔銆傝瀹炵幇瀵規(guī)搷浣滅殑璺熻釜錛屼綘鍙互鑷繁瀹氫箟涓涓狾VERLAPPED緇撴瀯錛屽湪鍏朵腑鍔犲叆鎵闇鐨勮窡韙俊鎭?/p>
鏃犺浣曟椂璋冪敤閲嶅彔鎿嶄綔鍑芥暟鏃訛紝鎬繪槸浼?xì)閫氳繃鍏秎pOverlapped鍙傛暟浼犻掍竴涓狾VERLAPPEDPLUS緇撴瀯(渚嬪WSASend銆?WSARecv絳夊嚱鏁?銆傝繖灝卞厑璁鎬綘涓烘瘡涓涓噸鍙犺皟鐢ㄦ搷浣滆緗煇浜涙搷浣滅姸鎬佷俊鎭紝褰撴搷浣滅粨鏉熷悗錛屼綘鍙互閫氳繃 GetQueuedCompletionStatus()鍑芥暟鑾峰緱浣犺嚜瀹氫箟緇撴瀯鐨勬寚閽堛傛敞鎰廜VERLAPPED瀛楁涓嶈姹備竴瀹氭槸榪欎釜鎵╁睍鍚庣殑緇撴瀯鐨勭涓涓瓧孌點(diǎn)傚綋寰楀埌浜嗘寚鍚慜VERLAPPED緇撴瀯鐨勬寚閽堜互鍚庯紝鍙互鐢–ONTAINING_RECORD瀹忓彇鍑哄叾涓寚鍚戞墿灞曠粨鏋勭殑鎸囬拡銆?/p>
OVERLAPPED 緇撴瀯鐨勫畾涔夊涓嬶細(xì)
typedef struct _OVERLAPPEDPLUS { OVERLAPPED ol; SOCKET s, sclient; int OpCode; WSABUF wbuf; DWORD dwBytes, dwFlags; // 鍏跺畠鏈夌敤鐨勪俊鎭? } OVERLAPPEDPLUS; #define OP_READ 0 #define OP_WRITE 1 #define OP_ACCEPT 2涓嬮潰璁╂垜浠潵鐪嬬湅宸ヤ綔鑰呯嚎紼嬬殑鎯呭喌銆?br />
DWORD WINAPI WorkerThread(LPVOID lpParam) { ULONG_PTR *PerHandleKey; OVERLAPPED *Overlap; OVERLAPPEDPLUS *OverlapPlus, *newolp; DWORD dwBytesXfered; while (1) { ret = GetQueuedCompletionStatus( hIocp, &dwBytesXfered, (PULONG_PTR)&PerHandleKey, &Overlap, INFINITE); if (ret == 0) { // Operation failed continue; } OverlapPlus = CONTAINING_RECORD(Overlap, OVERLAPPEDPLUS, ol); switch (OverlapPlus->OpCode) { case OP_ACCEPT: // Client socket is contained in OverlapPlus.sclient // Add client to completion port CreateIoCompletionPort( (HANDLE)OverlapPlus->sclient, hIocp, (ULONG_PTR)0, 0); // Need a new OVERLAPPEDPLUS structure // for the newly accepted socket. Perhaps // keep a look aside list of free structures. newolp = AllocateOverlappedPlus(); if (!newolp) { // Error } newolp->s = OverlapPlus->sclient; newolp->OpCode = OP_READ; // This function prepares the data to be sent PrepareSendBuffer(&newolp->wbuf); ret = WSASend( newolp->s, &newolp->wbuf, 1, &newolp->dwBytes, 0, &newolp.ol, NULL); if (ret == SOCKET_ERROR) { if (WSAGetLastError() != WSA_IO_PENDING) { // Error } } // Put structure in look aside list for later use FreeOverlappedPlus(OverlapPlus); // Signal accept thread to issue another AcceptEx SetEvent(hAcceptThread); break; case OP_READ: // Process the data read // ... // Repost the read if necessary, reusing the same // receive buffer as before memset(&OverlapPlus->ol, 0, sizeof(OVERLAPPED)); ret = WSARecv( OverlapPlus->s, &OverlapPlus->wbuf, 1, &OverlapPlus->dwBytes, &OverlapPlus->dwFlags, &OverlapPlus->ol, NULL); if (ret == SOCKET_ERROR) { if (WSAGetLastError() != WSA_IO_PENDING) { // Error } } break; case OP_WRITE: // Process the data sent, etc. break; } // switch } // while } // WorkerThread鍏朵腑姣忓彞鏌勯敭(PerHandleKey)鍙橀噺鐨勫唴瀹癸紝鏄湪鎶婂畬鎴愮鍙d笌濂楁帴瀛楄繘琛屽叧鑱旀椂鎵璁劇疆鐨勫畬鎴愰敭鍙傛暟錛汷verlap鍙傛暟榪斿洖鐨勬槸涓涓寚鍚戝彂鍑洪噸鍙犳搷浣滄椂鎵浣跨敤鐨勯偅涓狾VERLAPPEDPLUS緇撴瀯鐨勬寚閽堛?
瑕佽浣忥紝濡傛灉閲嶅彔鎿嶄綔璋冪敤澶辮觸鏃?涔熷氨鏄錛岃繑鍥炲兼槸SOCKET_ERROR錛屽茍涓旈敊璇師鍥犱笉鏄疻SA_IO_PENDING)錛岄偅涔堝畬鎴愮鍙e皢涓嶄細(xì)鏀跺埌浠諱綍瀹屾垚閫氱煡銆傚鏋滈噸鍙犳搷浣滆皟鐢ㄦ垚鍔燂紝鎴栬呭彂鐢熷師鍥犳槸WSA_IO_PENDING鐨勯敊璇椂錛屽畬鎴愮鍙e皢鎬繪槸鑳藉鏀跺埌瀹屾垚閫氱煡銆?br />
Windows NT鍜學(xué)indows 2000鐨勫鎺ュ瓧鏋舵瀯
瀵逛簬寮鍙戝ぇ鍝嶅簲瑙勬ā鐨刉insock搴旂敤紼嬪簭鑰岃█錛屽Windows NT鍜學(xué)indows 2000鐨勫鎺ュ瓧鏋舵瀯鏈夊熀鏈殑浜嗚В鏄緢鏈夊府鍔╃殑銆備笅鍥炬槸Windows 2000涓殑Winsock鏋舵瀯錛?br />
涓庡叾瀹冪被鍨嬫搷浣滅郴緇熶笉鍚岋紝W(xué)indows NT鍜學(xué)indows 2000鐨勪紶杈撳崗璁病鏈変竴縐嶉鏍煎儚濂楁帴瀛楅偅鏍風(fēng)殑銆佸彲浠ュ拰搴旂敤紼嬪簭鐩存帴浜よ皥鐨勭晫闈紝鑰屾槸閲囩敤浜嗕竴縐嶆洿涓哄簳灞傜殑API錛屽彨鍋氫紶杈撻┍鍔ㄧ▼搴忕晫闈?Transport Driver Interface,TDI)銆俉insock鐨勬牳蹇冩ā寮忛┍鍔ㄧ▼搴忚礋璐h繛鎺ュ拰緙撳啿鍖虹鐞嗭紝浠ヤ究鍚戝簲鐢ㄧ▼搴忔彁渚涘鎺ュ瓧浠跨湡(鍦ˋFD.SYS鏂囦歡涓疄鐜?錛屽悓鏃惰礋璐d笌搴曞眰浼犺緭椹卞姩紼嬪簭瀵硅瘽銆?/p>
璋佹潵璐熻矗綆$悊緙撳啿鍖猴紵
姝e涓婇潰鎵璇寸殑錛屽簲鐢ㄧ▼搴忛氳繃Winsock鏉ュ拰浼犺緭鍗忚椹卞姩紼嬪簭浜よ皥錛岃孉FD.SYS璐熻矗涓哄簲鐢ㄧ▼搴忚繘琛岀紦鍐插尯綆$悊銆備篃灝辨槸璇達(dá)紝褰撳簲鐢ㄧ▼搴忚皟鐢?send()鎴朩SASend()鍑芥暟鏉ュ彂閫佹暟鎹椂錛孉FD.SYS灝嗘妸鏁版嵁鎷瘋礉榪涘畠鑷繁鐨勫唴閮ㄧ紦鍐插尯(鍙栧喅浜嶴O_SNDBUF璁懼畾鍊?錛岀劧鍚巗end ()鎴朩SASend()鍑芥暟绔嬪嵆榪斿洖銆備篃鍙互榪欎箞璇達(dá)紝AFD.SYS鍦ㄥ悗鍙拌礋璐f妸鏁版嵁鍙戦佸嚭鍘匯備笉榪囷紝濡傛灉搴旂敤紼嬪簭瑕佹眰鍙戝嚭鐨勬暟鎹秴榪囦簡 SO_SNDBUF璁懼畾鐨勭紦鍐插尯澶у皬錛岄偅涔圵SASend()鍑芥暟浼?xì)闃诲锛岀洿鑷虫墍鏈夋暟鎹彂閫佸畬姣曘?/p>
浠庤繙紼嬪鎴風(fēng)鎺ユ敹鏁版嵁鐨勬儏鍐典篃綾諱技銆傚彧瑕佷笉鐢ㄤ粠搴旂敤紼嬪簭閭i噷鎺ユ敹澶ч噺鐨勬暟鎹紝鑰屼笖娌℃湁瓚呭嚭SO_RCVBUF璁懼畾鐨勫鹼紝AFD.SYS灝嗘妸鏁版嵁鍏堟嫹璐濆埌鍏跺唴閮ㄧ紦鍐插尯涓傚綋搴旂敤紼嬪簭璋冪敤recv()鎴朩SARecv()鍑芥暟鏃訛紝鏁版嵁灝嗕粠鍐呴儴緙撳啿鎷瘋礉鍒板簲鐢ㄧ▼搴忔彁渚涚殑緙撳啿鍖恒?/p>
澶氭暟鎯呭喌涓嬶紝榪欐牱鐨勬灦鏋勮繍琛岃壇濂斤紝鐗瑰埆鍦ㄦ槸搴旂敤紼嬪簭閲囩敤浼犵粺鐨勫鎺ュ瓧涓嬮潪閲嶅彔鐨剆end()鍜宺eceive()妯″紡緙栧啓鐨勬椂鍊欍備笉榪囩▼搴忓憳瑕佸皬蹇冪殑鏄紝灝界鍙互閫氳繃setsockopt()榪欎釜API鏉ユ妸SO_SNDBUF鍜孲O_RCVBUF閫夐」鍊艱鎴?(鍏抽棴鍐呴儴緙撳啿鍖?錛屼絾鏄▼搴忓憳蹇呴』鍗佸垎娓呮鎶?AFD.SYS鐨勫唴閮ㄧ紦鍐插尯鍏蟲帀浼?xì)閫犳垚浠涔堝悗鏋滐紝閬垮厤鏀跺彂鏁版嵁鏃舵湁鍏崇殑緙撳啿鍖烘嫹璐濆彲鑳藉紩璧風(fēng)殑緋葷粺宕╂簝銆?/p>
涓句緥鏉ヨ錛屼竴涓簲鐢ㄧ▼搴忛氳繃璁懼畾SO_SNDBUF涓?鎶婄紦鍐插尯鍏抽棴錛岀劧鍚庡彂鍑轟竴涓樆濉瀞end()璋冪敤銆傚湪榪欐牱鐨勬儏鍐典笅錛岀郴緇熷唴鏍鎬細(xì)鎶婂簲鐢ㄧ▼搴忕殑緙撳啿鍖洪攣瀹氾紝鐩村埌鎺ユ敹鏂圭‘璁ゆ敹鍒頒簡鏁翠釜緙撳啿鍖哄悗send()璋冪敤鎵嶈繑鍥炪備技涔庤繖鏄竴縐嶅垽瀹氫綘鐨勬暟鎹槸鍚﹀凡緇忎負(fù)瀵規(guī)柟鍏ㄩ儴鏀跺埌鐨勭畝媧佺殑鏂規(guī)硶錛屽疄闄呬笂鍗村茍闈炲姝ゃ傛兂鎯崇湅錛屽嵆浣胯繙绔疶CP 閫氱煡鏁版嵁宸茬粡鏀跺埌錛屽叾瀹炰篃鏍規(guī)湰涓嶄唬琛ㄦ暟鎹凡緇忔垚鍔熼佺粰瀹㈡埛绔簲鐢ㄧ▼搴忥紝姣斿瀵規(guī)柟鍙兘鍙戠敓璧勬簮涓嶈凍鐨勬儏鍐碉紝瀵艱嚧AFD.SYS涓嶈兘鎶婃暟鎹嫹璐濈粰搴旂敤紼嬪簭銆傚彟涓涓洿瑕佺揣鐨勯棶棰樻槸錛屽湪姣忎釜綰跨▼涓瘡嬈″彧鑳借繘琛屼竴嬈″彂閫佽皟鐢紝鏁堢巼鏋佸叾浣庝笅銆?/p>
鎶奡O_RCVBUF璁句負(fù)0錛屽叧闂瑼FD.SYS鐨勬帴鏀剁紦鍐插尯涔熶笉鑳借鎬ц兘寰楀埌鎻愬崌錛岃繖鍙細(xì)榪嬌鎺ユ敹鍒扮殑鏁版嵁鍦ㄦ瘮Winsock鏇翠綆鐨勫眰嬈¤繘琛岀紦鍐詫紝褰撲綘鍙戝嚭receive璋冪敤鏃訛紝鍚屾牱瑕佽繘琛岀紦鍐插尯鎷瘋礉錛屽洜姝や綘鏈潵鎯抽伩鍏嶇紦鍐插尯鎷瘋礉鐨勯槾璋嬩笉浼?xì)寰楅炪?/p>
鐜板湪鎴戜滑搴旇娓呮浜嗭紝鍏抽棴緙撳啿鍖哄浜庡鏁板簲鐢ㄧ▼搴忚岃█騫朵笉鏄粈涔堝ソ涓繪剰銆傚彧瑕佽搴旂敤紼嬪簭娉ㄦ剰闅忔椂鍦ㄦ煇涓繛鎺ヤ笂淇濇寔鍑犱釜WSARecvs閲嶅彔璋冪敤錛岄偅涔堥氬父娌℃湁蹇呰鍏抽棴鎺ユ敹緙撳啿鍖恒傚鏋淎FD.SYS鎬繪槸鏈夌敱搴旂敤紼嬪簭鎻愪緵鐨勭紦鍐插尯鍙敤錛岄偅涔堝畠?yōu)畣娌℃湁蹇呰鋴社敤鍐呴儴缂撳啿鍖恒?/p>
楂樻ц兘鐨勬湇鍔″櫒搴旂敤紼嬪簭鍙互鍏抽棴鍙戦佺紦鍐插尯錛屽悓鏃朵笉浼?xì)鎹熷け鎬ц兘銆備笉榪囷紝榪欐牱鐨勫簲鐢ㄧ▼搴忓繀欏誨崄鍒嗗皬蹇冿紝淇濊瘉瀹冩繪槸鍙戝嚭澶氫釜閲嶅彔鍙戦佽皟鐢紝鑰屼笉鏄瓑寰呮煇涓噸鍙犲彂閫佺粨鏉熶簡鎵嶅彂鍑轟笅涓涓傚鏋滃簲鐢ㄧ▼搴忔槸鎸変竴涓彂瀹屽啀鍙戜笅涓涓殑欏哄簭鏉ユ搷浣滐紝閭f氮璐規(guī)帀涓ゆ鍙戦佷腑闂寸殑絀烘。鏃墮棿錛屾諱箣鏄淇濊瘉浼犺緭椹卞姩紼嬪簭鍦ㄥ彂閫佸畬涓涓紦鍐插尯鍚庯紝绔嬪埢鍙互杞悜鍙︿竴涓紦鍐插尯銆?/p>
璧勬簮鐨勯檺鍒舵潯浠?/strong>
鍦ㄨ璁′換浣曟湇鍔″櫒搴旂敤紼嬪簭鏃訛紝鍏跺己鍋ユф槸涓昏鐨勭洰鏍囥備篃灝辨槸璇達(dá)紝
浣犵殑搴旂敤紼嬪簭瑕佽兘澶熷簲瀵逛換浣曠獊鍙戠殑闂錛屼緥濡傚茍鍙戝鎴瘋姹傛暟杈懼埌宄板箋佸彲鐢ㄥ唴瀛樹復(fù)鏃跺嚭鐜頒笉瓚熾佷互鍙?qiáng)鍏跺畠鐭棄櫁寸殑鐜拌薄銆傝繖灝辮姹傜▼搴忕殑璁捐鑰呮敞鎰廤indows NT鍜?000緋葷粺涓嬬殑璧勬簮闄愬埗鏉′歡鐨勯棶棰橈紝浠庡鍦板鐞嗙獊鍙戞т簨浠躲?/p>
浣犲彲浠ョ洿鎺ユ帶鍒剁殑銆佹渶鍩烘湰鐨勮祫婧愬氨鏄綉緇滃甫瀹姐傞氬父錛屼嬌鐢ㄧ敤鎴鋒暟鎹姤鍗忚(UDP)鐨勫簲鐢ㄧ▼搴忛兘鍙兘浼?xì)姣旇緝娉ㄦ剰甯﹀鏂归潰鐨勯檺鍒跺Q屼互鏈澶ч檺搴﹀湴鍑忓皯鍖呯殑涓㈠け銆傜劧鑰岋紝鍦ㄤ嬌鐢═CP榪炴帴鏃訛紝鏈嶅姟鍣ㄥ繀欏誨崄鍒嗗皬蹇冨湴鎺у埗濂斤紝闃叉緗戠粶甯﹀榪囪澆瓚呰繃涓瀹氱殑鏃墮棿錛屽惁鍒欏皢闇瑕侀噸鍙戝ぇ閲忕殑鍖呮垨閫犳垚澶ч噺榪炴帴涓柇銆傚叧浜庡甫瀹界鐞嗙殑鏂規(guī)硶搴旀牴鎹笉鍚岀殑搴旂敤紼嬪簭鑰屽畾錛岃繖瓚呭嚭浜嗘湰鏂囪璁虹殑鑼冨洿銆?/p>
铏氭嫙鍐呭瓨鐨勪嬌鐢ㄤ篃蹇呴』寰堝皬蹇冨湴綆$悊銆傞氳繃璋ㄦ厧鍦扮敵璇峰拰閲婃斁鍐呭瓨錛屾垨鑰呭簲鐢╨ookaside lists(涓縐嶉珮閫熺紦瀛?鎶鏈潵閲嶆柊浣跨敤宸插垎閰嶇殑鍐呭瓨錛屽皢鏈夊姪浜庢帶鍒舵湇鍔″櫒搴旂敤紼嬪簭鐨勫唴瀛樺紑閿(鍘熸枃涓衡滆鏈嶅姟鍣ㄥ簲鐢ㄧ▼搴忕暀涓嬬殑鑴氬嵃灝忎竴鐐光?錛岄伩鍏嶆搷浣滅郴緇熼綣佸湴灝嗗簲鐢ㄧ▼搴忕敵璇風(fēng)殑鐗╃悊鍐呭瓨浜ゆ崲鍒拌櫄鎷熷唴瀛樹腑(鍘熸枃涓衡滆鎿嶄綔緋葷粺鑳藉鎬繪槸鎶婃洿澶氱殑搴旂敤紼嬪簭鍦板潃絀洪棿鏇村鍦頒繚鐣欏湪鍐呭瓨涓?銆備綘涔熷彲浠ラ氳繃 SetWorkingSetSize()榪欎釜Win32 API璁╂搷浣滅郴緇熷垎閰嶇粰浣犵殑搴旂敤紼嬪簭鏇村鐨勭墿鐞嗗唴瀛樸?/p>
鍦ㄤ嬌鐢╓insock鏃惰繕鍙兘紕板埌鍙﹀涓や釜闈炵洿鎺ョ殑璧勬簮涓嶈凍鎯呭喌銆備竴涓槸琚攣瀹氱殑鍐呭瓨欏甸潰鐨勬瀬闄愩傚鏋滀綘鎶夾FD.SYS鐨勭紦鍐插叧闂紝褰撳簲鐢ㄧ▼搴忔敹鍙戞暟鎹椂錛屽簲鐢ㄧ▼搴忕紦鍐插尯鐨勬墍鏈夐〉闈㈠皢琚攣瀹氬埌鐗╃悊鍐呭瓨涓傝繖鏄洜涓哄唴鏍擱┍鍔ㄧ▼搴忛渶瑕佽闂繖浜涘唴瀛橈紝鍦ㄦ鏈熼棿榪欎簺欏甸潰涓嶈兘浜ゆ崲鍑哄幓銆傚鏋滄搷浣滅郴緇熼渶瑕佺粰鍏跺畠搴旂敤紼嬪簭鍒嗛厤涓浜涘彲鍒嗛〉鐨勭墿鐞嗗唴瀛橈紝鑰屽張娌℃湁瓚沖鐨勫唴瀛樻椂灝變細(xì)鍙戠敓闂銆傛垜浠殑鐩爣鏄闃叉鍐欏嚭涓涓梾鎬佺殑銆侀攣瀹氭墍鏈夌墿鐞嗗唴瀛樸佽緋葷粺宕╂簝鐨勭▼搴忋備篃灝辨槸璇達(dá)紝浣犵殑紼嬪簭閿佸畾鍐呭瓨鏃訛紝涓嶈瓚呭嚭緋葷粺瑙勫畾鐨勫唴瀛樺垎欏墊瀬闄愩?/p>
鍦╓indows NT鍜?000緋葷粺涓婏紝鎵鏈夊簲鐢ㄧ▼搴忔誨叡鍙互閿佸畾鐨勫唴瀛樺ぇ綰︽槸鐗╃悊鍐呭瓨鐨?/8(涓嶈繃榪欏彧鏄竴涓ぇ姒傜殑浼拌錛屼笉鏄綘璁$畻鍐呭瓨鐨勪緷鎹?銆傚鏋滀綘鐨勫簲鐢ㄧ▼搴忎笉娉ㄦ剰榪欎竴鐐癸紝褰撲綘鐨勫彂鍑哄お澶氱殑閲嶅彔鏀跺彂璋冪敤錛岃屼笖I/O娌℃潵寰楀強(qiáng)瀹屾垚鏃訛紝灝卞彲鑳藉伓灝?dāng)鍙戠敓ERROR_INSUFFICIENT_RESOURCES鐨勯敊璇傚湪榪欑鎯呭喌涓嬩綘瑕侀伩鍏嶈繃搴﹂攣瀹氬唴瀛樸傚悓鏃惰娉ㄦ剰錛岀郴緇熶細(xì)閿佸畾鍖呭惈浣犵殑緙撳啿鍖烘墍鍦ㄧ殑鏁翠釜鍐呭瓨欏甸潰錛屽洜姝ょ紦鍐插尯闈犺繎欏佃竟鐣屾椂鏄湁浠d環(huán)鐨?璇戣呯悊瑙o紝緙撳啿鍖哄鏋滄濂借秴榪囬〉闈㈣竟鐣岋紝閭f曟槸1涓瓧鑺傦紝瓚呭嚭鐨勮繖涓瓧鑺傛墍鍦ㄧ殑欏甸潰涔熶細(xì)琚攣瀹?銆?/p>
鍙﹀涓涓檺鍒舵槸浣犵殑紼嬪簭鍙兘浼?xì)閬囧埌绯痪l熸湭鍒嗛〉姹犺祫婧愪笉瓚崇殑鎯呭喌銆傛墍璋撴湭鍒嗛〉姹犳槸涓鍧楁案榪滀笉琚氦鎹㈠嚭鍘葷殑鍐呭瓨鍖哄煙錛岃繖鍧楀唴瀛樼敤鏉ュ瓨鍌ㄤ竴浜涗緵鍚勭鍐呮牳緇勪歡璁塊棶鐨勬暟鎹紝鍏朵腑鏈夌殑鍐呮牳緇勪歡鏄笉鑳借闂偅浜涜浜ゆ崲鍑哄幓鐨勯〉闈㈢┖闂寸殑銆俉indows NT鍜?000鐨勯┍鍔ㄧ▼搴忚兘澶熶粠榪欎釜鐗瑰畾鐨勬湭鍒嗛〉姹犲垎閰嶅唴瀛樸?/p>
褰撳簲鐢ㄧ▼搴忓垱寤轟竴涓鎺ュ瓧(鎴栬呮槸綾諱技鐨勬墦寮鏌愪釜鏂囦歡)鏃訛紝鍐呮牳浼?xì)浠庢湭鍒啓鍓|睜涓垎閰嶄竴瀹氭暟閲忕殑鍐呭瓨錛岃屼笖鍦ㄧ粦瀹氥佽繛鎺ュ鎺ュ瓧鏃訛紝鍐呮牳鍙堜細(xì)浠庢湭鍒嗛〉姹犱腑鍐嶅垎閰嶄竴浜涘唴瀛樸傚綋浣犳敞鎰忚瀵熻繖縐嶈涓烘椂浣犲皢鍙戠幇錛屽鏋滀綘鍙戝嚭鏌愪簺I/O璇鋒眰鏃?渚嬪鏀跺彂鏁版嵁)錛屼綘浼?xì)浠庢湭鍒啓鍓|睜閲屽啀鍒嗛厤澶氫竴浜涘唴瀛?姣斿瑕佽拷韙煇涓緟鍐崇殑 I/O鎿嶄綔錛屼綘鍙兘闇瑕佺粰榪欎釜鎿嶄綔娣誨姞涓涓嚜瀹氫箟緇撴瀯錛屽鍓嶆枃鎵鎻愬強(qiáng)鐨?銆傛渶鍚庤繖灝卞彲鑳戒細(xì)閫犳垚涓瀹氱殑闂錛屾搷浣滅郴緇熶細(xì)闄愬埗鏈垎欏靛唴瀛樼殑鐢ㄩ噺銆?/p>
鍦╓indows NT鍜?000榪欎袱縐嶆搷浣滅郴緇熶笂錛岀粰姣忎釜榪炴帴鍒嗛厤鐨勬湭鍒嗛〉鍐呭瓨鐨勫叿浣撴暟閲忔槸涓嶅悓鐨勶紝鏈潵鐗堟湰鐨刉indows寰堝彲鑳戒篃涓嶅悓銆備負(fù)浜嗕嬌搴旂敤紼嬪簭鐨勭敓鍛芥湡鏇撮暱錛屼綘灝變笉搴旇璁$畻瀵規(guī)湭鍒嗛〉姹犲唴瀛樼殑鍏蜂綋闇姹傞噺銆?/p>
浣犵殑紼嬪簭蹇呴』闃叉娑堣楀埌鏈垎欏墊睜鐨勬瀬闄愩傚綋緋葷粺涓湭鍒嗛〉姹犲墿浣欑┖闂村お灝忔椂錛屾煇浜涗笌浣犵殑搴旂敤紼嬪簭姣棤鍏崇郴鐨勫唴鏍擱┍鍔ㄥ氨浼?xì)鍙戠柉锛岀敋鑷抽犳垚緋葷粺宕╂簝錛岀壒鍒槸褰撶郴緇熶腑鏈夌涓夋柟璁懼鎴栭┍鍔ㄧ▼搴忔椂錛屾洿瀹規(guī)槗鍙戠敓榪欐牱鐨勬儴鍓?鑰屼笖鏃犳硶棰勬祴)銆傚悓鏃朵綘榪樿璁頒綇錛屽悓涓鍙扮數(shù)鑴戜笂榪樺彲鑳借繍琛屾湁鍏跺畠鍚屾牱娑堣楁湭鍒嗛〉姹犵殑鍏跺畠搴旂敤紼嬪簭錛屽洜姝ゅ湪璁捐浣犵殑搴旂敤紼嬪簭鏃訛紝瀵硅祫婧愰噺鐨勯浼拌鐗瑰埆淇濆畧鍜岃皚鎱庛?/p>
澶勭悊璧勬簮涓嶈凍鐨勯棶棰樻槸鍗佸垎澶嶆潅鐨勶紝鍥犱負(fù)鍙戠敓涓婅堪鎯呭喌鏃朵綘涓嶄細(xì)鏀跺埌鐗瑰埆鐨勯敊璇唬鐮侊紝閫氬父浣犲彧鑳芥敹鍒頒竴鑸х殑WSAENOBUFS鎴栬匛RROR_INSUFFICIENT_RESOURCES 閿欒銆傝澶勭悊榪欎簺閿欒錛岄鍏堬紝鎶婁綘鐨勫簲鐢ㄧ▼搴忓伐浣滈厤緗皟鏁村埌鍚堢悊鐨勬渶澶у?璇戣呮敞錛氭墍璋撳伐浣滈厤緗紝鏄寚搴旂敤紼嬪簭鍚勯儴鍒嗚繍琛屼腑鎵闇鐨勫唴瀛樼敤閲忥紝璇峰弬鑰?http://msdn.microsoft.com/msdnmag/issues/1000/Bugslayer/Bugslayer1000.asp 錛屽叧浜庡唴瀛樹紭鍖栵紝璇戣呭彟鏈夎瘧鏂?錛屽鏋滈敊璇戶緇嚭鐜幫紝閭d箞娉ㄦ剰媯鏌ユ槸鍚︽槸緗戠粶甯﹀涓嶈凍鐨勯棶棰樸備箣鍚庯紝璇風(fēng)‘璁や綘娌℃湁鍚屾椂鍙戝嚭澶鐨勬敹鍙戣皟鐢ㄣ傛渶鍚庯紝濡傛灉榪樻槸鏀跺埌璧勬簮涓嶈凍鐨勯敊璇紝閭e氨寰堝彲鑳芥槸閬囧埌浜嗘湭鍒嗛〉鍐呭瓨姹犱笉瓚崇殑闂浜嗐傝閲婃斁鏈垎欏靛唴瀛樻睜絀洪棿錛岃鍏抽棴搴旂敤紼嬪簭涓浉褰撻儴鍒嗙殑榪炴帴錛岀瓑寰呯郴緇熻嚜琛屾浮榪囧拰淇榪欎釜鐬椂鐨勯敊璇?br />
鎺ュ彈榪炴帴璇鋒眰
鏈嶅姟鍣ㄨ鍋氱殑鏈鏅氱殑浜嬫儏涔嬩竴灝辨槸鎺ュ彈鏉ヨ嚜瀹㈡埛绔殑榪炴帴璇鋒眰銆傚湪濂楁帴瀛椾笂浣跨敤閲嶅彔I/O鎺ュ彈榪炴帴鐨勬儫涓API灝辨槸AcceptEx()鍑芥暟銆傛湁瓚g殑鏄紝閫氬父鐨勫悓姝ユ帴鍙楀嚱鏁癮ccept()鐨勮繑鍥炲兼槸涓涓柊鐨勫鎺ュ瓧錛岃孉cceptEx()鍑芥暟鍒欓渶瑕佸彟澶栦竴涓鎺ュ瓧浣滀負(fù)瀹冪殑鍙傛暟涔嬩竴銆傝繖鏄洜涓?AcceptEx()鏄竴涓噸鍙犳搷浣滐紝鎵浠ヤ綘闇瑕佷簨鍏堝垱寤轟竴涓鎺ュ瓧(浣嗕笉瑕佺粦瀹氭垨榪炴帴瀹?錛屽茍鎶婅繖涓鎺ュ瓧閫氳繃鍙傛暟浼犵粰AcceptEx()銆備互涓嬫槸涓灝忔鍏稿瀷鐨勪嬌鐢ˋcceptEx()鐨勪吉浠g爜錛?
do { -絳夊緟涓婁竴涓?AcceptEx 瀹屾垚 -鍒涘緩涓涓柊濂楁帴瀛楀茍涓庡畬鎴愮鍙h繘琛屽叧鑱? -璁劇疆鑳屾櫙緇撴瀯絳夌瓑 -鍙戝嚭涓涓?AcceptEx 璇鋒眰 }while(TRUE);浣滀負(fù)涓涓珮鍝嶅簲鑳藉姏鐨勬湇鍔″櫒錛屽畠蹇呴』鍙戝嚭瓚沖鐨凙cceptEx璋冪敤錛屽畧鍊欑潃錛屼竴鏃﹀嚭鐜板鎴風(fēng)榪炴帴璇鋒眰灝辯珛鍒誨搷搴斻傝嚦浜庡彂鍑哄灝戜釜AcceptEx鎵嶅錛屽氨鍙栧喅浜庝綘鐨勬湇鍔″櫒紼嬪簭鎵鏈熷緟鐨勯氫俊浜ら氱被鍨嬨傛瘮濡傦紝濡傛灉榪涘叆榪炴帴鐜囬珮鐨勬儏鍐?鍥犱負(fù)榪炴帴鎸佺畫鏃墮棿杈冪煭錛屾垨鑰呭嚭鐜頒氦閫氶珮宄?錛岄偅涔堟墍闇瑕佸畧鍊欑殑 AcceptEx褰撶劧瑕佹瘮閭d簺鍋跺皵榪涘叆鐨勫鎴風(fēng)榪炴帴鐨勬儏鍐佃澶氥傝仾鏄庣殑鍋氭硶鏄紝鐢卞簲鐢ㄧ▼搴忔潵鍒嗘瀽浜ら氱姸鍐碉紝騫惰皟鏁碅cceptEx瀹堝欑殑鏁伴噺錛岃屼笉鏄浐瀹氬湪鏌愪釜鏁伴噺涓娿?
瀵逛簬Windows2000錛學(xué)insock鎻愪緵浜嗕竴浜涙満鍒訛紝甯姪浣犲垽瀹欰cceptEx鐨勬暟閲忔槸鍚﹁凍澶熴傝繖灝辨槸錛屽湪鍒涘緩鐩戝惉濂楁帴瀛楁椂鍒涘緩涓涓簨浠訛紝閫氳繃WSAEventSelect()榪欎釜API騫舵敞鍐孎D_ACCEPT浜嬩歡閫氱煡鏉ユ妸濂楁帴瀛楀拰榪欎釜浜嬩歡鍏寵仈璧鋒潵銆備竴鏃︾郴緇熸敹鍒頒竴涓繛鎺ヨ姹傦紝濡傛灉緋葷粺涓病鏈堿cceptEx()姝e湪絳夊緟鎺ュ彈榪炴帴錛岄偅涔堜笂闈㈢殑浜嬩歡灝嗘敹鍒頒竴涓俊鍙楓傞氳繃榪欎釜浜嬩歡錛屼綘灝卞彲浠ュ垽鏂綘鏈夋病鏈夊彂鍑鴻凍澶熺殑 AcceptEx()錛屾垨鑰呮嫻嬪嚭涓涓潪姝e父鐨勫鎴瘋姹?涓嬫枃榪?銆傝繖縐嶆満鍒跺Windows NT 4.0涓嶉傜敤銆?/p>
浣跨敤AcceptEx()鐨勪竴澶уソ澶勬槸錛屼綘鍙互閫氳繃涓嬈¤皟鐢ㄥ氨瀹屾垚鎺ュ彈瀹㈡埛绔繛鎺ヨ姹傚拰鎺ュ彈鏁版嵁(閫氳繃浼犻乴pOutputBuffer鍙傛暟)涓や歡浜嬫儏銆備篃灝辨槸璇達(dá)紝濡傛灉瀹㈡埛绔湪鍙戝嚭榪炴帴鐨勫悓鏃朵紶杈撴暟鎹紝浣犵殑AcceptEx()璋冪敤鍦ㄨ繛鎺ュ垱寤哄茍鎺ユ敹浜嗗鎴風(fēng)鏁版嵁鍚庡氨鍙互绔嬪埢榪斿洖銆傝繖鏍峰彲鑳芥槸寰堟湁鐢ㄧ殑錛屼絾鏄篃鍙兘浼?xì)寮曞彂闂锛屽洜湄?fù)AcceptEx()蹇呴』絳夊叏閮ㄥ鎴風(fēng)鏁版嵁閮芥敹鍒頒簡鎵嶈繑鍥炪傚叿浣撴潵璇達(dá)紝濡傛灉浣犲湪鍙戝嚭AcceptEx()璋冪敤鐨勫悓鏃朵紶閫掍簡lpOutputBuffer鍙傛暟錛岄偅涔圓cceptEx()涓嶅啀鏄竴欏瑰師瀛愬瀷鐨勬搷浣滐紝鑰屾槸鍒嗘垚浜嗕袱姝ワ細(xì)鎺ュ彈瀹㈡埛榪炴帴錛岀瓑寰呮帴鏀舵暟鎹傚綋緙哄皯涓縐嶆満鍒舵潵閫氱煡浣犵殑搴旂敤紼嬪簭鎵鍙戠敓鐨勮繖縐嶆儏鍐碉細(xì)鈥滆繛鎺ュ凡緇忓緩绔嬩簡錛屾鍦ㄧ瓑寰呭鎴風(fēng)鏁版嵁鈥濓紝榪欏皢鎰忓懗鐫鏈夊彲鑳藉嚭鐜板鎴風(fēng)鍙彂鍑鴻繛鎺ヨ姹傦紝浣嗘槸涓嶅彂閫佹暟鎹傚鏋滀綘鐨勬湇鍔″櫒鏀跺埌澶榪欑綾誨瀷鐨勮繛鎺ユ椂錛屽畠?yōu)畣鎷捑l濊繛鎺ユ洿澶氱殑鍚堟硶瀹㈡埛绔姹傘傝繖灝辨槸榛戝榪涜鈥滄嫆緇濇湇鍔♀濇敾鍑葷殑甯歌鎵嬫硶銆?/p>
瑕侀闃叉綾繪敾鍑伙紝鎺ュ彈榪炴帴鐨勭嚎紼嬪簲璇ヤ笉鏃跺湴閫氳繃璋冪敤getsockopt()鍑芥暟(閫夐」鍙傛暟涓?SO_CONNECT_TIME)鏉ユ鏌cceptEx()閲屽畧鍊欑殑濂楁帴瀛椼俫etsockopt()鍑芥暟鐨勯夐」鍊煎皢琚緗負(fù)濂楁帴瀛楄榪炴帴鐨勬椂闂達(dá)紝鎴栬呰緗負(fù)-1(浠h〃濂楁帴瀛楀皻鏈緩绔嬭繛鎺?銆傝繖鏃訛紝W(xué)SAEventSelect()鐨勭壒鎬у氨鍙互寰堝ソ鍦板埄鐢ㄦ潵鍋氳繖縐嶆鏌ャ傚鏋滃彂鐜拌繛鎺ュ凡緇忓緩绔嬶紝浣嗘槸寰堜箙閮芥病鏈夋敹鍒版暟鎹殑鎯呭喌錛岄偅涔堝氨搴旇緇堟榪炴帴錛屾柟娉曞氨鏄叧闂綔涓哄弬鏁版彁渚涚粰AcceptEx()鐨勯偅涓鎺ュ瓧銆傛敞鎰忥紝鍦ㄥ鏁伴潪绱фユ儏鍐典笅錛屽鏋滃鎺ュ瓧宸茬粡浼犻掔粰AcceptEx()騫跺紑濮嬪畧鍊欙紝浣嗚繕鏈緩绔嬭繛鎺ワ紝閭d箞浣犵殑搴旂敤紼嬪簭涓嶅簲璇ュ叧闂畠浠傝繖鏄洜涓哄嵆浣垮叧闂簡榪欎簺濂楁帴瀛楋紝鍑轟簬鎻愰珮緋葷粺鎬ц兘鐨勮冭檻錛屽湪榪炴帴榪涘叆涔嬪墠錛屾垨鑰呯洃鍚鎺ュ瓧鑷韓琚叧闂箣鍓嶏紝鐩稿簲鐨勫唴鏍告ā寮忕殑鏁版嵁緇撴瀯涔熶笉浼?xì)琚q插噣鍦版竻闄ゃ?/p>
鍙戝嚭AcceptEx()璋冪敤鐨勭嚎紼嬶紝浼間箮涓庨偅涓繘琛屽畬鎴愮鍙e叧鑱旀搷浣溿佸鐞嗗叾瀹僆/O瀹屾垚閫氱煡鐨勭嚎紼嬫槸鍚屼竴涓紝浣嗘槸錛屽埆蹇樿綰跨▼閲屽簲璇ュ敖鍔涢伩鍏嶆墽琛岄樆濉炲瀷鐨勬搷浣溿俉insock2鍒嗗眰緇撴瀯鐨勪竴涓壇浣滅敤鏄皟鐢╯ocket()鎴朩SASocket() API鐨勪笂灞傛灦鏋勫彲鑳藉緢閲嶈(璇戣呬笉澶槑鐧藉師鏂囨剰鎬濓紝鎶辨瓑)銆傛瘡涓狝cceptEx()璋冪敤閮介渶瑕佸垱寤轟竴涓柊濂楁帴瀛楋紝鎵浠ユ渶濂芥湁涓涓嫭绔嬬殑綰跨▼涓撻棬璋冪敤AcceptEx()錛岃屼笉鍙備笌鍏跺畠I/O澶勭悊銆備綘涔熷彲浠ュ埄鐢ㄨ繖涓嚎紼嬫潵鎵ц鍏跺畠浠誨姟錛屾瘮濡備簨浠惰褰曘?/p>
鏈夊叧AcceptEx()鐨勬渶鍚庝竴涓敞鎰忎簨欏癸細(xì)瑕佸疄鐜拌繖浜汚PI錛屽茍涓嶉渶瑕佸叾瀹冩彁渚涘晢鎻愪緵鐨刉insock2瀹炵幇銆傝繖涓鐐瑰寰蔣鐗規(guī)湁鐨勫叾瀹傾PI涔熷悓鏍烽傜敤錛屾瘮濡俆ransmitFile()鍜孏etAcceptExSockAddrs()錛屼互鍙?qiáng)鍏跺畠鍙兘浼?xì)琚姞鍏ュ埌鏂扮増Windows鐨凙PI. 鍦╓indows NT鍜?000涓婏紝榪欎簺API鏄湪寰蔣鐨勫簳灞傛彁渚涜匘LL(mswsock.dll)涓疄鐜扮殑錛屽彲閫氳繃涓巑swsock.lib緙栬瘧榪炴帴榪涜璋冪敤錛屾垨鑰呴氳繃WSAIoctl() (閫夐」鍙傛暟涓篠IO_GET_EXTENSION_FUNCTION_POINTER)鍔ㄦ佽幏寰楀嚱鏁扮殑鎸囬拡銆?/p>
濡傛灉鍦ㄦ病鏈変簨鍏堣幏寰楀嚱鏁版寚閽堢殑鎯呭喌涓嬬洿鎺ヨ皟鐢ㄥ嚱鏁?涔熷氨鏄錛岀紪璇戞椂闈欐佽繛鎺swsock.lib錛屽湪紼嬪簭涓洿鎺ヨ皟鐢ㄥ嚱鏁?錛岄偅涔堟ц兘灝嗗緢鍙楀獎鍝嶃傚洜涓?AcceptEx()琚疆浜嶹insock2鏋舵瀯涔嬪錛屾瘡嬈¤皟鐢ㄦ椂瀹冮兘琚揩閫氳繃WSAIoctl()鍙栧緱鍑芥暟鎸囬拡銆傝閬垮厤榪欑鎬ц兘鎹熷け錛岄渶瑕佷嬌鐢ㄨ繖浜?API鐨勫簲鐢ㄧ▼搴忓簲璇ラ氳繃璋冪敤WSAIoctl()鐩存帴浠庡簳灞傜殑鎻愪緵鑰呴偅閲屽彇寰楀嚱鏁扮殑鎸囬拡銆?br />
鍙傝涓嬪浘濂楁帴瀛楁灦鏋勶細(xì)
TransmitFile 鍜?TransmitPackets
Winsock 鎻愪緵涓や釜涓撻棬涓烘枃浠跺拰鍐呭瓨鏁版嵁浼犺緭榪涜浜嗕紭鍖栫殑鍑芥暟銆傚叾涓璗ransmitFile()榪欎釜API鍑芥暟鍦╓indows NT 4.0 鍜?Windows 2000涓婇兘鍙互浣跨敤錛岃孴ransmitPackets()鍒欏皢鍦ㄦ湭鏉ョ増鏈殑Windows涓疄鐜般?/p>
TransmitFile ()鐢ㄦ潵鎶婃枃浠跺唴瀹歸氳繃Winsock榪涜浼犺緭銆傞氬父鍙戦佹枃浠剁殑鍋氭硶鏄紝鍏堣皟鐢–reateFile()鎵撳紑涓涓枃浠訛紝鐒跺悗涓嶆柇寰幆璋冪敤ReadFile () 鍜學(xué)SASend ()鐩磋嚦鏁版嵁鍙戦佸畬姣曘備絾鏄繖縐嶆柟娉曞緢娌℃湁鏁堢巼錛屽洜涓烘瘡嬈¤皟鐢≧eadFile() 鍜?WSASend ()閮戒細(xì)娑夊強(qiáng)涓嬈′粠鐢ㄦ埛妯″紡鍒板唴鏍告ā寮忕殑杞崲銆傚鏋滄崲鎴怲ransmitFile()錛岄偅涔堝彧闇瑕佺粰瀹冧竴涓凡鎵撳紑鏂囦歡鐨勫彞鏌勫拰瑕佸彂閫佺殑瀛楄妭鏁幫紝鑰屾墍娑夊強(qiáng)鐨勬ā寮忚漿鎹㈡搷浣滃皢鍙湪璋冪敤CreateFile()鎵撳紑鏂囦歡鏃跺彂鐢熶竴嬈★紝鐒跺悗TransmitFile()鏃跺啀鍙戠敓涓嬈°傝繖鏍鋒晥鐜囧氨楂樺浜嗐?/p>
TransmitPackets()姣擳ransmitFile()鏇磋繘涓姝ワ紝瀹冨厑璁哥敤鎴峰彧璋冪敤涓嬈″氨鍙互鍙戦佹寚瀹氱殑澶氫釜鏂囦歡鍜屽唴瀛樼紦鍐插尯銆傚嚱鏁板師鍨嬪涓嬶細(xì)
BOOL TransmitPackets( SOCKET hSocket, LPTRANSMIT_PACKET_ELEMENT lpPacketArray, DWORD nElementCount, DWORD nSendSize, LPOVERLAPPED lpOverlapped, DWORD dwFlags );鍏朵腑錛宭pPacketArray鏄竴涓粨鏋勭殑鏁扮粍錛屽叾涓殑姣忎釜鍏冪礌鏃㈠彲浠ユ槸涓涓枃浠跺彞鏌勬垨鑰呭唴瀛樼紦鍐插尯錛岃緇撴瀯瀹氫箟濡備笅錛?br />
typedef struct _TRANSMIT_PACKETS_ELEMENT { DWORD dwElFlags; DWORD cLength; union { struct { LARGE_INTEGER nFileOffset; HANDLE hFile; }; PVOID pBuffer; }; } TRANSMIT_FILE_BUFFERS;鍏朵腑鍚勫瓧孌墊槸鑷弿榪板瀷鐨?self explanatory)銆?br />dwElFlags瀛楁錛氭寚瀹氬綋鍓嶅厓绱犳槸涓涓枃浠跺彞鏌勮繕鏄唴瀛樼紦鍐插尯(鍒嗗埆閫氳繃甯擱噺TF_ELEMENT_FILE 鍜孴F_ELEMENT_MEMORY鎸囧畾)錛?br />cLength瀛楁錛氭寚瀹氬皢浠庢暟鎹簮鍙戦佺殑瀛楄妭鏁?濡傛灉鏄枃浠訛紝榪欎釜瀛楁鍊間負(fù)0琛ㄧず鍙戦佹暣涓枃浠?錛?br />緇撴瀯涓殑鏃犲悕鑱斿悎浣擄細(xì)鍖呭惈鏂囦歡鍙ユ焺鐨勫唴瀛樼紦鍐插尯(浠ュ強(qiáng)鍙兘鐨勫亸縐婚噺)銆?
浣跨敤榪欎袱涓狝PI鐨勫彟涓涓ソ澶勶紝鏄彲浠ラ氳繃鎸囧畾TF_REUSE_SOCKET鍜孴F_DISCONNECT鏍囧織鏉ラ噸鐢ㄥ鎺ュ瓧鍙ユ焺銆傛瘡褰揂PI瀹屾垚鏁版嵁鐨勪紶杈撳伐浣滃悗錛屽氨浼?xì)鍦ㄤ紶杈撳眰珩斿埆鏂紑榪炴帴錛岃繖鏍瘋繖涓鎺ュ瓧灝卞張鍙互閲嶆柊鎻愪緵緇橝cceptEx()浣跨敤銆傞噰鐢ㄨ繖縐嶄紭鍖栫殑鏂規(guī)硶緙栫▼錛屽皢鍑忚交閭d釜涓撻棬鍋氭帴鍙楁搷浣滅殑綰跨▼鍒涘緩濂楁帴瀛楃殑鍘嬪姏(鍓嶆枃榪板強(qiáng))銆?/p>
榪欎袱涓狝PI涔熼兘鏈変竴涓叡鍚岀殑寮辯偣錛歐indows NT Workstation 鎴?Windows 2000 涓撲笟鐗堜腑錛屽嚱鏁版瘡嬈″彧鑳藉鐞嗕袱涓皟鐢ㄨ姹傦紝鍙湁鍦╓indows NT銆乄indows 2000鏈嶅姟鍣ㄧ増銆乄indows 2000楂樼駭鏈嶅姟鍣ㄧ増鎴?Windows 2000 Data Center涓墠鑾峰緱瀹屽叏鏀寔銆?/p>
鏀懼湪涓璧風(fēng)湅鐪?/strong>
浠ヤ笂鍚勮妭涓紝鎴戜滑璁ㄨ浜嗗紑鍙戦珮鎬ц兘鐨勩佸ぇ鍝嶅簲瑙勬ā鐨勫簲鐢ㄧ▼搴忔墍闇鐨勫嚱鏁般佹柟娉曞拰鍙兘閬囧埌鐨勮祫婧愮摱棰堥棶棰樸傝繖浜涘浣犳剰鍛崇潃浠涔堝憿錛熷叾瀹烇紝榪欏彇鍐充簬浣犲浣曟瀯閫犱綘鐨勬湇鍔″櫒鍜屽鎴風(fēng)銆傚綋浣犺兘澶熷湪鏈嶅姟鍣ㄥ拰瀹㈡埛绔璁′笂榪涜鏇村ソ鍦版帶鍒舵椂錛岄偅涔堜綘瓚婅兘澶熼伩寮鐡墮闂銆?/p>
鏉ョ湅涓涓ず鑼冪殑鐜銆傛垜浠璁捐涓涓湇鍔″櫒鏉ュ搷搴斿鎴風(fēng)鐨勮繛鎺ャ佸彂閫佽姹傘佹帴鏀舵暟鎹互鍙?qiáng)鏂紑榪炴帴銆傞偅涔堬紝鏈嶅姟鍣ㄥ皢闇瑕佸垱寤轟竴涓洃鍚鎺ュ瓧錛屾妸瀹冧笌鏌愪釜瀹屾垚绔彛榪涜鍏寵仈錛屼負(fù)姣忛CPU鍒涘緩涓涓伐浣滅嚎紼嬨傚啀鍒涘緩涓涓嚎紼嬩笓闂ㄧ敤鏉ュ彂鍑篈cceptEx()銆傛垜浠煡閬撳鎴風(fēng)浼?xì)鍦ㄥ彂鍑簶q炴帴璇鋒眰鍚庣珛鍒諱紶閫佹暟鎹紝鎵浠ュ鏋滄垜浠噯澶囧ソ鎺ユ敹緙撳啿鍖轟細(xì)浣夸簨鎯呭彉寰楁洿涓哄鏄撱傚綋鐒訛紝涓嶈蹇樿涓嶆椂鍦拌疆璇cceptEx()璋冪敤涓嬌鐢ㄧ殑濂楁帴瀛?浣跨敤SO_CONNECT_TIME閫夐」鍙傛暟)鏉ョ‘淇濇病鏈夋伓鎰忚秴鏃剁殑榪炴帴銆?/p>
璇ヨ璁′腑鏈変竴涓噸瑕佺殑闂瑕佽冭檻錛屾垜浠簲璇ュ厑璁稿灝戜釜AcceptEx()榪涜瀹堝欍傝繖鏄洜涓猴紝姣忓彂鍑轟竴涓狝cceptEx()鏃舵垜浠兘鍚屾椂闇瑕佷負(fù)瀹冩彁渚涗竴涓帴鏀剁紦鍐插尯錛岄偅涔堝唴瀛樹腑灝嗕細(xì)鍑虹幇寰堝琚攣瀹氱殑欏甸潰(鍓嶆枃璇磋繃浜嗭紝姣忎釜閲嶅彔鎿嶄綔閮戒細(xì)娑堣椾竴灝忛儴鍒嗘湭鍒嗛〉鍐呭瓨姹狅紝鍚屾椂榪樹細(xì)閿佸畾鎵鏈夋秹鍙?qiáng)鐨劸~撳啿鍖?銆傝繖涓棶棰樺緢闅懼洖絳旓紝娌℃湁涓涓‘鍒囩殑絳旀銆傛渶濂界殑鏂規(guī)硶鏄妸榪欎釜鍊煎仛鎴愬彲浠ヨ皟鏁寸殑錛岄氳繃鍙嶅鍋氭ц兘嫻嬭瘯錛屼綘灝卞彲浠ュ緱鍑哄湪鍏稿瀷搴旂敤鐜涓渶浣崇殑鍊箋?/p>
濂戒簡錛屽綋浣犳祴綆楁竻妤氬悗錛屼笅闈㈠氨鏄彂閫佹暟鎹殑闂浜嗭紝鑰冭檻鐨勯噸鐐規(guī)槸浣犲笇鏈涙湇鍔″櫒鍚屾椂澶勭悊澶氬皯涓茍鍙戠殑榪炴帴銆傞氬父鎯呭喌涓嬶紝鏈嶅姟鍣ㄥ簲璇ラ檺鍒跺茍鍙戣繛鎺ョ殑鏁伴噺浠ュ強(qiáng)絳夊欏鐞嗙殑鍙戦佽皟鐢ㄣ傚洜涓哄茍鍙戣繛鎺ユ暟閲忚秺澶氾紝鎵娑堣楃殑鏈垎欏靛唴瀛樻睜涔熻秺澶氾紱絳夊欏鐞嗙殑鍙戦佽皟鐢ㄨ秺澶氾紝琚攣瀹氱殑鍐呭瓨欏甸潰涔熻秺澶?灝忓績鍒秴榪囦簡鏋侀檺)銆傝繖鍚屾牱涔熼渶瑕佸弽澶嶆祴璇曟墠鐭ラ亾絳旀銆?/p>
瀵逛簬涓婅堪鐜錛岄氬父涓嶉渶瑕佸叧闂崟涓鎺ュ瓧鐨勭紦鍐插尯錛屽洜涓哄彧鍦ˋcceptEx()涓湁涓嬈℃帴鏀舵暟鎹殑鎿嶄綔錛岃岃淇濊瘉緇欐瘡涓埌鏉ョ殑榪炴帴鎻愪緵鎺ユ敹緙撳啿鍖哄茍涓嶆槸澶毦鐨勪簨鎯呫備絾鏄紝濡傛灉瀹㈡埛鏈轟笌鏈嶅姟鍣ㄤ氦浜掔殑鏂瑰紡鍙樹竴鍙橈紝瀹㈡埛鏈哄湪鍙戦佷簡涓嬈℃暟鎹箣鍚庯紝榪橀渶瑕佸彂閫佹洿澶氱殑鏁版嵁錛屽湪榪欑鎯呭喌涓嬪叧闂帴鏀剁紦鍐插氨涓嶅お濡欎簡錛岄櫎闈炰綘鎯沖姙娉曚繚璇佸湪姣忎釜榪炴帴涓婇兘鍙戝嚭浜嗛噸鍙犳帴鏀惰皟鐢ㄦ潵鎺ユ敹鏇村鐨勬暟鎹?/p>
緇撹
寮鍙戝ぇ鍝嶅簲瑙勬ā鐨刉insock鏈嶅姟鍣ㄥ茍涓嶆槸寰堝彲鎬曪紝鍏跺疄涔熷氨鏄緗竴涓洃鍚鎺ュ瓧銆佹帴鍙楄繛鎺ヨ姹傚拰榪涜閲嶅彔鏀跺彂璋冪敤銆傞氳繃璁劇疆鍚堢悊鐨勮繘琛屽畧鍊欑殑閲嶅彔璋冪敤鐨勬暟閲忥紝闃叉鍑虹幇鏈垎欏靛唴瀛樻睜琚楀敖錛岃繖鎵嶆槸鏈涓昏鐨勬寫鎴樸傛寜鐓ф垜浠墠闈㈣璁虹殑涓浜涘師鍒欙紝浣犲氨鍙互寮鍙戝嚭澶у搷搴旇妯$殑鏈嶅姟鍣ㄥ簲鐢ㄧ▼搴忋?/p>
#include <stdio.h>
#include <winsock2.h>
#define TCP
#pragma comment(lib,"ws2_32.lib")
int main( int argc ,char* argv[])
{
聽WSAData wsaData;
聽WSAStartup(WINSOCK_VERSION,&wsaData);
聽DWORD begin,finish;
聽struct timeval tv;
聽tv.tv_sec = 5000;
聽tv.tv_usec = 0;
聽int optlen = sizeof(struct timeval);
聽//
聽SOCKET sock = socket(PF_INET,SOCK_STREAM,0);
聽struct sockaddr_in to;
聽int len = sizeof(struct sockaddr_in);
聽memset(&to,0,len);
聽to.sin_addr.s_addr = inet_addr("202.108.9.39");;
聽to.sin_port = htons(80);
聽to.sin_family = AF_INET;
聽if ( connect(sock,(struct sockaddr*)&to,len) == SOCKET_ERROR )
聽{
聽聽closesocket(sock);
聽聽return 0;
聽}
聽//璁劇疆瓚呮椂鍊間負(fù)tv
聽if ( setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&tv,optlen) ==
聽聽SOCKET_ERROR)
聽{
聽聽closesocket(sock);
聽聽return 0;
聽}
聽char buf[100];
聽if ( recv(sock,buf,100,0) == SOCKET_ERROR )
聽{
聽聽printf("d");
聽}
聽return 0;
}
聽DWORD dwType;
聽const int nTimeOut = 2000;
聽session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut);聽//閲嶈瘯涔嬮棿鐨勭瓑寰呭歡鏃?br />聽session.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);聽聽聽//閲嶈瘯嬈℃暟
聽char* pszBuffer = NULL;聽聽
聽try
聽{
聽聽AfxParseURL(strFileURLInServer, dwType, strServer, strObject, wPort);
聽聽pHttpConnection = session.GetHttpConnection(strServer, wPort);
聽聽pHttpFile = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject);
聽聽if(pHttpFile->SendRequest() == FALSE)
聽聽聽return false;
聽聽DWORD dwStateCode;
聽聽pHttpFile->QueryInfoStatusCode(dwStateCode);
聽聽if(dwStateCode == HTTP_STATUS_OK)
聽聽{
聽聽聽聽HANDLE hFile = CreateFile(strFileLocalFullPath, GENERIC_WRITE,
聽聽聽聽聽聽聽聽聽FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
聽聽聽聽聽聽聽聽聽NULL);聽聽//鍒涘緩鏈湴鏂囦歡
聽聽聽if(hFile == INVALID_HANDLE_VALUE)
聽聽聽{
聽聽聽聽pHttpFile->Close();
聽聽聽聽pHttpConnection->Close();
聽聽聽聽session.Close();
聽聽聽聽return false;
聽聽聽}
聽
聽聽聽char szInfoBuffer[1000];聽聽//榪斿洖娑堟伅
聽聽聽DWORD dwFileSize = 0;聽聽聽//鏂囦歡闀垮害
聽聽聽DWORD dwInfoBufferSize = sizeof(szInfoBuffer);
聽聽聽BOOL bResult = FALSE;
聽聽聽bResult = pHttpFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,
聽聽聽聽聽聽聽聽聽聽聽(void*)szInfoBuffer,&dwInfoBufferSize,NULL);
聽聽聽dwFileSize = atoi(szInfoBuffer);
聽聽聽const int BUFFER_LENGTH = 1024 * 10;
聽聽聽pszBuffer = new char[BUFFER_LENGTH];聽聽//璇誨彇鏂囦歡鐨勭紦鍐?br />聽聽聽DWORD dwWrite, dwTotalWrite;
聽聽聽dwWrite = dwTotalWrite = 0;
聽聽聽UINT nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH);聽//璇誨彇鏈嶅姟鍣ㄤ笂鏁版嵁
聽聽聽while(nRead > 0)
聽聽聽{
聽聽聽聽WriteFile(hFile, pszBuffer, nRead, &dwWrite, NULL);聽聽//鍐欏埌鏈湴鏂囦歡
聽聽聽聽dwTotalWrite += dwWrite;
聽聽聽聽nRead = pHttpFile->Read(pszBuffer, BUFFER_LENGTH);
聽聽聽}
聽聽聽delete[]pszBuffer;
聽聽聽pszBuffer = NULL;
聽聽聽CloseHandle(hFile);
聽聽}
聽聽else
聽聽{
聽聽聽delete[]pszBuffer;
聽聽聽pszBuffer = NULL;
聽聽聽if(pHttpFile != NULL)
聽聽聽{
聽聽聽聽pHttpFile->Close();
聽聽聽聽delete pHttpFile;
聽聽聽聽pHttpFile = NULL;
聽聽聽}
聽聽聽if(pHttpConnection != NULL)
聽聽聽{
聽聽聽聽pHttpConnection->Close();
聽聽聽聽delete pHttpConnection;
聽聽聽聽pHttpConnection = NULL;
聽聽聽}
聽聽聽session.Close();
聽聽聽聽return false;
聽聽}
聽}
聽catch(...)
聽{
聽聽delete[]pszBuffer;
聽聽pszBuffer = NULL;
聽聽if(pHttpFile != NULL)
聽聽{
聽聽聽pHttpFile->Close();
聽聽聽delete pHttpFile;
聽聽聽pHttpFile = NULL;
聽聽}
聽聽if(pHttpConnection != NULL)
聽聽{
聽聽聽pHttpConnection->Close();
聽聽聽delete pHttpConnection;
聽聽聽pHttpConnection = NULL;
聽聽}
聽聽session.Close();
聽聽return false;
聽}
聽if(pHttpFile != NULL)
聽聽pHttpFile->Close();
聽if(pHttpConnection != NULL)
聽聽pHttpConnection->Close();
聽session.Close();
聽return true;
}
2銆佷笂浼犳枃浠?br />UploadFile(LPCTSTR strURL, //璐熻矗鎺ユ敹涓婁紶鎿嶄綔鐨勯〉闈㈢殑URL
LPCTSTR strLocalFileName)聽 //寰呬笂浼犵殑鏈湴鏂囦歡璺緞
{
聽ASSERT(strURL != NULL && strLocalFileName != NULL);
聽BOOL bResult = FALSE;
聽DWORD dwType = 0;
聽CString strServer;
聽CString strObject;
聽INTERNET_PORT wPort = 0;
聽DWORD dwFileLength = 0;
聽char * pFileBuff = NULL;
聽CHttpConnection * pHC = NULL;
聽CHttpFile * pHF = NULL;
聽CInternetSession cis;
聽bResult =聽 AfxParseURL(strURL, dwType, strServer, strObject, wPort);
聽if(!bResult)
聽聽return FALSE;
聽CFile file;
聽try
聽{
聽聽if(!file.Open(strLocalFileName, CFile::shareDenyNone | CFile::modeRead))
聽聽聽return FALSE;
聽聽dwFileLength = file.GetLength();
聽聽if(dwFileLength <= 0)
聽聽聽return FALSE;
聽聽pFileBuff = new char[dwFileLength];
聽聽memset(pFileBuff, 0, sizeof(char) * dwFileLength);
聽聽file.Read(pFileBuff, dwFileLength);
聽聽const int nTimeOut = 5000;
聽聽cis.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, nTimeOut); //鑱旀帴瓚呮椂璁劇疆
聽聽cis.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);聽聽//閲嶈瘯1嬈?br />聽聽pHC = cis.GetHttpConnection(strServer, wPort);聽聽//鍙栧緱涓涓狧ttp鑱旀帴
聽聽pHF = pHC->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject);
聽聽if(!pHF->SendRequest(NULL, 0, pFileBuff, dwFileLength))
聽聽{
聽聽聽delete[]pFileBuff;
聽聽聽pFileBuff = NULL;
聽聽聽pHF->Close();
聽聽聽pHC->Close();
聽聽聽cis.Close();
聽聽聽return FALSE;
聽聽}
聽聽DWORD dwStateCode = 0;
聽聽pHF->QueryInfoStatusCode(dwStateCode);
聽聽if(dwStateCode == HTTP_STATUS_OK)
聽聽聽bResult = TRUE;
聽}
聽catch(CInternetException * pEx)
聽{
聽聽char sz[256] = "";
聽聽pEx->GetErrorMessage(sz, 25);
聽聽CString str;
聽聽str.Format("InternetException occur!\r\n%s", sz);
聽聽AfxMessageBox(str);
聽}
聽catch(CFileException& fe)
聽{
聽聽CString str;
聽聽str.Format("FileException occur!\r\n%d", fe.m_lOsError);
聽聽AfxMessageBox(str);
聽}
聽catch(...)
聽{
聽聽DWORD dwError = GetLastError();
聽聽CString str;
聽聽str.Format("Unknow Exception occur!\r\n%d", dwError);
聽聽AfxMessageBox(str);
聽}
聽delete[]pFileBuff;
聽pFileBuff = NULL;
聽file.Close();
聽pHF->Close();
聽pHC->Close();
聽cis.Close();
聽return bResult;
}