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

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

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

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

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

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

銆銆s鏄垰鎵嶅垱寤哄ソ鐨勫鎺ュ瓧錛宯ame鎸囧悜鎻忚堪閫氳瀵硅薄鐨勭粨鏋勪綋鐨勬寚閽堬紝namelen鏄緇撴瀯浣撶殑闀垮害銆傝緇撴瀯浣撲腑鐨勫垎閲忓寘鎷細IP鍦板潃(瀵瑰簲name.sin_addr.s_addr)銆佺鍙e彿(name.sin_port)銆佸湴鍧綾誨瀷(name.sin_family錛屼竴鑸兘璧嬫垚AF_INET錛岃〃紺烘槸internet鍦板潃)銆傤?br />
銆銆(1)IP鍦板潃鐨勫~鍐欐柟娉曪細鍦ㄥ叏鍙屽伐閫氫俊涓紝瑕佹妸鐢ㄦ埛鍚嶅搴旂殑鐐瑰垎琛ㄧず娉曞湴鍧杞崲鎴?2浣嶉暱鏁存暟鏍煎紡鐨処P鍦板潃錛屼嬌鐢╥net_addr()鍑芥暟銆傤?br />
銆銆(2)绔彛鍙鋒槸鐢ㄤ簬琛ㄧず鍚屼竴鍙拌綆楁満涓嶅悓鐨勮繘紼?搴旂敤紼嬪簭)錛屽叾鍒嗛厤鏂規硶鏈変袱縐嶏細1)榪涚▼鍙互璁╃郴緇熶負濂楁帴瀛楄嚜鍔ㄥ垎閰嶄竴绔彛鍙鳳紝鍙鍦ㄨ皟鐢╞ind鍓嶅皢绔彛鍙鋒寚瀹氫負0鍗沖彲銆傜敱緋葷粺鑷姩鍒嗛厤鐨勭鍙e彿浣嶄簬1024~5000涔嬮棿錛岃?~1023涔嬮棿鐨勪換涓TCP鎴朥DP绔彛閮芥槸淇濈暀鐨勶紝緋葷粺涓嶅厑璁鎬換涓榪涚▼浣跨敤淇濈暀绔彛錛岄櫎闈炲叾鏈夋晥鐢ㄦ埛ID鏄浂(瓚呯駭鐢ㄦ埛)銆傤?br />
銆銆2)榪涚▼鍙負濂楁帴瀛楁寚瀹氫竴鐗瑰畾绔彛銆傝繖瀵逛簬闇瑕佺粰濂楁帴瀛楀垎閰嶄竴浼楁墍绔彛鐨勬湇鍔″櫒鏄緢鏈夌敤鐨勩傛寚瀹氳寖鍥翠負1024鍜?5536涔嬮棿銆傚彲浠繪剰鎸囧畾銆傤?br />
銆銆鍦ㄦ湰紼嬪簭涓紝瀵逛袱涓鎺ュ瓧鐨勭鍙e彿瑙勫畾涓?000鍜?001錛屽墠鑰呭搴斿彂閫佸鎺ュ瓧錛屽悗鑰呭搴旀帴鏀跺鎺ュ瓧銆?br />
銆銆绔彛鍙瘋浠庝竴涓?6浣嶆棤絎﹀彿鏁?u_short綾誨瀷鏁?浠庝富鏈哄瓧鑺傞『搴忚漿鎹㈡垚緗戠粶瀛楄妭欏哄簭錛屼嬌鐢╤tons()鍑芥暟銆傤?br />
銆銆鏍規嵁浠ヤ笂涓や釜鍑芥暟錛屽彲浠ョ粰鍑哄弻濂楁帴瀛楀緩绔嬩笌緇戝畾鐨勭▼搴忕墖鏂?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()璇誨嚭銆備負浜嗗彂閫佸拰鎺ユ敹鏁版嵁錛屽繀欏誨緩绔嬫暟鎹彂閫佺紦鍐插尯鍜屾暟鎹帴鏀剁紦鍐插尯銆傝瀹氾細IP灞傜殑涓涓暟鎹姤鏈澶т笉瓚呰繃64K(鍚暟鎹姤澶?銆傚綋緙撳啿鍖鴻緗緱榪囧銆佽繃澶ф椂錛屽父鍥犲唴瀛樹笉澶熻屽鑷村鎺ュ瓧寤虹珛澶辮觸銆傚湪鍑忓皬緙撳啿鍖哄悗錛岃閿欒娑堝け銆傜粡榪囧疄楠岋紝鏂囦腑閫夌敤浜?K瀛楄妭銆傤?br />
銆銆姝ゅ錛岃繕搴旀敞鎰忚繖涓や釜鍑芥暟涓渶鍚庡弬鏁扮殑鍐欐硶錛岀粰sendto()鐨勬渶鍚庡弬鏁版槸涓涓暣鏁板鹼紝鑰宺ecvfrom()鐨勫垯鏄寚鍚戜竴鏁存暟鍊肩殑鎸囬拡銆傤?br />
銆銆4.濂楁帴瀛楀叧闂嚱鏁幫細closesocket(SOCKET s)顎?br />
銆銆閫氳緇撴潫鏃訛紝搴斿叧闂寚瀹氱殑濂楁帴瀛楋紝浠ラ噴涓庝箣鐩稿叧鐨勮祫婧愩傤?br />
銆銆鍦ㄥ叧闂鎺ュ瓧鏃訛紝搴斿厛瀵歸攣瀹氱殑鍚勭緙撳啿鍖哄姞浠ラ噴鏀俱傚叾紼嬪簭鐗囨柇涓猴細顎?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 闃誨鍙婂叾澶勭悊鏂瑰紡顎?br />
銆銆鍦ㄧ綉緇滈氳涓紝鐢變簬緗戠粶鎷ユ尋鎴栦竴嬈″彂閫佺殑鏁版嵁閲忚繃澶х瓑鍘熷洜錛岀粡甯鎬細鍙戠敓浜ゆ崲鐨勬暟鎹湪鐭椂闂村唴涓嶈兘浼犻佸畬錛屾敹鍙戞暟鎹殑鍑芥暟鍥犳涓嶈兘榪斿洖錛岃繖縐嶇幇璞″彨鍋氶樆濉炪俉insock瀵規湁鍙兘闃誨鐨勫嚱鏁版彁渚涗簡涓ょ澶勭悊鏂瑰紡錛氶樆濉炲拰闈為樆濉炴柟寮忋傚湪闃誨鏂瑰紡涓嬶紝鏀跺彂鏁版嵁鐨勫嚱鏁板湪琚皟鐢ㄥ悗涓鐩磋鍒頒紶閫佸畬姣曟垨鑰呭嚭閿欐墠鑳借繑鍥炪傚湪闃誨鏈熼棿錛岃闃葷殑鍑芥暟涓嶄細鏂皟鐢ㄧ郴緇熷嚱鏁癎etMessage()鏉ヤ繚鎸佹秷鎭驚鐜殑姝e父榪涜銆傚浜庨潪闃誨鏂瑰紡錛屽嚱鏁拌璋冪敤鍚庣珛鍗寵繑鍥烇紝褰撲紶閫佸畬鎴愬悗鐢盬insock緇欑▼搴忓彂涓涓簨鍏堢害瀹氬ソ鐨勬秷鎭傤?br />
銆銆鍦ㄧ紪紼嬫椂錛屽簲灝介噺浣跨敤闈為樆濉炴柟寮忋傚洜涓哄湪闃誨鏂瑰紡涓嬶紝鐢ㄦ埛鍙兘浼氶暱鏃墮棿鐨勭瓑寰呰繃紼嬩腑璇曞浘鍏抽棴紼嬪簭錛屽洜涓烘秷鎭驚鐜繕鍦ㄨ搗浣滅敤錛屾墍浠ョ▼搴忕殑紿楀彛鍙兘琚叧闂紝榪欐牱褰撳嚱鏁頒粠Winsock鐨勫姩鎬佽繛鎺ュ簱涓繑鍥炴椂錛屼富紼嬪簭宸茬粡浠庡唴瀛樹腑鍒犻櫎錛岃繖鏄劇劧鏄瀬鍏跺嵄闄╃殑銆傤?br />
銆銆2 寮傛閫夋嫨鍑芥暟WSAAsyncSelect()鐨勪嬌鐢?br />
銆銆Winsock閫氳繃WSAAsyncSelect()鑷姩鍦拌緗鎺ュ瓧澶勪簬闈為樆濉炴柟寮忋備嬌鐢╓indowsSockets瀹炵幇Windows緗戠粶紼嬪簭璁捐鐨勫叧閿氨鏄畠鎻愪緵浜嗗緗戠粶浜嬩歡鍩轟簬娑堟伅鐨勫紓姝ュ瓨鍙栵紝鐢ㄤ簬娉ㄥ唽搴旂敤紼嬪簭鎰熷叴瓚g殑緗戠粶浜嬩歡銆傚畠璇鋒眰Windows Sockets DLL鍦ㄦ嫻嬪埌濂楁帴瀛椾笂鍙戠敓鐨勭綉緇滀簨浠舵椂錛屽悜紿楀彛鍙戦佷竴涓秷鎭傚UDP鍗忚錛岃繖浜涚綉緇滀簨浠朵富瑕佷負錛氼?br />
銆銆FD_READ 鏈熸湜鍦ㄥ鎺ュ瓧鏀跺埌鏁版嵁(鍗寵鍑嗗濂?鏃舵帴鏀墮氱煡錛涱?br />
銆銆FD_WRITE 鏈熸湜鍦ㄥ鎺ュ瓧鍙彂閫佹暟(鍗沖啓鍑嗗濂?鏃舵帴鏀墮氱煡錛涱?br />
銆銆FD_CLOSE 鏈熸湜鍦ㄥ鎺ュ瓧鍏抽棴鏃舵帴鐢甸氱煡顎?br />
銆銆娑堟伅鍙橀噺wParam鎸囩ず鍙戠敓緗戠粶浜嬩歡鐨勫鎺ュ瓧錛屽彉閲?Param鐨勪綆瀛楄妭鎻忚堪鍙戠敓鐨勭綉緇滀簨浠訛紝楂樺瓧鍖呭惈閿欒鐮併傚鍦ㄧ獥鍙e嚱鏁扮殑娑堟伅寰幆涓潎鍔犱竴涓垎鏀細顎?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]銆傛澶栵紝搴旇鎸囧嚭鐨勬槸錛屼互涓婄▼搴忕墖鏂腑鐨勬秷鎭涓昏鏄負紼嬪簭璋冭瘯鏂逛究鑰岃緗殑錛岃屽湪姝e紡浜у搧涓笉鍐嶅嚭鐜般傚悓鏃訛紝鎸夌収紼嬪簭瀹歸敊璇璁★紝搴斿緩绔嬩竴涓笓闂ㄧ殑瀹歸敊澶勭悊鍑芥暟銆傜▼搴忎腑鍙兘鍑虹幇鐨勫悇縐嶉敊璇兘灝嗙敱璇ュ嚱鏁拌繘琛屽鐞嗭紝渚濇嵁閿欒鐨勫嵄瀹崇▼搴︿笉鍚岋紝寤虹珛鍑犵涓嶅悓鐨勫鐞嗘帾鏂姐傝繖鏍鳳紝鎵嶈兘淇濊瘉鍙屾柟閫氳瘽鐨勯『鍒╁拰鍙潬銆傤?br />
銆鍥涖佺粨璁侯?/b>

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



鏉? 2007-01-31 11:47 鍙戣〃璇勮
]]>
鐢╒C++6.0鐨凷ockets API瀹炵幇涓涓亰澶╁紼嬪簭http://m.shnenglu.com/eday/archive/2007/01/31/18207.html鏉?鏉?Wed, 31 Jan 2007 03:34:00 GMThttp://m.shnenglu.com/eday/archive/2007/01/31/18207.html1.VC++緗戠粶緙栫▼鍙奧indows Sockets API綆浠?/font>

