锘??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲午夜精品久久,欧美在线视频全部完,香蕉久久一区二区不卡无毒影院http://www.shnenglu.com/zgysx/category/3385.html鎶掑啓蹇箰蹇冩儏zh-cnFri, 15 Aug 2008 06:14:35 GMTFri, 15 Aug 2008 06:14:35 GMT60瑙f瀽IPhttp://www.shnenglu.com/zgysx/archive/2008/08/14/58858.htmlwarriorwarriorThu, 14 Aug 2008 09:52:00 GMThttp://www.shnenglu.com/zgysx/archive/2008/08/14/58858.htmlhttp://www.shnenglu.com/zgysx/comments/58858.htmlhttp://www.shnenglu.com/zgysx/archive/2008/08/14/58858.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/58858.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/58858.html 1 //鏋愬彇IP鍦板潃錛屽鏋滆鏄悎娉曠殑IP鍒欒繑鍥瀟rue,鍚﹀垯榪斿洖 false
 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 }


warrior 2008-08-14 17:52 鍙戣〃璇勮
]]>
[杞琞URL緙栫爜http://www.shnenglu.com/zgysx/archive/2007/01/04/17217.htmlwarriorwarriorThu, 04 Jan 2007 05:46:00 GMThttp://www.shnenglu.com/zgysx/archive/2007/01/04/17217.htmlhttp://www.shnenglu.com/zgysx/comments/17217.htmlhttp://www.shnenglu.com/zgysx/archive/2007/01/04/17217.html#Feedback3http://www.shnenglu.com/zgysx/comments/commentRss/17217.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/17217.html URL緙栫爜
浣滆咃細(xì) Chandrasekhar Vuppalapati
緲昏瘧錛歟astvc

涓嬭澆婧愪唬鐮?/a>

鏈枃鐨勭洰鐨勬槸璁捐涓涓畬鎴怳RL緙栫爜鐨凜++綾匯傚湪鎴戞浘緇忕殑欏圭洰涓紝鎴戦渶瑕佷粠VC++ 6.0搴旂敤紼嬪簭涓璓OST鏁版嵁錛岃岃繖浜涙暟鎹渶瑕佽繘琛孶RL緙栫爜銆傛垜鍦∕SDN涓煡鎵捐兘鏍規(guī)嵁鎻愪緵鐨勫瓧絎︿覆鐢熸垚URL緙栫爜鐨勭浉鍏崇被鎴朅PI錛屼絾鎴戞病鏈夋壘鍒幫紝鍥犳鎴戝繀欏昏璁′竴涓嚜宸辯殑URLEncode C++綾匯?/p>

URLEncoder.exe鏄竴涓嬌鐢║RLEncode綾葷殑MFC瀵硅瘽妗嗙▼搴忋?/p>

濡備綍澶勭悊

涓浜涚壒孌婂瓧絎﹀湪Internet涓婁紶閫佹槸浠舵鎵嬬殑浜嬫儏, 緇廢RL緙栫爜鐗規(guī)畩澶勭悊錛屽彲浠ヤ嬌鎵鏈夊瓧絎﹀畨鍏ㄥ湴浠嶪nternet浼犻併?/p>

渚嬪錛屽洖杞︾殑ASCII鍊兼槸13錛屽湪鍙戦丗ORM鏁版嵁鏃跺欒繖灝辮涓烘槸涓琛屾暟鎹殑緇撴潫銆?/p>

閫氬父錛屾墍鏈夊簲鐢ㄧ▼搴忛噰鐢℉TTP鎴朒TTPS鍗忚鍦ㄥ鎴風(fēng)鍜屾湇鍔″櫒绔紶閫佹暟鎹傛湇鍔″櫒绔粠瀹㈡埛绔帴鏀舵暟鎹湁涓ょ鍩烘湰鏂規(guī)硶錛?/p>

1銆佹暟鎹彲浠ヤ粠HTTP澶翠紶閫侊紙COOKIES鎴栦綔涓篎ORM鏁版嵁鍙戦侊級
2銆佸彲浠ュ寘鍚湪URL涓殑鏌ヨ閮ㄥ垎

褰撴暟鎹寘鍚湪URL錛屽畠蹇呴』閬靛驚URL璇硶榪涜緙栫爜銆傚湪WEB鏈嶅姟鍣ㄧ錛屾暟鎹嚜鍔ㄨВ鐮併傝冭檻涓涓嬩笅闈㈢殑URL錛屽摢涓暟鎹槸浣滀負(fù)鏌ヨ鍙傛暟銆?/p>

渚嬪錛歨ttp://WebSite/ResourceName?Data=Data

WebSite鏄疷RL鍚嶇О
ResourceName鍙互鏄疉SP鎴朣ervlet鍚嶇О
Data鏄渶瑕佸彂閫佺殑鏁版嵁銆傚鏋淢IME綾誨瀷鏄疌ontent-Type: application/x-www-form-urlencoded錛屽垯瑕佹眰榪涜緙栫爜銆?/p>

RFC 1738

RFC 1738鎸囨槑浜嗙粺涓璧勬簮瀹氫綅(URLs)涓殑瀛楃搴旇鏄疷S-ASCII瀛楃闆嗙殑瀛愰泦銆傝繖鏄彈HTML鐨勯檺鍒訛紝鍙︿竴鏂歸潰錛屽厑璁稿湪鏂囨。涓嬌鐢ㄦ墍鏈塈SO- 8859-1(ISO-Latin)瀛楃闆嗐傝繖灝嗘剰鍛崇潃鍦℉TML FORM閲孭OST鐨勬暟鎹紙鎴栦綔涓烘煡璇㈠瓧涓茬殑涓閮ㄥ垎錛夛紝鎵鏈塇TML緙栫爜蹇呴』琚紪鐮併?/p>

ISO-8859-1 (ISO-Latin)瀛楃闆?/p>

鍦ㄤ笅琛ㄤ腑錛屽寘鍚簡瀹屾暣鐨処SO-8859-1 (ISO-Latin)瀛楃闆嗭紝琛ㄦ牸鎻愪緵浜嗘瘡涓瓧絎﹁寖鍥達(dá)紙10榪涘埗錛夛紝鎻忚堪錛屽疄闄呭鹼紝鍗佸叚榪涘埗鍊鹼紝HTML緇撴灉銆傛煇涓寖鍥翠腑鐨勫瓧絎︽槸鍚﹀畨鍏ㄣ?br />

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

鍙傝冿細(xì)

URL緙栫爜:
http://www.blooberry.com/indexdot/html/topics/urlencoding.htm.

RFC 1866: The HTML 2.0 瑙勮寖 (綰枃鏈?. 闄勫綍鍖呭惈浜嗗瓧絎﹁〃: http://www.rfc-editor.org/rfc/rfc1866.txt.

Web HTML 2.0 鐗堟湰(RFC 1866) : http://www.w3.org/MarkUp/html-spec/html-spec_13.html.

The HTML 3.2 (Wilbur) 寤鴻: http://www.w3.org/MarkUp/Wilbur/.

The HTML 4.0 寤鴻: http://www.w3.org/TR/REC-html40/.

W3C HTML 鍥介檯鍖栧尯鍩? http://www.w3.org/International/O-HTML.html.

warrior 2007-01-04 13:46 鍙戣〃璇勮
]]>
[杞琞鐢ㄥ畬鎴愮鍙e紑鍙戝ぇ鍝嶅簲瑙勬ā鐨刉insock搴旂敤紼嬪簭http://www.shnenglu.com/zgysx/archive/2007/01/04/17216.htmlwarriorwarriorThu, 04 Jan 2007 05:42:00 GMThttp://www.shnenglu.com/zgysx/archive/2007/01/04/17216.htmlhttp://www.shnenglu.com/zgysx/comments/17216.htmlhttp://www.shnenglu.com/zgysx/archive/2007/01/04/17216.html#Feedback0http://www.shnenglu.com/zgysx/comments/commentRss/17216.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/17216.html 鐢ㄥ畬鎴愮鍙e紑鍙戝ぇ鍝嶅簲瑙勬ā鐨刉insock搴旂敤紼嬪簭

鍘熸枃鍑哄錛?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
}
...
}

