Windows網(wǎng)絡(luò)編程基礎(chǔ)_第1頁(yè)
Windows網(wǎng)絡(luò)編程基礎(chǔ)_第2頁(yè)
Windows網(wǎng)絡(luò)編程基礎(chǔ)_第3頁(yè)
Windows網(wǎng)絡(luò)編程基礎(chǔ)_第4頁(yè)
Windows網(wǎng)絡(luò)編程基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Windows編程基礎(chǔ)東軟人才實(shí)訓(xùn)中心Copyright2010ByNeusoftGroup.Allrightsreserved本課程旨在向?qū)W員介紹:1)網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)2)使用Socket編程時(shí)間:學(xué)時(shí)3教學(xué)方法:講授+課上練習(xí)+課下作業(yè)第十章Windows網(wǎng)絡(luò)編程基礎(chǔ)計(jì)算機(jī)網(wǎng)絡(luò)概述計(jì)算機(jī)網(wǎng)絡(luò)模式TCP/IP協(xié)議Socket基礎(chǔ)套接字?jǐn)?shù)據(jù)結(jié)構(gòu)字節(jié)順序網(wǎng)絡(luò)基本知識(shí)計(jì)算機(jī)網(wǎng)絡(luò)概述計(jì)算機(jī)網(wǎng)絡(luò)定義:把分布在不同地點(diǎn)的具有獨(dú)立操作系統(tǒng)的計(jì)算機(jī),利用通信線路物理地互連起來(lái),按照網(wǎng)絡(luò)協(xié)議相互通信,以共享軟件、硬件和數(shù)據(jù)資源。其他外設(shè)打印機(jī)對(duì)等網(wǎng)絡(luò)模式在對(duì)等網(wǎng)絡(luò)模式中,相連的機(jī)器之間彼此處于同等地位,沒(méi)有主從之分故又稱為對(duì)等網(wǎng)絡(luò)(PeertoPeernetwork)。它們能夠相互共享資源,每臺(tái)計(jì)算機(jī)都能以同樣方式作用于對(duì)方??蛻魴C(jī)/服務(wù)器網(wǎng)絡(luò)模式客戶機(jī)/服務(wù)器網(wǎng)絡(luò)是一種基于服務(wù)器的網(wǎng)絡(luò),與對(duì)等網(wǎng)絡(luò)相比,基于服務(wù)器的網(wǎng)絡(luò)提供了更好的運(yùn)行性能并且可靠性也有所提高。共享數(shù)據(jù)全部都集中存放在服務(wù)器上??蛻魴C(jī)/服務(wù)器的一個(gè)典型應(yīng)用就是數(shù)據(jù)庫(kù)的應(yīng)用計(jì)算機(jī)網(wǎng)絡(luò)模式為了實(shí)現(xiàn)通信,需要分別編寫(xiě)客戶端和服務(wù)器端的程序首先服務(wù)器啟動(dòng)服務(wù)程序,等待客戶的服務(wù)請(qǐng)求。用戶觸發(fā),客戶端運(yùn)行客戶程序客戶進(jìn)程與服務(wù)器進(jìn)程通信,傳送數(shù)據(jù)(請(qǐng)求-應(yīng)答)客戶機(jī)/服務(wù)器網(wǎng)絡(luò)模式客戶機(jī)客戶機(jī)服務(wù)器請(qǐng)求應(yīng)答請(qǐng)求應(yīng)答TCP/IP協(xié)議Windows的網(wǎng)絡(luò)通信是建立在TCP/IP協(xié)議的基礎(chǔ)上TCP/IP協(xié)議族包括一系列構(gòu)成互聯(lián)網(wǎng)基礎(chǔ)結(jié)構(gòu)的網(wǎng)絡(luò)協(xié)議TCP/IP字面上代表兩個(gè)重要的協(xié)議TCP:傳輸控制協(xié)議IP:網(wǎng)際協(xié)議TCP/IP模型與OSI模型應(yīng)用層表示層傳輸層網(wǎng)絡(luò)層數(shù)據(jù)鏈路層物理層會(huì)話層應(yīng)用層傳輸層互聯(lián)層網(wǎng)絡(luò)接口層OSITCP/IP數(shù)據(jù)包的封裝-TCP/IP模型應(yīng)用層傳輸層互聯(lián)層主機(jī)至網(wǎng)絡(luò)層應(yīng)用程序HTTP協(xié)議TCP協(xié)議IP協(xié)議網(wǎng)卡驅(qū)動(dòng)以太網(wǎng)首部IP首部TCP首部HTTP首部用戶數(shù)據(jù)以太網(wǎng)尾部IP首部TCP首部HTTP首部用戶數(shù)據(jù)TCP首部HTTP首部用戶數(shù)據(jù)HTTP首部用戶數(shù)據(jù)用戶數(shù)據(jù)使用協(xié)議封裝的數(shù)據(jù)包套接字概念及位置套接字是一種網(wǎng)絡(luò)編程接口,它可以理解為計(jì)算機(jī)與網(wǎng)絡(luò)應(yīng)用程序之間的接口,Windows的網(wǎng)絡(luò)通信是建立在TCP/IP協(xié)議的基礎(chǔ)上主機(jī)至網(wǎng)絡(luò)層以太網(wǎng)令牌環(huán)幀中繼ATM...互聯(lián)層IPARPICMPIGMP傳輸層TCPUDP應(yīng)用層套接字Sockets套接字是網(wǎng)絡(luò)通信的端點(diǎn)在網(wǎng)絡(luò)中,主機(jī)H1上的一個(gè)套接字端點(diǎn)(endpoint)可以和主機(jī)H2上的另一個(gè)套接字端點(diǎn)進(jìn)行通信IP地址和端口號(hào)可以唯一確定一個(gè)套接字IP地址和端口IP地址:IP網(wǎng)絡(luò)中每臺(tái)主機(jī)都必須與一個(gè)惟一的IP地址IP地址是一個(gè)邏輯地址端口:端口號(hào)用以區(qū)別不同的應(yīng)用,RFC1700規(guī)定了由IANA(因特網(wǎng)已分配數(shù)值權(quán)威機(jī)構(gòu))定義的端口列表,端口號(hào)分三段:周知端口:0~1023,由IANA分配和控制,對(duì)普通用戶不可用經(jīng)注冊(cè)的端口:1024~49151,不受IANA控制,但由IANA登記并提供它們的使用情況清單動(dòng)態(tài)或私用端口:49152~65535,IANA不管的端口,也稱臨時(shí)端口.理論上來(lái)說(shuō),我們編程能使用的端口值為1024~65535,周知端口的使用需要超級(jí)用戶(root)權(quán)限Socket分類(lèi)流式套接口(SOCK_STREAM)提供面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無(wú)差錯(cuò)、無(wú)重復(fù)的發(fā)送,且按發(fā)送順序接收。流式套接字是基于TCP協(xié)議實(shí)現(xiàn)的.數(shù)據(jù)報(bào)式套接字(SOCK_DGRAM)提供無(wú)連接服務(wù)。數(shù)據(jù)包以獨(dú)立包形式發(fā)送,不提供無(wú)差錯(cuò)保證,數(shù)據(jù)可能丟失或重復(fù)原始套接字(SOCK_RAW)本課程旨在向?qū)W員介紹:1)網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)2)使用Socket編程時(shí)間:學(xué)時(shí)3教學(xué)方法:講授+課上練習(xí)+課下作業(yè)第十章Windows網(wǎng)絡(luò)編程基礎(chǔ)客戶機(jī)/服務(wù)器模式在操作過(guò)程中采取的是主動(dòng)請(qǐng)求的方式。首先服務(wù)器方要先啟動(dòng),并根據(jù)請(qǐng)求提供相應(yīng)的服務(wù)回顧C(jī)/S模式客戶機(jī)客戶機(jī)服務(wù)器請(qǐng)求應(yīng)答請(qǐng)求應(yīng)答客戶/服務(wù)器通信過(guò)程及函數(shù)(TCP)服務(wù)器socket()bind()listen()accept()recv()send()close()socket()connect()send()recv()close()阻塞,等待客戶數(shù)據(jù)處理服務(wù)請(qǐng)求建立連接請(qǐng)求數(shù)據(jù)應(yīng)答數(shù)據(jù)客戶端WSAStartup()WSACleanup()WSAStartup()WSACleanup()SOCK_STREAMSOCK_STREAMWSAStartup函數(shù)利用套接字編程時(shí),首先需加載套接字庫(kù),通過(guò)WSAStartup函數(shù)實(shí)現(xiàn),該函數(shù)有兩個(gè)功能功能1:加載套接字庫(kù)功能2:進(jìn)行套接字庫(kù)的版本IntWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData);wVersionRequested:用來(lái)指定準(zhǔn)備加載Winsock庫(kù)的版本.高位字節(jié)指定所需要的WinSock庫(kù)的副版本,低位字節(jié)則是主版本。lpWSAData:這是一個(gè)返回值,指向WSADATA結(jié)構(gòu)的指針。WSADATA結(jié)構(gòu)定義typedefstructWSAData{WORDwVersion;//winsock版本W(wǎng)ORDwHighVersion;//高位版本charszDescription[WSADESCRIPTION_LEN+1];//未使用charszSystemStatus[WSASYS_STATUS_LEN+1];//未使用unsignedshortiMaxSockets;//最多可打開(kāi)socket包數(shù)unsignedshortiMaxUdpDg;//數(shù)據(jù)報(bào)最大長(zhǎng)度charFAR*lpVendorInfo;//廠商信息}WSADATA,*LPWSADATA;socket函數(shù)SOCKETsocket(intaf,inttype,intprotocol);af:使用TCP/IP協(xié)議,該參數(shù)使用AF_INETtype:SOCK_STREAM:指定產(chǎn)生流式套接字SOCK_DGRAM:指定產(chǎn)生數(shù)據(jù)報(bào)套接字SOCK_RAM:原始套接口Ipv4protocol:協(xié)議選擇,如果該參數(shù)為0,則系統(tǒng)會(huì)根據(jù)地址格式和套接字類(lèi)別自動(dòng)選擇一個(gè)合適的協(xié)議如果成功,返回一個(gè)SOCKET類(lèi)型的套接字描述符,如果失敗,返回INVALID_SOCKET實(shí)例代碼#include"winsock2.h"voidmain(){WSADATAwsaData;WSAStartup(MAKEWORD(1,1),&wsaData);SOCKETsock=socket(AF_INET,SOCK_STREAM,0);...}bind函數(shù)創(chuàng)建了套接字之后,需要將該套接字綁定到本地的某個(gè)地址和端口上,這需要通過(guò)bind函數(shù)實(shí)現(xiàn)intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);這個(gè)函數(shù)接收三個(gè)參數(shù):第一個(gè)參數(shù)(s)指定要綁定的套接字第二個(gè)參數(shù)name指定該套接字的本地地址信息。第三個(gè)參數(shù)指定該地址結(jié)構(gòu)的長(zhǎng)度套接字的數(shù)據(jù)結(jié)構(gòu)-1通用的套接口地址結(jié)構(gòu)structsockaddr{unsignedshortsa_family;/*地址家族,AF_xxx*/

charsa_data[14];/*14字節(jié)協(xié)議地址*/};sa_family:套接字的協(xié)議族地址類(lèi)型,例如對(duì)于通常的TCP/IP協(xié)議(IPv4),它的值是AF_INET;sa_data中存儲(chǔ)著具體的協(xié)議地址,不同的協(xié)議族有不同的地址格式,sockaddr是一個(gè)通用型的結(jié)構(gòu)。sa_data的存儲(chǔ)內(nèi)容往往是包含地址和端口信息,而僅使用一個(gè)變量,所以使用起來(lái)不太方便。sa_familysa_data214套接字的數(shù)據(jù)結(jié)構(gòu)-2使用TCP/IP協(xié)議時(shí),sockaddr結(jié)構(gòu)的并列形式structsockaddr_in{shortintsin_family;/*通信類(lèi)型*/unsignedshortintsin_port;/*端口,2bytes*/structin_addrsin_addr;/*Internet地址,4bytes*/unsignedcharsin_zero[8];/*填充的空白信息,這樣就保持整個(gè)結(jié)構(gòu)與sockaddr結(jié)構(gòu)的長(zhǎng)度相同*/};其中,in_addr結(jié)構(gòu)定義如下:struct