銆銆VC++瀵圭綉緇滅紪紼嬬殑鏀寔鏈塻ocket鏀寔錛學inInet鏀寔錛孧API鍜孖SAPI鏀寔絳夈傚叾涓紝Windows Sockets API鏄疶CP/IP緗戠粶鐜閲岋紝涔熸槸Internet涓婅繘琛屽紑鍙戞渶涓洪氱敤鐨凙PI銆傛渶鏃╃編鍥藉姞宸炲ぇ瀛erkeley鍒嗘牎鍦║NIX涓嬩負TCP/IP鍗忚寮鍙戜簡涓涓狝PI錛岃繖涓狝PI灝辨槸钁楀悕鐨凚erkeley Socket鎺ュ彛(濂楁帴瀛?銆傚湪妗岄潰鎿嶄綔緋葷粺榪涘叆Windows鏃朵唬鍚庯紝浠嶇劧緇ф壙浜哠ocket鏂規硶銆傚湪TCP/IP緗戠粶閫氫俊鐜涓嬶紝Socket鏁版嵁浼犺緭鏄竴縐嶇壒孌婄殑I/O錛屽畠涔熺浉褰撲簬涓縐嶆枃浠舵弿榪扮錛屽叿鏈変竴涓被浼間簬鎵撳紑鏂囦歡鐨勫嚱鏁拌皟鐢?socket()銆傚彲浠ヨ繖鏍風悊瑙o細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緋葷粺璋冪敤

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

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

銆銆3.1瀹炵幇鎬濇兂

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

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

銆銆闄愪簬綃囧箙錛岃繖閲屼粎緇欏嚭涓庣綉緇滅紪紼嬬浉鍏崇殑鏍稿績浠g爜錛屽叾浠栫殑璇稿鑱婂ぉ鏂囧瓧鐨勬湇鍔″櫒鍜屽鎴風鏄劇ず璇昏呭彲浠ヨ嚜琛屾坊鍔犮?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錛岀被鍨嬩負SOCK_STREAM錛岄潰鍚戣繛鎺ョ殑閫氫俊
銆銆if (m_pDoc->m_hServerSocket == INVALID_SOCKET)
銆銆{ ReportWinsockErr("鏃犳硶鍒涘緩鏈嶅姟鍣╯ocket!");
銆銆銆return;}
銆銆m_pDoc->m_sockServerAddr.sin_family = AF_INET;
銆銆m_pDoc->m_sockServerAddr.sin_addr.s_addr = INADDR_ANY;
銆銆m_pDoc->m_sockServerAddr.sin_port = htons(m_pDoc->m_nServerPort);
銆銆if (bind(m_pDoc->m_hServerSocket, (LPSOCKADDR)&m_pDoc->m_sockServerAddr, 銆銆
銆銆銆銆 sizeof(m_pDoc->m_sockServerAddr)) == SOCKET_ERROR) //涓庨夊畾鐨勭鍙g粦瀹?br />銆銆銆{ReportWinsockErr("鏃犳硶緇戝畾鏈嶅姟鍣╯ocket!");
銆銆銆銆return;}
銆銆銆iErrorCode=WSAAsyncSelect(m_pDoc->m_hServerSocket,m_hWnd,
銆銆銆WM_SERVER_ACCEPT, FD_ACCEPT);
銆銆銆//璁懼畾鏈嶅姟鍣ㄧ浉搴旂殑緗戠粶浜嬩歡涓篎D_ACCEPT錛屽嵆榪炴帴璇鋒眰錛?br />銆銆銆// 浜х敓鐩稿簲浼犻掔粰紿楀彛鐨勬秷鎭負WM_SERVER_ACCEPT
銆銆if (iErrorCode == SOCKET_ERROR)
銆銆銆{ ReportWinsockErr("WSAAsyncSelect璁懼畾澶辮觸!");
銆銆銆銆return;}
銆銆if (listen(m_pDoc->m_hServerSocket, QUEUE_SIZE) == SOCKET_ERROR) //寮濮嬬洃鍚鎴瘋繛鎺ヨ姹?br />銆銆銆{ReportWinsockErr("鏈嶅姟鍣╯ocket鐩戝惉澶辮觸!");
銆銆銆銆m_pParentMenu->EnableMenuItem(ID_SERVER_OPEN, MF_ENABLED);
銆銆銆銆return;}
銆銆m_bServerIsOpen = TRUE; //鐩戣鏈嶅姟鍣ㄦ槸鍚︽墦寮鐨勫彉閲?br />銆return;
}