榪欐椂灝卞畬鎴愪簡濂楁帴瀛椾笌瀹屾垚绔彛鐨勫叧鑱旀搷浣溿傚湪榪欎釜濂楁帴瀛椾笂榪涜鐨勪換浣曢噸鍙犳搷浣滈兘灝嗛氳繃瀹屾垚绔彛鍙戝嚭瀹屾垚閫氱煡銆傛敞鎰忥紝CreateIoCompletionPort()鍑芥暟涓殑絎笁涓弬鏁扮敤鏉ヨ緗竴涓笌璇ュ鎺ュ瓧鐩稿叧鐨勨滃畬鎴愰敭(completion key)鈥?璇戣呮敞錛氬畬鎴愰敭鍙互鏄換浣曟暟鎹被鍨?銆傛瘡褰撳畬鎴愰氱煡鍒版潵鏃訛紝搴旂敤紼嬪簭鍙互璇誨彇鐩稿簲鐨勫畬鎴愰敭錛屽洜姝わ紝瀹屾垚閿彲鐢ㄦ潵緇欏鎺ュ瓧浼犻掍竴浜涜儗鏅俊鎭?

鍦ㄥ垱寤轟簡瀹屾垚绔彛銆佸皢涓涓垨澶氫釜濂楁帴瀛椾笌涔嬬浉鍏寵仈涔嬪悗錛屾垜浠氨瑕佸垱寤鴻嫢騫蹭釜綰跨▼鏉ュ鐞嗗畬鎴愰氱煡銆傝繖浜涚嚎紼嬩笉鏂驚鐜皟鐢℅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 />
宸ヤ綔綰跨▼WorkerThread浠g爜錛?
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>