in_addr

{unsignedlong

s_addr

;}/*s_addr必須是網(wǎng)絡(luò)字節(jié)順序

Network

Byte

Order*/sin_familysin_portsin_addrsin_zero2482兩種結(jié)構(gòu)的關(guān)系sockaddr只是一個(gè)抽象的概況形式,并不實(shí)用sockaddr_in更加結(jié)合了TCP/IP協(xié)議族的特點(diǎn),易于使用,所以編程中常使用這個(gè)結(jié)構(gòu)。但是:socket本身所封裝的API都是支持sockaddr結(jié)構(gòu)的,所以填充sockaddr_in結(jié)構(gòu)需要強(qiáng)制轉(zhuǎn)換成sockaddr結(jié)構(gòu),方可作為參數(shù)被socket的標(biāo)準(zhǔn)函數(shù)所使用。字節(jié)順序主機(jī)字節(jié)順序(HostByteOrder)低位在前,高位在后(little-endian)基于Intel芯片的機(jī)器采取這種存儲(chǔ)方式網(wǎng)絡(luò)字節(jié)順序(NetworkByteOrder)高位在前,低位在后(big-endian)sockaddr_in的變量成員(端口和地址)都必須使用網(wǎng)絡(luò)字節(jié)順序66A1A166主機(jī)字節(jié)順序網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換字節(jié)順序的函數(shù)u_shorthtons(u_shorthostshort);u_shortntohs(u_shortnetshort);u_longhtonl(u_longhostlong);u_longntohl(u_longnetlong);h:hostbyteordern:networkbytorder前兩個(gè)常用來(lái)轉(zhuǎn)換端口的表示方式請(qǐng)注意:盡量使用這些函數(shù)轉(zhuǎn)換,而不要自己根據(jù)機(jī)器而手工轉(zhuǎn)換,因?yàn)槟菢訒?huì)使得程序沒(méi)有移植性!將IP地址轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序unsignedlonginet_addr(constcharFAR*cp);轉(zhuǎn)換IP地址到IN_ADDR結(jié)構(gòu)地址,例如將“0”0A00A8C0charFAR*inet_ntoa(structin_addrin);轉(zhuǎn)換IN_ADDR結(jié)構(gòu)地址到IP地址,例如將0A00A8C0轉(zhuǎn)化為“0”實(shí)例代碼#include"winsock2.h"voidmain(){//加載套接字//創(chuàng)建socket