銆銆鍝嶅簲瀹㈡埛鍙戦佽亰澶╂枃瀛楀埌鏈嶅姟鍣細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);
}

銆銆瀵逛簬瀹㈡埛鏂紑榪炴帴錛屼細浜х敓涓涓狥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()錛屽鎴風鑱婂ぉ鐨勫瓧絎﹀彂閫佷嬌鐢ㄦ暟鎹彲鎺х紦鍐插彂閫佸嚱鏁皊end()錛岃繖涓や釜榪囩▼姣旇緝綆鍗曪紝鍦ㄦ灝變笉鍔犺禈榪頒簡銆?br />
銆銆5.灝忕粨

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


鏉? 2007-01-31 11:34 鍙戣〃璇勮
]]>
Windows Sockets API瀹炵幇緗戠粶寮傛閫氳http://m.shnenglu.com/eday/archive/2007/01/31/18206.html鏉?鏉?Wed, 31 Jan 2007 03:32:00 GMThttp://m.shnenglu.com/eday/archive/2007/01/31/18206.html鎽樿錛?/strong>鏈枃瀵瑰浣曚嬌鐢ㄩ潰鍚戣繛鎺ョ殑嫻佸紡濂楁帴瀛楀疄鐜板緗戝崱鐨勭紪紼嬩互鍙婂浣曞疄鐜板紓姝ョ綉緇滈氳絳夐棶棰樿繘琛屼簡璁ㄨ涓庨槓榪般?

銆銆涓銆?寮曡█

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

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

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

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

//{{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()鍑芥暟鏃訛紝鏈変互涓嬪嚑鐐歸渶瑕佸紩璧風壒鍒殑娉ㄦ剰錛?br />
銆銆1錛?榪炵畫浣跨敤涓ゆWSAAsyncSelect()鍑芥暟鏃訛紝鍙湁絎簩嬈¤緗殑浜嬩歡鏈夋晥錛屽錛?br />
WSAAsyncSelect(s,hwnd,wMsg1,FD_READ);
WSAAsyncSelect(s,hwnd,wMsg2,FD_CLOSE);

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

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


鏉? 2007-01-31 11:32 鍙戣〃璇勮
]]>
TCP/IP Winsock緙栫▼瑕佺偣http://m.shnenglu.com/eday/archive/2007/01/31/18203.html鏉?鏉?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錛屾敹鍙戠紦鍐插ぇ灝忎負8192銆?

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

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

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

銆銆鍚屾鏂瑰紡涓殑鏂綉鏃禼onnect鐨勯樆濉炴椂闂翠負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,//鍐欑紦鍐詫紝璇葷紦鍐蹭負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

銆銆鍦ㄥ彲闈犳ц姹傞珮鐨勫簲鐢ㄤ腑錛岃姹備嬌鐢ㄥ弻緗戝拰澶氱綉緇滈氶亾錛屽啀鏈嶅姟鏂瑰緢瀹規槗瀹炵幇錛岀敤濡備笅鏂瑰紡鍙緩绔嬪鎴峰鏈満鎵鏈塈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浣滀負I/O Server鐨勫鎴鳳紝浣咺/O Server涔熷彲涓誨姩鍚慠TDB鍙戦佸紑鍏崇姸鎬佸彉浣嶃侀殢鍗充簨浠剁瓑淇℃伅銆傚湪寰堝ぇ紼嬪害涓婂噺灝戜簡緗戠粶閫氫俊璐熻嵎銆佹彁楂樹簡鏁堢巼銆?

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

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

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

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

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

銆銆鍒濆鍖朩inSock鐨勫姩鎬佽繛鎺ュ簱鍚庯紝闇瑕佸湪鏈嶅姟鍣ㄧ寤虹珛涓涓洃鍚殑Socket錛屼負姝ゅ彲浠ヨ皟鐢⊿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搴斾負SOCK_STREAM錛屽涓篣DP錛堟暟鎹姤錛夌殑socket錛屽簲涓篠OCK_DGRAM銆?br />
銆銆3)緇戝畾绔彛

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

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

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

