版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
Windows編程基礎東軟人才實訓中心Copyright2010ByNeusoftGroup.Allrightsreserved本課程旨在向學員介紹:1)網(wǎng)絡編程基礎知識2)使用Socket編程時間:學時3教學方法:講授+課上練習+課下作業(yè)第十章Windows網(wǎng)絡編程基礎計算機網(wǎng)絡概述計算機網(wǎng)絡模式TCP/IP協(xié)議Socket基礎套接字數(shù)據(jù)結構字節(jié)順序網(wǎng)絡基本知識計算機網(wǎng)絡概述計算機網(wǎng)絡定義:把分布在不同地點的具有獨立操作系統(tǒng)的計算機,利用通信線路物理地互連起來,按照網(wǎng)絡協(xié)議相互通信,以共享軟件、硬件和數(shù)據(jù)資源。其他外設打印機對等網(wǎng)絡模式在對等網(wǎng)絡模式中,相連的機器之間彼此處于同等地位,沒有主從之分故又稱為對等網(wǎng)絡(PeertoPeernetwork)。它們能夠相互共享資源,每臺計算機都能以同樣方式作用于對方。客戶機/服務器網(wǎng)絡模式客戶機/服務器網(wǎng)絡是一種基于服務器的網(wǎng)絡,與對等網(wǎng)絡相比,基于服務器的網(wǎng)絡提供了更好的運行性能并且可靠性也有所提高。共享數(shù)據(jù)全部都集中存放在服務器上??蛻魴C/服務器的一個典型應用就是數(shù)據(jù)庫的應用計算機網(wǎng)絡模式為了實現(xiàn)通信,需要分別編寫客戶端和服務器端的程序首先服務器啟動服務程序,等待客戶的服務請求。用戶觸發(fā),客戶端運行客戶程序客戶進程與服務器進程通信,傳送數(shù)據(jù)(請求-應答)客戶機/服務器網(wǎng)絡模式客戶機客戶機服務器請求應答請求應答TCP/IP協(xié)議Windows的網(wǎng)絡通信是建立在TCP/IP協(xié)議的基礎上TCP/IP協(xié)議族包括一系列構成互聯(lián)網(wǎng)基礎結構的網(wǎng)絡協(xié)議TCP/IP字面上代表兩個重要的協(xié)議TCP:傳輸控制協(xié)議IP:網(wǎng)際協(xié)議TCP/IP模型與OSI模型應用層表示層傳輸層網(wǎng)絡層數(shù)據(jù)鏈路層物理層會話層應用層傳輸層互聯(lián)層網(wǎng)絡接口層OSITCP/IP數(shù)據(jù)包的封裝-TCP/IP模型應用層傳輸層互聯(lián)層主機至網(wǎng)絡層應用程序HTTP協(xié)議TCP協(xié)議IP協(xié)議網(wǎ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)絡編程接口,它可以理解為計算機與網(wǎng)絡應用程序之間的接口,Windows的網(wǎng)絡通信是建立在TCP/IP協(xié)議的基礎上主機至網(wǎng)絡層以太網(wǎng)令牌環(huán)幀中繼ATM...互聯(lián)層IPARPICMPIGMP傳輸層TCPUDP應用層套接字Sockets套接字是網(wǎng)絡通信的端點在網(wǎng)絡中,主機H1上的一個套接字端點(endpoint)可以和主機H2上的另一個套接字端點進行通信IP地址和端口號可以唯一確定一個套接字IP地址和端口IP地址:IP網(wǎng)絡中每臺主機都必須與一個惟一的IP地址IP地址是一個邏輯地址端口:端口號用以區(qū)別不同的應用,RFC1700規(guī)定了由IANA(因特網(wǎng)已分配數(shù)值權威機構)定義的端口列表,端口號分三段:周知端口:0~1023,由IANA分配和控制,對普通用戶不可用經(jīng)注冊的端口:1024~49151,不受IANA控制,但由IANA登記并提供它們的使用情況清單動態(tài)或私用端口:49152~65535,IANA不管的端口,也稱臨時端口.理論上來說,我們編程能使用的端口值為1024~65535,周知端口的使用需要超級用戶(root)權限Socket分類流式套接口(SOCK_STREAM)提供面向連接、可靠的數(shù)據(jù)傳輸服務,數(shù)據(jù)無差錯、無重復的發(fā)送,且按發(fā)送順序接收。流式套接字是基于TCP協(xié)議實現(xiàn)的.數(shù)據(jù)報式套接字(SOCK_DGRAM)提供無連接服務。數(shù)據(jù)包以獨立包形式發(fā)送,不提供無差錯保證,數(shù)據(jù)可能丟失或重復原始套接字(SOCK_RAW)本課程旨在向學員介紹:1)網(wǎng)絡編程基礎知識2)使用Socket編程時間:學時3教學方法:講授+課上練習+課下作業(yè)第十章Windows網(wǎng)絡編程基礎客戶機/服務器模式在操作過程中采取的是主動請求的方式。首先服務器方要先啟動,并根據(jù)請求提供相應的服務回顧C/S模式客戶機客戶機服務器請求應答請求應答客戶/服務器通信過程及函數(shù)(TCP)服務器socket()bind()listen()accept()recv()send()close()socket()connect()send()recv()close()阻塞,等待客戶數(shù)據(jù)處理服務請求建立連接請求數(shù)據(jù)應答數(shù)據(jù)客戶端WSAStartup()WSACleanup()WSAStartup()WSACleanup()SOCK_STREAMSOCK_STREAMWSAStartup函數(shù)利用套接字編程時,首先需加載套接字庫,通過WSAStartup函數(shù)實現(xiàn),該函數(shù)有兩個功能功能1:加載套接字庫功能2:進行套接字庫的版本IntWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData);wVersionRequested:用來指定準備加載Winsock庫的版本.高位字節(jié)指定所需要的WinSock庫的副版本,低位字節(jié)則是主版本。lpWSAData:這是一個返回值,指向WSADATA結構的指針。WSADATA結構定義typedefstructWSAData{WORDwVersion;//winsock版本W(wǎng)ORDwHighVersion;//高位版本charszDescription[WSADESCRIPTION_LEN+1];//未使用charszSystemStatus[WSASYS_STATUS_LEN+1];//未使用unsignedshortiMaxSockets;//最多可打開socket包數(shù)unsignedshortiMaxUdpDg;//數(shù)據(jù)報最大長度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ù)報套接字SOCK_RAM:原始套接口Ipv4protocol:協(xié)議選擇,如果該參數(shù)為0,則系統(tǒng)會根據(jù)地址格式和套接字類別自動選擇一個合適的協(xié)議如果成功,返回一個SOCKET類型的套接字描述符,如果失敗,返回INVALID_SOCKET實例代碼#include"winsock2.h"voidmain(){WSADATAwsaData;WSAStartup(MAKEWORD(1,1),&wsaData);SOCKETsock=socket(AF_INET,SOCK_STREAM,0);...}bind函數(shù)創(chuàng)建了套接字之后,需要將該套接字綁定到本地的某個地址和端口上,這需要通過bind函數(shù)實現(xiàn)intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);這個函數(shù)接收三個參數(shù):第一個參數(shù)(s)指定要綁定的套接字第二個參數(shù)name指定該套接字的本地地址信息。第三個參數(shù)指定該地址結構的長度套接字的數(shù)據(jù)結構-1通用的套接口地址結構structsockaddr{unsignedshortsa_family;/*地址家族,AF_xxx*/
charsa_data[14];/*14字節(jié)協(xié)議地址*/};sa_family:套接字的協(xié)議族地址類型,例如對于通常的TCP/IP協(xié)議(IPv4),它的值是AF_INET;sa_data中存儲著具體的協(xié)議地址,不同的協(xié)議族有不同的地址格式,sockaddr是一個通用型的結構。sa_data的存儲內(nèi)容往往是包含地址和端口信息,而僅使用一個變量,所以使用起來不太方便。sa_familysa_data214套接字的數(shù)據(jù)結構-2使用TCP/IP協(xié)議時,sockaddr結構的并列形式structsockaddr_in{shortintsin_family;/*通信類型*/unsignedshortintsin_port;/*端口,2bytes*/structin_addrsin_addr;/*Internet地址,4bytes*/unsignedcharsin_zero[8];/*填充的空白信息,這樣就保持整個結構與sockaddr結構的長度相同*/};其中,in_addr結構定義如下:struct
in_addr
{unsignedlong
s_addr
;}/*s_addr必須是網(wǎng)絡字節(jié)順序
Network
Byte
Order*/sin_familysin_portsin_addrsin_zero2482兩種結構的關系sockaddr只是一個抽象的概況形式,并不實用sockaddr_in更加結合了TCP/IP協(xié)議族的特點,易于使用,所以編程中常使用這個結構。但是:socket本身所封裝的API都是支持sockaddr結構的,所以填充sockaddr_in結構需要強制轉換成sockaddr結構,方可作為參數(shù)被socket的標準函數(shù)所使用。字節(jié)順序主機字節(jié)順序(HostByteOrder)低位在前,高位在后(little-endian)基于Intel芯片的機器采取這種存儲方式網(wǎng)絡字節(jié)順序(NetworkByteOrder)高位在前,低位在后(big-endian)sockaddr_in的變量成員(端口和地址)都必須使用網(wǎng)絡字節(jié)順序66A1A166主機字節(jié)順序網(wǎng)絡字節(jié)順序轉換字節(jié)順序的函數(shù)u_shorthtons(u_shorthostshort);u_shortntohs(u_shortnetshort);u_longhtonl(u_longhostlong);u_longntohl(u_longnetlong);h:hostbyteordern:networkbytorder前兩個常用來轉換端口的表示方式請注意:盡量使用這些函數(shù)轉換,而不要自己根據(jù)機器而手工轉換,因為那樣會使得程序沒有移植性!將IP地址轉換為網(wǎng)絡字節(jié)順序unsignedlonginet_addr(constcharFAR*cp);轉換IP地址到IN_ADDR結構地址,例如將“0”0A00A8C0charFAR*inet_ntoa(structin_addrin);轉換IN_ADDR結構地址到IP地址,例如將0A00A8C0轉化為“0”實例代碼#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);第一個參數(shù)為套接字描述符第二個參數(shù)為等待隊列的最大長度實例代碼:listen(sock,5);accept函數(shù)SOCKETaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);第一個參數(shù)s為套接字描述符,該套接字已經(jīng)通過listen函數(shù)將其設置為監(jiān)聽狀態(tài)第二個參數(shù)addr為是一個指向緩沖區(qū)的指針,該緩沖區(qū)用來接收連接實體的地址。第三個參數(shù)addrlen是一個返回值,指向一個整形指針,返回包含地址信息的長度實例代碼//socket,bind,listen相關處理
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);第一個參數(shù)s為已建立連接的套接字第二個參數(shù)buff指向一個緩沖區(qū)。第三個參數(shù)len是緩沖區(qū)的長度第四個參數(shù)設定的值將影響函數(shù)的行為,通常設置為0intrecv(SOCKETs,charFAR*buf,intlen,intflags);第一個參數(shù)是建立連接之后準備接收數(shù)據(jù)的套接字第二個參數(shù)指向一個緩沖區(qū)的指針,用于保存接收的數(shù)據(jù)第三個參數(shù)為緩沖區(qū)的長度第四個參數(shù)為與send類似實例代碼//…
sockClient=accept(sock,(SOCKADDR*)&addrClient,&len);
numSock=sockClient;
strcpy(buf,"hellotheworld");send(numSock,buf,strlen(buf)+1,0);close函數(shù)intclosesocket(SOCKET);關閉socket客戶端相關函數(shù)-connectintconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);第一個參數(shù)s是即將在其上建立連接的套接字第二個參數(shù)name設定連接服務器端的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小鳥與大樹課程設計
- 怎么做化工課程設計
- 幼兒園課程設計與建構
- 幼兒園制作面包課程設計
- 張緊輪支架課程設計全套
- 小班英語情景課程設計
- eda多路彩燈課程設計
- 招教課程設計過程視頻
- 小班秋天特色課程設計
- 托班自然植物課程設計
- 醫(yī)務人員醫(yī)德醫(yī)風誠信 檔 案(模板)
- 膿毒癥休克中西醫(yī)詳解
- 小兔子乖乖ppt課件.ppt
- 常壓矩形容器設計計算軟件
- 交流變換為直流的穩(wěn)定電源設計方案
- PR6C系列數(shù)控液壓板料折彎機 使用說明書
- 鋼結構工程環(huán)境保護和文明施工措施
- 物業(yè)管理業(yè)主意見征詢表
- 中藥分類大全
- 管道定額價目表
- 民國文獻《潮州茶經(jīng)》
評論
0/150
提交評論