SOCKADDR_INaddrSrc;addrSrc.sin_family=AF_INET;addrSrc.sin_port=htons(3000);addrSrc.sin_addr.S_un.S_addr=htonl(INADDR_ANY);bind(sock,(SOCKADDR*)&addrSrc,sizeof(SOCKADDR));}listen函數(shù)intlisten(SOCKETs,intbacklog);第一個(gè)參數(shù)為套接字描述符第二個(gè)參數(shù)為等待隊(duì)列的最大長(zhǎng)度實(shí)例代碼:listen(sock,5);accept函數(shù)SOCKETaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);第一個(gè)參數(shù)s為套接字描述符,該套接字已經(jīng)通過(guò)listen函數(shù)將其設(shè)置為監(jiān)聽(tīng)狀態(tài)第二個(gè)參數(shù)addr為是一個(gè)指向緩沖區(qū)的指針,該緩沖區(qū)用來(lái)接收連接實(shí)體的地址。第三個(gè)參數(shù)addrlen是一個(gè)返回值,指向一個(gè)整形指針,返回包含地址信息的長(zhǎng)度實(shí)例代碼//socket,bind,listen相關(guān)處理

intlen=sizeof(SOCKADDR_IN);SOCKADDR_INaddrClient;SOCKETsockClient;SOCKETnumSock;intindex=0;charbuf[120];