銆銆鏈嶅姟鍣ㄧ鐨凷ocket璋冪敤瀹宭isten錛堬級鍚庯紝濡傛灉姝ゆ椂瀹㈡埛绔皟鐢╟onnect錛堬級鍑芥暟鎻愬嚭榪炴帴鐢寵鐨勮瘽錛孲erver 绔繀欏誨啀璋冪敤accept() 鍑芥暟錛岃繖鏍鋒湇鍔″櫒绔拰瀹㈡埛绔墠綆楁寮忓畬鎴愰氫俊紼嬪簭鐨勮繛鎺ュ姩浣溿備負浜嗙煡閬撲粈涔堟椂鍊欏鎴風鎻愬嚭榪炴帴瑕佹眰錛屼粠鑰屾湇鍔″櫒绔殑Socket鍦ㄦ伆褰撶殑鏃跺欒皟鐢╝ccept()鍑芥暟瀹屾垚榪炴帴鐨勫緩绔嬶紝鎴戜滑灝辮浣跨敤WSAAsyncSelect錛堬級鍑芥暟錛岃緋葷粺涓誨姩鏉ラ氱煡鎴戜滑鏈夊鎴風鎻愬嚭榪炴帴璇鋒眰浜嗐傝鍑芥暟璋冪敤鎴愬姛榪斿洖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錛氳娉ㄥ唽鐨勭綉緇滀簨浠訛紝涔熷嵆鏄簲鐢ㄧ▼搴忓悜紿楀彛鍙戦佹秷鎭殑緗戣礬浜嬩歡錛岃鍊間負涓嬪垪鍊糉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鍒欎負浠ヤ笂鍚勭緗戠粶浜嬩歡鍚嶇О銆傛墍浠ワ紝鍙互鍦ㄧ獥鍙e鐞嗚嚜瀹氫箟娑堟伅鍑芥暟涓嬌鐢ㄤ互涓嬬粨鏋勬潵鍝嶅簲Socket鐨勪笉鍚屼簨浠訛細銆銆

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

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

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

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

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

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

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

銆銆铏界劧鍩轟簬TCP/IP榪炴帴鍗忚錛堟祦濂楁帴瀛楋級鐨勬湇鍔℃槸璁捐瀹㈡埛鏈?鏈嶅姟鍣ㄥ簲鐢ㄧ▼搴忔椂鐨勪富嫻佹爣鍑嗭紝浣嗘湁浜涙湇鍔′篃鏄彲浠ラ氳繃鏃犺繛鎺ュ崗璁紙鏁版嵁鎶ュ鎺ュ瓧錛夋彁渚涚殑銆傚厛浠嬬粛涓涓婽CP socket 涓嶶DP socket 鍦ㄤ紶閫佹暟鎹椂鐨勭壒鎬э細Stream (TCP) Socket 鎻愪緵鍙屽悜銆佸彲闈犮佹湁嬈″簭銆佷笉閲嶅鐨勮祫鏂欎紶閫併侱atagram (UDP) Socket 铏界劧鎻愪緵鍙屽悜鐨勯氫俊錛屼絾娌℃湁鍙潬銆佹湁嬈″簭銆佷笉閲嶅鐨勪繚璇侊紝鎵浠DP浼犻佹暟鎹彲鑳戒細鏀跺埌鏃犳搴忋侀噸澶嶇殑璧勬枡錛岀敋鑷寵祫鏂欏湪浼犺緭榪囩▼涓嚭鐜伴仐婕忋傜敱浜嶶DP Socket 鍦ㄤ紶閫佽祫鏂欐椂錛屽茍涓嶄繚璇佽祫鏂欒兘瀹屾暣鍦伴佽揪瀵規柟錛屾墍浠ョ粷澶у鏁板簲鐢ㄧ▼搴忛兘鏄噰鐢═CP澶勭悊Socket錛屼互淇濊瘉璧勬枡鐨勬紜с備竴鑸儏鍐典笅TCP Socket 鐨勬暟鎹彂閫佸拰鎺ユ敹鏄皟鐢╯end() 鍙妑ecv() 榪欎袱涓嚱鏁版潵杈炬垚錛岃?UDP Socket鍒欐槸鐢╯endto() 鍙妑ecvfrom() 榪欎袱涓嚱鏁幫紝榪欎袱涓嚱鏁拌皟鐢ㄦ垚鍔熷彂鎸ュ彂閫佹垨鎺ユ敹鐨勮祫鏂欑殑闀垮害錛屽惁鍒欒繑鍥濻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 鐨勫ぇ灝忚秴榪囬檺鍒訛紝鍒欏皢涓嶄細閫佸嚭浠諱綍璧勬枡錛屽茍浼氫紶鍥為敊璇箋傚Stream Socket 璦錛孊locking 妯″紡涓嬶紝鑻ユ槸浼犻佺郴緇熷唴鐨勫偍瀛樼┖闂翠笉澶熷瓨鏀捐繖浜涜浼犻佺殑璧勬枡錛宻end()灝嗕細琚玝lock浣忥紝鐩村埌璧勬枡閫佸畬涓烘錛涘鏋滆Socket琚瀹氫負 Non-Blocking 妯″紡錛岄偅涔堝皢瑙嗙洰鍓嶇殑output buffer絀洪棿鏈夊灝戯紝灝遍佸嚭澶氬皯璧勬枡錛屽茍涓嶄細琚?block 浣忋俧lags 鐨勫煎彲璁句負 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>

銆銆鏍規嵁涓婇潰鐨勭煡璇嗭紝鎴戣嚜瀹氫箟浜嗕竴涓畝鍗曠殑CMySocket綾伙紝涓嬮潰鏄垜瀹氫箟鐨勮綾葷殑閮ㄥ垎瀹炵幇浠g爜錛?br />
//////////////////////////////////////
CMySocket::CMySocket() : file://綾葷殑鏋勯犲嚱鏁?br />{
銆WSADATA wsaD;
銆memset( m_LastError, 0, ERR_MAXLENGTH );
銆// m_LastError鏄被鍐呭瓧絎︿覆鍙橀噺,鍒濆鍖栫敤鏉ュ瓨鏀炬渶鍚庨敊璇鏄庣殑瀛楃涓詫紱
銆// 鍒濆鍖栫被鍐卻ockaddr_in緇撴瀯鍙橀噺錛屽墠鑰呭瓨鏀懼鎴風鍦板潃錛屽悗鑰呭搴斾簬鏈嶅姟鍣ㄧ鍦板潃;
銆memset( &m_sockaddr, 0, sizeof( m_sockaddr ) );
銆memset( &m_rsockaddr, 0, sizeof( m_rsockaddr ) );
銆int result = WSAStartup((WORD)((1<<8|1)錛?&wsaD);//鍒濆鍖朩inSocket鍔ㄦ佽繛鎺ュ簱;
銆if( result != 0 ) // 鍒濆鍖栧け璐ワ紱
銆{ set_LastError( "WSAStartup failed!", WSAGetLastError() );
銆銆return;
銆}
}

