鐢╒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) //寮濮嬬洃鍚鎴疯繛鎺ヨ姹




发表于 2009-1-5 19:48
| 











