;
帖子
3919 
精华
积分
11710 
鱼币
0 ¥ 
来自
大连 
在线时间
1858 小时 
注册时间
2007-6-11 
最后登录
2009-10-20 

贴图大师勋章新人进步勋章宣传大使勋章论坛元老勋章

3
发表于 2009-1-5 19:48 | 只看该作者
鐢╒C++6.0鐨凷ockets API瀹炵幇涓涓亰澶╁绋嬪簭 - 缂栫▼搴 - Powered by SupeSite

浣犵殑浣嶇疆锛缂栫▼搴 >> 璧勮 >> VC >> 閫氫俊缃戠粶 >> 璇︾粏鍐呭 鍦ㄧ嚎鎶曠ǹ

鐢╒C++6.0鐨凷ockets API瀹炵幇涓涓亰澶╁绋嬪簭

鍙戝竷: 2008-6-26 12:23 |  浣滆: admin |   鏌ョ湅: 125娆

1.VC++缃戠粶缂栫▼鍙奧indows Sockets API绠浠

銆銆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鐨勭洿鎺ヨ闂

銆銆2.Windows Socket鏈哄埗鍒嗘瀽

銆銆2.1涓浜涘熀鏈殑Socket绯荤粺璋冪敤

銆銆涓昏鐨勭郴缁熻皟鐢ㄥ寘鎷細socket()-鍒涘缓Socket锛沚ind()-灏嗗垱寤虹殑Socket涓庢湰鍦扮鍙g粦瀹氾紱connect()涓巃ccept()-寤虹珛Socket杩炴帴锛沴isten()-鏈嶅姟鍣ㄧ洃鍚槸鍚︽湁杩炴帴璇锋眰锛泂end()-鏁版嵁鐨勫彲鎺х紦鍐插彂閫侊紱recv()-鍙帶缂撳啿鎺ユ敹锛沜losesocket()-鍏抽棴Socket銆

銆銆2.2Windows Socket鐨勫惎鍔ㄤ笌缁堟

銆銆鍚姩鍑芥暟WSAStartup()寤虹珛涓嶹indows Sockets DLL鐨勮繛鎺ワ紝缁堟鍑芥暟WSAClearup()缁堟浣跨敤璇LL锛岃繖涓や釜鍑芥暟蹇呴』鎴愬浣跨敤銆

銆銆2.3寮傛閫夋嫨鏈哄埗

銆銆Windows鏄竴涓潪鎶㈠崰寮忕殑鎿嶄綔绯荤粺锛岃屼笉閲囧彇UNIX鐨勯樆濉炴満鍒躲傚綋涓涓氫俊浜嬩欢浜х敓鏃讹紝鎿嶄綔绯荤粺瑕佹牴鎹缃夋嫨鏄惁瀵硅浜嬩欢鍔犱互澶勭悊锛學SAAsyncSelect()鍑芥暟灏辨槸鐢ㄦ潵閫夋嫨绯荤粺鎵瑕佸鐞嗙殑鐩稿簲浜嬩欢銆傚綋Socket鏀跺埌璁惧畾鐨勭綉缁滀簨浠朵腑鐨勪竴涓椂锛屼細缁欑▼搴忕獥鍙d竴涓秷鎭紝杩欎釜娑堟伅閲屼細鎸囧畾浜х敓缃戠粶浜嬩欢鐨凷ocket锛屽彂鐢熺殑浜嬩欢绫诲瀷鍜岄敊璇爜銆

銆銆2.4寮傛鏁版嵁浼犺緭鏈哄埗

銆銆WSAAsyncSelect()璁惧畾浜哠ocket涓婄殑椤诲搷搴旈氫俊浜嬩欢鍚庯紝姣忓彂鐢熶竴涓繖鏍风殑浜嬩欢灏变細浜х敓涓涓猈M_SOCKET娑堟伅浼犵粰绐楀彛銆傝屽湪绐楀彛鐨勫洖璋冨嚱鏁颁腑灏卞簲璇ユ坊鍔犵浉搴旂殑鏁版嵁浼犺緭澶勭悊浠g爜銆