//////////////////////////////
CMySocket::~CMySocket() { WSACleanup(); }//綾葷殑鏋愭瀯鍑芥暟錛?br />////////////////////////////////////////////////////
int CMySocket::Create( void )
銆{// m_hSocket鏄被鍐匰ocket瀵硅薄錛屽垱寤轟竴涓熀浜嶵CP/IP鐨凷ocket鍙橀噺錛屽茍灝嗗艱祴緇欒鍙橀噺錛?br />銆銆if ( (m_hSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP )) == INVALID_SOCKET )
銆銆{
銆銆銆set_LastError( "socket() failed", WSAGetLastError() );
銆銆銆return ERR_WSAERROR;
銆銆}
銆銆return ERR_SUCCESS;
銆}
///////////////////////////////////////////////
int CMySocket::Close( void )//鍏抽棴Socket瀵硅薄錛?br />{
銆if ( closesocket( m_hSocket ) == SOCKET_ERROR )
銆{
銆銆set_LastError( "closesocket() failed", WSAGetLastError() );
銆銆return ERR_WSAERROR;
銆}
銆file://閲嶇疆sockaddr_in 緇撴瀯鍙橀噺錛?br />銆memset( &m_sockaddr, 0, sizeof( sockaddr_in ) );
銆memset( &m_rsockaddr, 0, sizeof( sockaddr_in ) );
銆return ERR_SUCCESS;
}
/////////////////////////////////////////
int CMySocket::Connect( char* strRemote, unsigned int iPort )//瀹氫箟榪炴帴鍑芥暟錛?br />{
銆if( strlen( strRemote ) == 0 || iPort == 0 )
銆銆return ERR_BADPARAM;
銆hostent *hostEnt = NULL;
銆long lIPAddress = 0;
銆hostEnt = gethostbyname( strRemote );//鏍規嵁璁$畻鏈哄悕寰楀埌璇ヨ綆楁満鐨勭浉鍏沖唴瀹癸紱
銆if( hostEnt != NULL )
銆{
銆銆lIPAddress = ((in_addr*)hostEnt->h_addr)->s_addr;
銆銆m_sockaddr.sin_addr.s_addr = lIPAddress;
銆}
銆else
銆{
銆銆m_sockaddr.sin_addr.s_addr = inet_addr( strRemote );
銆}
銆m_sockaddr.sin_family = AF_INET;
銆m_sockaddr.sin_port = htons( iPort );
銆if( connect( m_hSocket, (SOCKADDR*)&m_sockaddr, sizeof( m_sockaddr ) ) == SOCKET_ERROR )
銆{
銆銆set_LastError( "connect() failed", WSAGetLastError() );
銆銆return ERR_WSAERROR;
銆}
銆return ERR_SUCCESS;
}
///////////////////////////////////////////////////////
int CMySocket::Bind( char* strIP, unsigned int iPort )//緇戝畾鍑芥暟錛?br />{
銆if( strlen( strIP ) == 0 || iPort == 0 )
銆銆return ERR_BADPARAM;
銆memset( &m_sockaddr,0, sizeof( m_sockaddr ) );
銆m_sockaddr.sin_family = AF_INET;
銆m_sockaddr.sin_addr.s_addr = inet_addr( strIP );
銆m_sockaddr.sin_port = htons( iPort );
銆if ( bind( m_hSocket, (SOCKADDR*)&m_sockaddr, sizeof( m_sockaddr ) ) == SOCKET_ERROR )
銆{
銆銆set_LastError( "bind() failed", WSAGetLastError() );
銆銆return ERR_WSAERROR;
銆}
銆return ERR_SUCCESS;
}
//////////////////////////////////////////
int CMySocket::Accept( SOCKET s )//寤虹珛榪炴帴鍑芥暟錛孲涓虹洃鍚琒ocket瀵硅薄鍚嶏紱
{
銆int Len = sizeof( m_rsockaddr );
銆memset( &m_rsockaddr, 0, sizeof( m_rsockaddr ) );
銆if( ( m_hSocket = accept( s, (SOCKADDR*)&m_rsockaddr, &Len ) ) == INVALID_SOCKET )
銆{
銆銆set_LastError( "accept() failed", WSAGetLastError() );
銆銆return ERR_WSAERROR;
銆}
銆return ERR_SUCCESS;
}
/////////////////////////////////////////////////////
int CMySocket::asyncSelect( HWND hWnd, unsigned int wMsg, long lEvent )
file://浜嬩歡閫夋嫨鍑芥暟錛?br />{
銆if( !IsWindow( hWnd ) || wMsg == 0 || lEvent == 0 )
銆銆return ERR_BADPARAM;
銆if( WSAAsyncSelect( m_hSocket, hWnd, wMsg, lEvent ) == SOCKET_ERROR )
銆{
銆銆set_LastError( "WSAAsyncSelect() failed", WSAGetLastError() );
銆銆return ERR_WSAERROR;
銆}
銆return ERR_SUCCESS;
}
////////////////////////////////////////////////////
int CMySocket::Listen( int iQueuedConnections )//鐩戝惉鍑芥暟錛?br />{
銆if( iQueuedConnections == 0 )
銆銆return ERR_BADPARAM;
銆if( listen( m_hSocket, iQueuedConnections ) == SOCKET_ERROR )
銆{
銆銆set_LastError( "listen() failed", WSAGetLastError() );
銆銆return ERR_WSAERROR;
銆}
銆return ERR_SUCCESS;
}
////////////////////////////////////////////////////
int CMySocket::Send( char* strData, int iLen )//鏁版嵁鍙戦佸嚱鏁幫紱
{
銆if( strData == NULL || iLen == 0 )
銆銆return ERR_BADPARAM;
銆if( send( m_hSocket, strData, iLen, 0 ) == SOCKET_ERROR )
銆{
銆銆set_LastError( "send() failed", WSAGetLastError() );
銆銆return ERR_WSAERROR;
銆}
銆return ERR_SUCCESS;
}
/////////////////////////////////////////////////////
int CMySocket::Receive( char* strData, int iLen )//鏁版嵁鎺ユ敹鍑芥暟錛?br />{
銆if( strData == NULL )
銆銆return ERR_BADPARAM;
銆int len = 0;
銆int ret = 0;
銆ret = recv( m_hSocket, strData, iLen, 0 );
銆if ( ret == SOCKET_ERROR )
銆{
銆銆set_LastError( "recv() failed", WSAGetLastError() );
銆銆return ERR_WSAERROR;
銆}
銆return ret;
}
void CMySocket::set_LastError( char* newError, int errNum )
file://WinSock API鎿嶄綔閿欒瀛楃涓茶緗嚱鏁幫紱
{
銆memset( m_LastError, 0, ERR_MAXLENGTH );
銆memcpy( m_LastError, newError, strlen( newError ) );
銆m_LastError[strlen(newError)+1] = '\0';
}

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

鏉? 2007-01-31 10:51 鍙戣〃璇勮
]]>
Windows Socket1.1 紼嬪簭璁捐http://m.shnenglu.com/eday/archive/2007/01/30/18190.html鏉?鏉?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娑堟伅椹卞姩鐗規х殑緗戠粶浜嬩歡寮傛閫夋嫨鏈哄埗銆?br />
銆銆Windows Sockets鐢變袱閮ㄥ垎緇勬垚錛氬紑鍙戠粍浠跺拰榪愯緇勪歡銆?br />
銆銆寮鍙戠粍浠訛細Windows Sockets 瀹炵幇鏂囨。銆佸簲鐢ㄧ▼搴忔帴鍙?API)寮曞叆搴撳拰涓浜涘ご鏂囦歡銆?br />
銆銆榪愯緇勪歡錛歐indows Sockets 搴旂敤紼嬪簭鎺ュ彛鐨勫姩鎬侀摼鎺ュ簱(WINSOCK.DLL)銆?

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