sockClient=accept(sock,(SOCKADDR*)&addrClient,&len);if(INVALID_SOCKET!=sockClient){

numSock=sockClient;}send/recv函數(shù)intsend(SOCKETs,constcharFAR*buff,intlen,intflags);第一個(gè)參數(shù)s為已建立連接的套接字第二個(gè)參數(shù)buff指向一個(gè)緩沖區(qū)。第三個(gè)參數(shù)len是緩沖區(qū)的長(zhǎng)度第四個(gè)參數(shù)設(shè)定的值將影響函數(shù)的行為,通常設(shè)置為0intrecv(SOCKETs,charFAR*buf,intlen,intflags);第一個(gè)參數(shù)是建立連接之后準(zhǔn)備接收數(shù)據(jù)的套接字第二個(gè)參數(shù)指向一個(gè)緩沖區(qū)的指針,用于保存接收的數(shù)據(jù)第三個(gè)參數(shù)為緩沖區(qū)的長(zhǎng)度第四個(gè)參數(shù)為與send類(lèi)似實(shí)例代碼//…

sockClient=accept(sock,(SOCKADDR*)&addrClient,&len);

numSock=sockClient;

strcpy(buf,"hellotheworld");send(numSock,buf,strlen(buf)+1,0);close函數(shù)intclosesocket(SOCKET);關(guān)閉socket客戶端相關(guān)函數(shù)-connectintconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);第一個(gè)參數(shù)s是即將在其上建立連接的套接字第二個(gè)參數(shù)name設(shè)定連接服務(wù)器端的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論