銆銆3.鑱婂ぉ瀹ょ▼搴忕殑璁捐璇存槑

銆銆3.1瀹炵幇鎬濇兂

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

銆銆3.2鏈嶅姟鍣ㄧ宸ヤ綔娴佺▼

銆銆鏈嶅姟鍣ㄧ閫氳繃socket()绯荤粺璋冪敤鍒涘缓涓涓猄ocket鏁扮粍鍚(鍗宠瀹氫簡鎺ュ彈杩炴帴瀹㈡埛鐨勬渶澶ф暟鐩)锛屼笌鎸囧畾鐨勬湰鍦扮鍙g粦瀹歜ind()锛屽氨鍙互鍦ㄧ鍙h繘琛屼睛鍚琹isten()銆傚鏋滄湁瀹㈡埛绔繛鎺ヨ姹傦紝鍒欏湪鏁扮粍涓夋嫨涓涓┖Socket锛屽皢瀹㈡埛绔湴鍧璧嬬粰杩欎釜Socket銆傜劧鍚庣櫥褰曟垚鍔熺殑瀹㈡埛灏卞彲浠ュ湪鏈嶅姟鍣ㄤ笂鑱婂ぉ浜嗐

銆銆3.3瀹㈡埛绔伐浣滄祦绋

銆銆瀹㈡埛绔▼搴忕浉瀵圭畝鍗曪紝鍙渶瑕佸缓绔嬩竴涓猄ocket涓庢湇鍔″櫒绔繛鎺ワ紝鎴愬姛鍚庨氳繃杩欎釜Socket鏉ュ彂閫佸拰鎺ユ敹鏁版嵁灏卞彲浠ヤ簡銆

4.鏍稿績浠g爜鍒嗘瀽

銆銆闄愪簬绡囧箙锛岃繖閲屼粎缁欏嚭涓庣綉缁滅紪绋嬬浉鍏崇殑鏍稿績浠g爜锛屽叾浠栫殑璇稿鑱婂ぉ鏂囧瓧鐨勬湇鍔″櫒鍜屽鎴风鏄剧ず璇昏呭彲浠ヨ嚜琛屾坊鍔犮

銆銆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粦瀹

銆銆銆{ReportWinsockErr("鏃犳硶缁戝畾鏈嶅姟鍣╯ocket!");

銆銆銆銆return;}

銆銆銆iErrorCode=WSAAsyncSelect(m_pDoc->m_hServerSocket,m_hWnd,

銆銆銆WM_SERVER_ACCEPT, FD_ACCEPT);

銆銆銆//璁惧畾鏈嶅姟鍣ㄧ浉搴旂殑缃戠粶浜嬩欢涓篎D_ACCEPT锛屽嵆杩炴帴璇锋眰锛

銆銆銆// 浜х敓鐩稿簲浼犻掔粰绐楀彛鐨勬秷鎭负WM_SERVER_ACCEPT

銆銆if (iErrorCode == SOCKET_ERROR)

銆銆銆{ ReportWinsockErr("WSAAsyncSelect璁惧畾澶辫触!");

銆銆銆銆return;}

銆銆if (listen(m_pDoc->m_hServerSocket, QUEUE_SIZE) == SOCKET_ERROR) //寮濮嬬洃鍚鎴疯繛鎺ヨ姹

鎵撳嵃 | 鏀惰棌姝ら〉 |  鎺ㄨ崘缁欏ソ鍙 | 涓炬姤
涓婁竴绡 涓嬩竴绡
 

璇勫垎锛0

鍙戣〃璇勮
鏌ョ湅鍏ㄩ儴鍥炲銆愬凡鏈0浣嶇綉鍙嬪彂琛ㄤ簡鐪嬫硶銆