銆銆1銆佸紓姝ラ夋嫨鏈哄埗錛?br />
銆銆Windows Sockets 鐨勫紓姝ラ夋嫨鍑芥暟鎻愪緵浜嗘秷鎭満鍒剁殑緗戠粶浜嬩歡閫夋嫨錛屽綋浣跨敤瀹冪櫥璁扮綉緇滀簨浠跺彂鐢熸椂錛屽簲鐢ㄧ▼搴忕浉搴旂獥鍙e嚱鏁板皢鏀跺埌涓涓秷鎭紝娑堟伅涓寚紺轟簡鍙戠敓鐨勭綉緇滀簨浠訛紝浠ュ強涓庝簨浠剁浉鍏崇殑涓浜涗俊鎭?br />
銆銆Windows Sockets 鎻愪緵浜嗕竴涓紓姝ラ夋嫨鍑芥暟 WSAAsyncSelect()錛岀敤瀹冩潵娉ㄥ唽搴旂敤紼嬪簭鎰熷叴瓚g殑緗戠粶浜嬩歡錛屽綋榪欎簺浜嬩歡鍙戠敓鏃訛紝搴旂敤紼嬪簭鐩稿簲鐨勭獥鍙e嚱鏁板皢鏀跺埌涓涓秷鎭?br />
銆銆鍑芥暟緇撴瀯濡備笅錛?/p>
int PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent);

銆銆鍙傛暟璇存槑錛?br />
銆銆銆hWnd錛氱獥鍙e彞鏌?br />
銆銆銆wMsg錛氶渶瑕佸彂閫佺殑娑堟伅

銆銆銆lEvent錛氫簨浠訛紙浠ヤ笅涓轟簨浠剁殑鍐呭錛?br />

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

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

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

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

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

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

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

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

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

銆銆鎴戜滑緇堜簬鍙互寮濮嬬湡姝g殑 Windows Sockets 緗戠粶紼嬪簭璁捐浜嗐備笉榪囨垜浠繕鏄厛鐪嬩竴鐪嬫瘡涓?Windows Sockets 緗戠粶紼嬪簭閮借娑夊強鐨勫唴瀹廣傝鎴戜滑涓姝ユ鎱㈡參璧般?/p>

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

銆銆鍦ㄦ墍鏈?Windows Sockets 鍑芥暟涓紝鍙湁鍚姩鍑芥暟 WSAStartup() 鍜岀粓姝㈠嚱鏁?WSACleanup() 鏄繀欏諱嬌鐢ㄧ殑銆?br />
銆銆鍚姩鍑芥暟蹇呴』鏄涓涓嬌鐢ㄧ殑鍑芥暟錛岃屼笖瀹冨厑璁告寚瀹?Windows Sockets API 鐨勭増鏈紝騫惰幏寰?SOCKETS鐨勭壒瀹氱殑涓浜涙妧鏈粏鑺傘傛湰緇撴瀯濡備笅錛?br />

int PASCAL FAR WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

銆銆鍏朵腑 wVersionRequested 淇濊瘉 SOCKETS 鍙甯歌繍琛岀殑 DLL 鐗堟湰錛屽鏋滀笉鏀寔錛屽垯榪斿洖閿欒淇℃伅銆?br />鎴戜滑鐪嬩竴涓嬩笅闈㈣繖孌典唬鐮侊紝鐪嬩竴涓嬪浣曡繘琛?WSAStartup() 鐨勮皟鐢?br />

WORD wVersionRequested;// 瀹氫箟鐗堟湰淇℃伅鍙橀噺
WSADATA wsaData;//瀹氫箟鏁版嵁淇℃伅鍙橀噺
int err;//瀹氫箟閿欒鍙峰彉閲?br />wVersionRequested = MAKEWORD(1,1);//緇欑増鏈俊鎭祴鍊?br />err = WSAStartup(wVersionRequested, &wsaData);//緇欓敊璇俊鎭祴鍊?br />if(err!=0)
{
return;//鍛婅瘔鐢ㄦ埛鎵句笉鍒板悎閫傜殑鐗堟湰
}
//紜 Windows Sockets DLL 鏀寔 1.1 鐗堟湰
//DLL 鐗堟湰鍙互楂樹簬 1.1
//緋葷粺榪斿洖鐨勭増鏈彿濮嬬粓鏄渶浣庤姹傜殑 1.1錛屽嵆搴旂敤紼嬪簭涓嶥LL 涓彲鏀寔鐨勬渶浣庣増鏈彿
if(LOBYTE(wsaData.wVersion)!= 1|| HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();//鍛婅瘔鐢ㄦ埛鎵句笉鍒板悎閫傜殑鐗堟湰
return;
}
//Windows Sockets DLL 琚繘紼嬫帴鍙楋紝鍙互榪涘叆涓嬩竴姝ユ搷浣?/td>

銆銆鍏抽棴鍑芥暟浣跨敤鏃訛紝浠諱綍鎵撳紑騫跺凡榪炴帴鐨?SOCK_STREAM 濂楁帴瀛楄澶嶄綅錛屼絾閭d簺宸茬敱 closesocket() 鍑芥暟鍏抽棴鐨勪絾浠嶆湁鏈彂閫佹暟鎹殑濂楁帴瀛椾笉鍙楀獎鍝嶏紝鏈彂閫佺殑鏁版嵁浠嶅皢琚彂閫併傜▼搴忚繍琛屾椂鍙兘浼氬嬈¤皟鐢?WSAStartuo() 鍑芥暟錛屼絾蹇呴』淇濊瘉姣忔璋冪敤鏃剁殑 wVersionRequested 鐨勫兼槸鐩稿悓鐨勩?/p>

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

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

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

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

銆銆鍋囪濂楁帴瀛?s 鍦ㄨ繛鎺ュ緩绔嬪悗錛屽凡緇忎嬌鐢ㄤ簡鍑芥暟 WSAAsyncSelect() 鍦ㄥ叾涓婃敞鍐屼簡緗戠粶浜嬩歡 FD_READ 鍜?FD_WRITE錛屽茍涓?wMsg 鍊間負 UM_SOCK錛岄偅涔堟垜浠彲浠ュ湪 Windows 娑堟伅寰幆涓鍔犲涓嬬殑鍒嗘敮璇彞錛?/p>

case UM_SOCK:
switch(lParam)
{
case FD_READ:
len = recv(wParam,lpBuffer,length,0);
break;
case FD_WRITE:
while(send(wParam,lpBuffer,len,0)!=SOCKET_ERROR)
break;
}
break;

銆銆4銆佸嚭閿欏鐞?br />
銆銆Windows 鎻愪緵浜嗕竴涓嚱鏁版潵鑾峰彇鏈榪戠殑閿欒鐮?WSAGetLastError()錛屾帹鑽愮殑緙栧啓鏂瑰紡濡備笅錛?

len = send (s,lpBuffer,len,0);
of((len==SOCKET_ERROR)&&(WSAGetLastError()==WSAWOULDBLOCK)){...}


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

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

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

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

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