warrior 2007-01-04 13:42 鍙戣〃璇勮
]]>
璁劇疆revc()鐨勭瓑寰呰秴鏃舵椂闂?/title><link>http://www.shnenglu.com/zgysx/archive/2006/12/11/16276.html</link><dc:creator>warrior</dc:creator><author>warrior</author><pubDate>Mon, 11 Dec 2006 08:39:00 GMT</pubDate><guid>http://www.shnenglu.com/zgysx/archive/2006/12/11/16276.html</guid><wfw:comment>http://www.shnenglu.com/zgysx/comments/16276.html</wfw:comment><comments>http://www.shnenglu.com/zgysx/archive/2006/12/11/16276.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/zgysx/comments/commentRss/16276.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/zgysx/services/trackbacks/16276.html</trackback:ping><description><![CDATA[ <p>聽</p> <p>#include <stdio.h><br />#include <winsock2.h></p> <p> <br />#define TCP</p> <p>#pragma comment(lib,"ws2_32.lib")</p> <p>int main( int argc ,char* argv[])<br />{<br />聽WSAData wsaData;</p> <p>聽WSAStartup(WINSOCK_VERSION,&wsaData);<br />聽DWORD begin,finish;</p> <p>聽struct timeval tv;<br />聽tv.tv_sec = 5000;<br />聽tv.tv_usec = 0;<br />聽int optlen = sizeof(struct timeval);</p> <p> <br />聽//<br />聽SOCKET sock = socket(PF_INET,SOCK_STREAM,0);</p> <p>聽struct sockaddr_in to;<br />聽int len = sizeof(struct sockaddr_in);<br />聽memset(&to,0,len);</p> <p>聽to.sin_addr.s_addr = inet_addr("202.108.9.39");;<br />聽to.sin_port = htons(80);<br />聽to.sin_family = AF_INET;</p> <p>聽if ( connect(sock,(struct sockaddr*)&to,len) == SOCKET_ERROR )<br />聽{<br />聽聽closesocket(sock);<br />聽聽return 0;<br />聽}</p> <p>聽<font color="#ff3333">//璁劇疆瓚呮椂鍊間負(fù)tv<br />聽if ( setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&tv,optlen) ==<br />聽聽SOCKET_ERROR)<br /></font>聽{<br />聽聽closesocket(sock);<br />聽聽return 0;<br />聽}</p> <p>聽char buf[100];<br />聽if ( recv(sock,buf,100,0) == SOCKET_ERROR )<br />聽{<br />聽聽printf("d");<br />聽}</p> <p>聽return 0;<br />}</p> <img src ="http://www.shnenglu.com/zgysx/aggbug/16276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/zgysx/" target="_blank">warrior</a> 2006-12-11 16:39 <a href="http://www.shnenglu.com/zgysx/archive/2006/12/11/16276.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>浣跨敤MFC鎻愪緵鐨凥ttp綾諱笅杞藉拰涓婁紶鏂囦歡http://www.shnenglu.com/zgysx/archive/2006/09/28/13088.htmlwarriorwarriorThu, 28 Sep 2006 03:34:00 GMThttp://www.shnenglu.com/zgysx/archive/2006/09/28/13088.htmlhttp://www.shnenglu.com/zgysx/comments/13088.htmlhttp://www.shnenglu.com/zgysx/archive/2006/09/28/13088.html#Feedback5http://www.shnenglu.com/zgysx/comments/commentRss/13088.htmlhttp://www.shnenglu.com/zgysx/services/trackbacks/13088.html1銆佷笅杞芥枃浠?br />Download(const CString& strFileURLInServer, //寰呬笅杞芥枃浠剁殑URL
const CString & strFileLocalFullPath)//瀛樻斁鍒版湰鍦扮殑璺緞
{
聽ASSERT(strFileURLInServer != "");
聽ASSERT(strFileLocalFullPath != "");
聽CInternetSession session;
聽CHttpConnection* pHttpConnection = NULL;
聽CHttpFile* pHttpFile = NULL;
聽CString strServer, strObject;
聽INTERNET_PORT wPort;

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



warrior 2006-09-28 11:34 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              欧美一级成年大片在线观看| 欧美日韩精品免费看 | 亚洲小说区图片区| 欧美在线视频播放| 欧美精品国产一区二区| 国产精品视频免费在线观看| 国产午夜精品一区二区三区欧美 | 99国产精品久久久| 久久视频这里只有精品| 国产精品视频第一区| 亚洲三级观看| 麻豆成人在线| 亚洲综合精品自拍| 国产精品啊啊啊| 亚洲午夜在线视频| 亚洲精品视频在线观看免费| 亚洲精品日韩综合观看成人91| 午夜老司机精品| 国产精品视频男人的天堂| 亚洲综合精品自拍| 亚洲香蕉视频| 国产伦理精品不卡| 久久久久久久综合日本| 亚洲精品视频在线观看网站| 免费av成人在线| 亚洲精品视频在线播放| 国产精品99久久久久久宅男 | 久久激情一区| 亚洲电影免费观看高清完整版在线| 一本色道精品久久一区二区三区| 欧美国产日本| 黑人一区二区三区四区五区| 性久久久久久| 欧美在线日韩| 曰本成人黄色| 农村妇女精品| 欧美另类极品videosbest最新版本| 亚洲精品国产欧美| 99精品视频免费观看| 国产精品大片免费观看| 欧美在线观看一区二区三区| 午夜精品久久久久久久久久久久| 国产精品一区二区在线观看网站| 久久国产精品电影| 久久精品国产一区二区电影 | 国产噜噜噜噜噜久久久久久久久| 欧美专区日韩专区| 亚洲一区国产| 亚洲欧美国产另类| 国产精品久久波多野结衣| 亚洲欧美国产77777| 久久久久久9| 一区二区三区精密机械公司| 亚洲一级特黄| 欧美日本在线播放| 久久成人精品| 欧美精品成人在线| 久久精品亚洲热| 欧美77777| 久久久久久久久久久久久久一区 | 国产欧美日韩在线播放| 欧美国产视频在线观看| 欧美黄色一区| 欧美综合第一页| 欧美经典一区二区三区| 欧美中文字幕在线观看| 亚洲午夜精品国产| 亚洲日本va午夜在线电影| 亚洲综合精品自拍| 国产欧美亚洲日本| 日韩天堂av| 亚洲精品123区| 亚洲香蕉视频| 国产欧美日韩激情| 99国产一区| 国产欧美日韩综合精品二区| 毛片基地黄久久久久久天堂| 美脚丝袜一区二区三区在线观看 | 欧美极品在线观看| 久久天天综合| 日韩午夜剧场| 国产精品亚洲网站| 久久久www成人免费毛片麻豆| 久久久噜噜噜久噜久久| 亚洲国产精品一区在线观看不卡| 麻豆91精品| 亚洲精品无人区| 欧美一级片在线播放| 一区二区在线看| 欧美国产精品中文字幕| 一区二区三区欧美在线| 久久精品久久99精品久久| 亚洲高清在线播放| 欧美日韩综合一区| 久久久久久高潮国产精品视| 亚洲高清电影| 亚洲欧美日韩在线| 在线精品观看| 国产精品porn| 久热精品视频在线| 亚洲午夜久久久久久久久电影院| 久久久噜噜噜久久人人看| 99国产精品自拍| 国产精品日韩电影| 欧美精品粉嫩高潮一区二区 | 亚洲一区二区三区色| 欧美wwwwww| 欧美在线三区| av成人免费在线| 久久久国产91| 亚洲国产专区校园欧美| 噜噜噜噜噜久久久久久91| 亚洲视频一二| 亚洲大片在线观看| 久久亚洲精品中文字幕冲田杏梨| 日韩视频在线免费观看| 国语自产精品视频在线看抢先版结局| 欧美精品高清视频| 蜜臀a∨国产成人精品| 欧美一区成人| 亚洲午夜精品17c| 亚洲三级国产| 欧美激情一区二区在线 | 一区二区三区欧美| 亚洲国产欧美在线人成| 国产小视频国产精品| 国产精品成人观看视频免费| 欧美紧缚bdsm在线视频| 久久久久一区二区三区四区| 亚洲男人的天堂在线观看| 日韩写真在线| 亚洲精品一区久久久久久| 欧美成人精精品一区二区频| 欧美一区二区三区精品电影| 亚洲一区二区三区午夜| 在线视频一区观看| 日韩视频三区| 99在线热播精品免费| 亚洲免费av片| 亚洲精品黄网在线观看| 亚洲欧洲综合另类| 亚洲激情专区| 日韩视频在线一区二区三区| 亚洲国产乱码最新视频| 亚洲黄一区二区| 一区二区三区成人| 99在线热播精品免费99热| 一本色道久久加勒比精品| 亚洲精品在线二区| 一片黄亚洲嫩模| 亚洲综合色网站| 欧美在线播放视频| 久久免费国产| 免费亚洲视频| 亚洲精品日韩一| 亚洲伊人观看| 欧美一区二区视频网站| 久久女同互慰一区二区三区| 老司机成人在线视频| 欧美激情a∨在线视频播放| 欧美精品一区二区三区视频| 欧美三级乱人伦电影| 国产日韩欧美夫妻视频在线观看| 国产自产精品| 亚洲人成人77777线观看| 一区二区高清| 久久精精品视频| 亚洲激情二区| 亚洲一区二区三区四区五区午夜| 午夜一区二区三区在线观看| 久久一二三国产| 国产精品成人av性教育| 国产亚洲欧美日韩一区二区| 一区二区三区亚洲| 夜夜嗨av一区二区三区四季av| 亚洲一区二区三区精品在线观看| 久久久www| 亚洲精品乱码| 亚洲一区亚洲二区| 久久久久久一区二区三区| 欧美成年视频| 国产麻豆视频精品| 黄色小说综合网站| 999在线观看精品免费不卡网站| 亚洲男人的天堂在线观看| 久久久久久久999精品视频| 亚洲美女视频在线观看| 欧美在线观看一区| 欧美日韩一级黄| 亚洲国产电影| 欧美一区二区免费观在线| 午夜视频一区| 欧美日韩高清在线| 亚洲高清视频一区二区| 午夜精品久久久久久久蜜桃app| 久久综合电影| 亚洲欧美日韩综合| 欧美视频在线观看| 91久久久亚洲精品| 另类av一区二区|