資源描述:
《vc++網(wǎng)絡(luò)編程之基礎(chǔ)篇》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、一、WindowsSocketsAPI簡介VC++對網(wǎng)絡(luò)編程的支持有socket支持,WinInet支持,MAPI和ISAPI支持等。其中,WindowsSocketsAPI是TCP/IP網(wǎng)絡(luò)環(huán)境里,也是Internet上進行開發(fā)最為通用的API。最早美國加州大學(xué)Berkeley分校在UNIX下為TCP/IP協(xié)議開發(fā)了一個API,這個API就是著名的BerkeleySocket接口(套接字)。在桌面操作系統(tǒng)進入Windows時代后,仍然繼承了Socket方法。在TCP/IP網(wǎng)絡(luò)通信環(huán)境下,Socket數(shù)據(jù)傳輸是一種特殊的I/O
2、,它也相當(dāng)于一種文件描述符,具有一個類似于打開文件的函數(shù)調(diào)用-socket()??梢赃@樣理解:Socket實際上是一個通信端點,通過它,用戶的Socket程序可以通過網(wǎng)絡(luò)和其他的Socket應(yīng)用程序通信。Socket存在于一個“通信域”(為描述一般的線程如何通過Socket進行通信而引入的一種抽象概念)里,并且與另一個域的Socket交換數(shù)據(jù)。Socket有三類。第一種是SOCK_STREAM(流式),提供面向連接的可靠的通信服務(wù),比如telnet,http。第二種是SOCK_DGRAM(數(shù)據(jù)報),提供無連接不可靠的通信,比如
3、UDP。第三種是SOCK_RAW(原始),主要用于協(xié)議的開發(fā)和測試,支持通信底層操作,比如對IP和ICMP的直接訪問。二、WindowsSocket機制分析2.1一些基本的Socket系統(tǒng)調(diào)用???主要的系統(tǒng)調(diào)用包括:socket()-創(chuàng)建Socket;bind()-將創(chuàng)建的Socket與本地端口綁定;connect()與accept()-建立Socket連接;listen()-服務(wù)器監(jiān)聽是否有連接請求;send()-數(shù)據(jù)的可控緩沖發(fā)送;recv()-可控緩沖接收;closesocket()-關(guān)閉Socket。2.2Windo
4、wsSocket的啟動與終止 啟動函數(shù)WSAStartup()建立與WindowsSocketsDLL的連接,終止函數(shù)WSAClearup()終止使用該DLL,這兩個函數(shù)必須成對使用。2.3異步選擇機制 Windows是一個非搶占式的操作系統(tǒng),而不采取UNIX的阻塞機制。當(dāng)一個通信事件產(chǎn)生時,操作系統(tǒng)要根據(jù)設(shè)置選擇是否對該事件加以處理,WSAAsyncSelect()函數(shù)就是用來選擇系統(tǒng)所要處理的相應(yīng)事件。當(dāng)Socket收到設(shè)定的網(wǎng)絡(luò)事件中的一個時,會給程序窗口一個消息,這個消息里會指定產(chǎn)生網(wǎng)絡(luò)事件的Socket,發(fā)生的事
5、件類型和錯誤碼。2.4異步數(shù)據(jù)傳輸機制 WSAAsyncSelect()設(shè)定了Socket上的須響應(yīng)通信事件后,每發(fā)生一個這樣的事件就會產(chǎn)生一個WM_SOCKET消息傳給窗口。而在窗口的回調(diào)函數(shù)中就應(yīng)該添加相應(yīng)的數(shù)據(jù)傳輸處理代碼。三、WinSock基本定義:WinSock是MicrosoftWindowsSocket的簡稱,WinSock為軟件開發(fā)人員提供一套Windows操作系統(tǒng)上的開放的、支持多種協(xié)議的網(wǎng)絡(luò)編程接口,已成為在TCP/IP網(wǎng)絡(luò)編程和Internet應(yīng)用開發(fā)中通用的解決方案。WinSock對一些重要的數(shù)據(jù)類型
6、和結(jié)構(gòu)做了如下定義。1、套接字的定義typedefunsignedintu_int;????typedefu_intSocket;2、基本數(shù)據(jù)類型的定義typedefunsignedcharu_char;typedefunsignedshortu_short;typedefunsignedintu_int;typedefunsignedlongu_long;3、網(wǎng)絡(luò)地址的數(shù)據(jù)結(jié)構(gòu)網(wǎng)絡(luò)地址用無符號長整數(shù)unsignedlong表示。例如IP地址127.0.0.1可以表示為:#defineINADDR_LOOPBACK0x7f00
7、0001用inet_addr()函數(shù)可以將分16位IP地址轉(zhuǎn)換為unsignedlong類型,其定義為:unsignedlonginet_addr(constcharFAR*cp)Cp為點分16位IP地址,如“192.1.8.84”。4、套接字地址結(jié)構(gòu)sockaddr結(jié)構(gòu)——通用Socket地址結(jié)構(gòu),其定義為:structsockaddr{u_shortsa_family;charsa_data[14];};其中sa_family為網(wǎng)絡(luò)地址類型,隨協(xié)議的不同而不同,一般為AF_INET,表示該socket在Internet域中
8、通信。sockaddr_in結(jié)構(gòu)——專門針對Internet域的Socket地址結(jié)構(gòu),其定義為:structsockaddr_in{????shortsin_family;????u_shortsin_port;????structin_addrsin_addr;???cha