銆銆涓轟簡鏇村ソ璇存槑濂楁帴瀛楃紪紼嬪師鐞嗭紝緇欏嚭鍑犱釜鍩烘湰鐨勫鎺ュ瓧錛屽湪浠ュ悗鐨勭瘒騫呬腑浼氱粰鍑烘洿璇︾粏鐨勪嬌鐢ㄨ鏄庛?br />
銆銆1銆佸垱寤哄鎺ュ瓧鈥斺攕ocket()

銆銆鍔熻兘錛氫嬌鐢ㄥ墠鍒涘緩涓涓柊鐨勫鎺ュ瓧

銆銆鏍煎紡錛歋OCKET PASCAL FAR socket(int af,int type,int procotol);

銆銆鍙傛暟錛歛f: 閫氫俊鍙戠敓鐨勫尯鍩?br />
銆銆type: 瑕佸緩绔嬬殑濂楁帴瀛楃被鍨?br />
銆銆procotol: 浣跨敤鐨勭壒瀹氬崗璁?/p>

銆銆2銆佹寚瀹氭湰鍦板湴鍧鈥斺攂ind()

銆銆鍔熻兘錛氬皢濂楁帴瀛楀湴鍧涓庢墍鍒涘緩鐨勫鎺ュ瓧鍙瘋仈緋昏搗鏉ャ?br />
銆銆鏍煎紡錛歩nt PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);

銆銆鍙傛暟錛歴: 鏄敱socket()璋冪敤榪斿洖鐨勫茍涓旀湭浣滆繛鎺ョ殑濂楁帴瀛楁弿榪扮錛堝鎺ュ瓧鍙鳳級銆?br />
銆銆鍏跺畠錛氭病鏈夐敊璇紝bind()榪斿洖0錛屽惁鍒橲OCKET_ERROR

銆銆鍦板潃緇撴瀯璇存槑錛?br />
struct sockaddr_in
{
short sin_family;//AF_INET
u_short sin_port;//16浣嶇鍙e彿錛岀綉緇滃瓧鑺傞『搴?br />struct in_addr sin_addr;//32浣岻P鍦板潃錛岀綉緇滃瓧鑺傞『搴?br />char sin_zero[8];//淇濈暀
}

銆銆3銆佸緩绔嬪鎺ュ瓧榪炴帴鈥斺攃onnect()鍜宎ccept()

銆銆鍔熻兘錛氬叡鍚屽畬鎴愯繛鎺ュ伐浣?br />
銆銆鏍煎紡錛歩nt PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);

銆銆SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR * addrlen);

銆銆鍙傛暟錛氬悓涓?/p>

銆銆4銆佺洃鍚繛鎺モ斺攍isten()

銆銆鍔熻兘錛氱敤浜庨潰鍚戣繛鎺ユ湇鍔″櫒錛岃〃鏄庡畠鎰挎剰鎺ユ敹榪炴帴銆?br />
銆銆鏍煎紡錛歩nt PASCAL FAR listen(SOCKET s, int backlog);

銆銆5銆佹暟鎹紶杈撯斺攕end()涓巖ecv()

銆銆鍔熻兘錛氭暟鎹殑鍙戦佷笌鎺ユ敹

銆銆鏍煎紡錛歩nt PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);

銆銆int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);

銆銆鍙傛暟錛歜uf:鎸囧悜瀛樻湁浼犺緭鏁版嵁鐨勭紦鍐插尯鐨勬寚閽堛?

銆銆6銆佸璺鐢ㄢ斺攕elect()

銆銆鍔熻兘錛氱敤鏉ユ嫻嬩竴涓垨澶氫釜濂楁帴瀛楃姸鎬併?br />
銆銆鏍煎紡錛歩nt PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds,
fd_set FAR * exceptfds,const struct timeval FAR * timeout);

銆銆鍙傛暟錛歳eadfds:鎸囧悜瑕佸仛璇繪嫻嬬殑鎸囬拡

銆銆銆銆銆writefds:鎸囧悜瑕佸仛鍐欐嫻嬬殑鎸囬拡

銆銆銆銆銆exceptfds:鎸囧悜瑕佹嫻嬫槸鍚﹀嚭閿欑殑鎸囬拡

銆銆銆銆銆timeout:鏈澶х瓑寰呮椂闂?/p>

銆銆7銆佸叧闂鎺ュ瓧鈥斺攃losesocket()

銆銆鍔熻兘錛氬叧闂鎺ュ瓧s

銆銆鏍煎紡錛欱OOL PASCAL FAR closesocket(SOCKET s);

涓夈佸吀鍨嬭繃紼嬪浘

銆銆2.1 闈㈠悜榪炴帴鐨勫鎺ュ瓧鐨勭郴緇熻皟鐢ㄦ椂搴忓浘



銆銆2.2 鏃犺繛鎺ュ崗璁殑濂楁帴瀛楄皟鐢ㄦ椂搴忓浘



聽 銆2.3 闈㈠悜榪炴帴鐨勫簲鐢ㄧ▼搴忔祦紼嬪浘




鏉? 2007-01-30 22:04 鍙戣〃璇勮
]]>
Winsocket緙栫▼涔婽CP/IP浣撶郴緇撴瀯http://m.shnenglu.com/eday/archive/2007/01/30/18188.html鏉?鏉?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) 璐熻矗涓繪満闂存暟鎹殑璺敱鍜岀綉緇滀笂鏁版嵁鐨勫瓨鍌ㄣ傚悓鏃朵負ICMP錛孴CP錛屻銆銆UDP鎻愪緵鍒嗙粍鍙戦佹湇鍔°傜敤鎴瘋繘紼嬮氬父涓嶉渶瑕佹秹鍙婅繖涓灞傘?br />
銆銆ARP錛?鍦板潃瑙f瀽鍗忚(Address Resolution Protocol)
銆銆銆姝ゅ崗璁皢緗戠粶鍦板潃鏄犲皠鍒扮‖浠跺湴鍧銆?br />
銆銆RARP錛?鍙嶅悜鍦板潃瑙f瀽鍗忚(Reverse Address Resolution Protocol)
銆銆銆姝ゅ崗璁皢紜歡鍦板潃鏄犲皠鍒扮綉緇滃湴鍧

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

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

銆銆2銆乀CP/IP鐗圭偣

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

(鍥?.2)

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

銆銆1銆佸鎺ュ瓧

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

銆銆2銆乄INDOWS SOCKETS 瀹炵幇

銆銆涓涓猈INDOWS SOCKETS 瀹炵幇鏄寚瀹炵幇浜哤INDOWS SOCKETS瑙勮寖鎵鎻忚堪鐨勫叏閮ㄥ姛鑳界殑涓濂楄蔣浠躲備竴鑸氳繃DLL鏂囦歡鏉ュ疄鐜?/p>

銆銆3銆侀樆濉炲鐞嗕緥紼?br />
銆銆闃誨澶勭悊渚嬬▼(blocking hook,闃誨閽╁瓙)鏄疻INDOWS SOCKETS瀹炵幇涓轟簡鏀寔闃誨濂楁帴瀛楀嚱鏁拌皟鐢ㄨ屾彁渚涚殑涓縐嶆満鍒躲?/p>

銆銆4銆佸鍧騫挎挱錛坢ulticast錛屽鐐逛紶閫佹垨緇勬挱錛?br />
銆銆鏄竴縐嶄竴瀵瑰鐨勪紶杈撴柟寮忥紝浼犺緭鍙戣搗鑰呴氳繃涓嬈′紶杈撳氨灝嗕俊鎭紶閫佸埌涓緇勬帴鏀惰咃紝涓庡崟鐐逛紶閫?br />(unicast)鍜屽箍鎾?Broadcast)鐩稿搴斻?/p>

鏉? 2007-01-30 21:59 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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一区二区三区免费区| 国产精品热久久久久夜色精品三区 | 国产亚洲视频在线| 99成人精品| 日韩午夜在线观看视频| 久久青草久久| 在线中文字幕一区| 日韩小视频在线观看| 国产精品视屏| 亚洲在线视频| 久久国产福利| 尤物九九久久国产精品的特点| 午夜精品av| 麻豆91精品91久久久的内涵| 国产嫩草影院久久久久| 久久在精品线影院精品国产| 欧美大学生性色视频| 翔田千里一区二区| 久久久久www| 精品999在线播放| 久久天天躁狠狠躁夜夜爽蜜月| 久久成人精品一区二区三区| 久久久国产亚洲精品| 亚洲欧美日韩精品久久久| 久久久久九九视频| 欧美乱大交xxxxx| 久久精品国产免费看久久精品| 亚洲国产美女久久久久| 欧美电影在线播放| 亚洲伊人久久综合| 在线视频日韩精品| 亚洲一区二区三区影院| 亚洲乱码国产乱码精品精天堂 | 欧美在线地址| 狠狠色狠色综合曰曰| 麻豆精品在线观看| 欧美国产视频在线观看| 亚洲一区bb| 欧美一区二区三区在线观看| 在线观看不卡av| 91久久精品国产| 国产精品乱人伦一区二区 | 亚洲欧美日韩国产中文| 一区二区三区久久精品| 欧美亚洲第一区| 久久国产日本精品| 免费不卡视频| 亚洲欧美在线x视频| 久久精品视频免费| 一本色道久久综合狠狠躁篇的优点| 亚洲最新视频在线| 国产视频在线一区二区| 欧美激情在线免费观看| 欧美日韩精品是欧美日韩精品| 一区二区三区四区精品| 久久精品人人做人人爽| 一区二区三区免费观看| 亚洲一区二区三区在线播放| 在线观看亚洲a| 亚洲精品中文字幕有码专区| 一区二区高清| 亚洲成在人线av| 99精品欧美一区二区蜜桃免费| 国产亚洲欧美aaaa| 欧美国产三级| 狠狠v欧美v日韩v亚洲ⅴ| 欧美黑人一区二区三区| 国产亚洲美州欧州综合国| 亚洲电影专区| 国产综合欧美| 亚洲伦理在线观看| 亚洲激情成人| 午夜亚洲福利在线老司机| 一区二区三区高清在线| 久久精品国产77777蜜臀| 亚洲欧美在线x视频| 女人香蕉久久**毛片精品| 欧美自拍丝袜亚洲| 欧美国产日韩一区| 男女视频一区二区| 国产精品亚洲不卡a| 99re6这里只有精品| 亚洲二区精品| 久久综合网色—综合色88| 午夜亚洲性色视频| 久久米奇亚洲| 久久精品30| 亚洲一卡久久| 亚洲线精品一区二区三区八戒| 亚洲欧美成人综合| 午夜精品婷婷| 欧美体内she精视频| 亚洲人成在线免费观看| 亚洲第一页在线| 久久一区二区三区四区| 久久精品欧洲| 一区二区三区在线观看欧美 | 欧美日韩一区二区国产| 欧美二区视频| 亚洲日本免费电影| 久久九九久久九九| 麻豆视频一区二区| 国产主播一区二区三区四区| 久久国产精品一区二区| 午夜日韩激情| 国产午夜精品久久久久久久| 亚洲视频二区| 欧美怡红院视频| 日韩亚洲不卡在线| 国产日韩亚洲欧美综合| 快播亚洲色图| 国产在线日韩| 久久综合久久美利坚合众国| 久久一区激情| 亚洲人成人77777线观看| 久久亚洲综合色| 亚洲国产另类久久精品| 91久久精品一区二区别| 欧美日本一区二区高清播放视频| 亚洲国产精品一区二区三区| 亚洲男人的天堂在线观看| 欧美日韩一区在线观看| 午夜精品视频一区| 久久精品国产77777蜜臀| 黄色国产精品| 欧美77777| 国内精品国产成人| 久久久欧美精品sm网站| 亚洲国产三级在线| 夜夜爽99久久国产综合精品女不卡 | 欧美日韩在线大尺度| 99ri日韩精品视频| 久久久久久久999| 国产精品自拍视频| 免费不卡亚洲欧美| 亚洲精品一区二区三区樱花| 久久国产精品久久久久久| 国内精品亚洲| 欧美日韩在线看| 先锋亚洲精品| 日韩一级免费| 久久久久久免费| 亚洲一区二区欧美| 国内精品模特av私拍在线观看| 欧美精品99| 香蕉久久精品日日躁夜夜躁| 亚洲人体影院| 久久精品在线播放| 亚洲手机成人高清视频| 国产一区二区精品久久99| 欧美日韩国产系列| 欧美在线视频一区| 亚洲一区二区三区在线看| 欧美成人国产一区二区| 久久激情综合网| 在线亚洲伦理| 亚洲欧洲精品一区| 欧美伦理一区二区| 欧美a级片网| 99精品视频免费观看| 欧美成熟视频| 99精品国产在热久久下载| 在线播放豆国产99亚洲| 欧美高清视频www夜色资源网| 久久久久99精品国产片| 亚洲高清久久| 欧美大秀在线观看| 亚洲一区免费观看| 夜夜嗨av一区二区三区中文字幕| 中日韩高清电影网| 日韩午夜在线视频| 久久国产精品网站| 欧美一区中文字幕| 国产婷婷色一区二区三区四区| 欧美小视频在线观看| 久久不射网站| 久久国产精品99国产| 免费不卡在线视频| 欧美日韩在线免费视频| 欧美电影免费观看大全| 国产精品久久久久永久免费观看| 一区二区久久| 亚洲小说欧美另类社区| 国产精品天天看| 亚洲一级在线观看| 久久九九热re6这里有精品| 亚洲视频免费看| 蜜桃久久av| 亚洲东热激情| 欧美在线|欧美| 在线日韩精品视频| 亚洲欧洲av一区二区| 亚洲精品中文字幕在线观看| 欧美一区二视频| 午夜影院日韩| 你懂的国产精品永久在线| 农村妇女精品| 亚洲精品123区| 欧美午夜大胆人体| 一区二区三区鲁丝不卡|