winsock編程-jiang_第1頁
winsock編程-jiang_第2頁
winsock編程-jiang_第3頁
winsock編程-jiang_第4頁
winsock編程-jiang_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機網(wǎng)絡(luò)通信計算機網(wǎng)絡(luò)通信主講人:姜有亮指導(dǎo)老師:姚仲敏Winsock編程n網(wǎng)絡(luò)應(yīng)用程序設(shè)計基礎(chǔ)nWinsock編程接口nWinsock編程詳解網(wǎng)絡(luò)應(yīng)用程序設(shè)計基礎(chǔ)n網(wǎng)絡(luò)程序體系結(jié)構(gòu)vC/S(web)lC端之間一般不直接交流信息,僅與S端通信lS端有一固定的公開的IP地址vP2P(BT)l任意兩臺主機可以直接相互通信l伸縮性好但高度分散難管理v混合(eMule、QQ)l一個或數(shù)個服務(wù)器來維護(hù)總體狀況網(wǎng)絡(luò)應(yīng)用程序設(shè)計基礎(chǔ)n網(wǎng)絡(luò)程序通信實體 進(jìn)程是通信的實體,它們在不同終端系統(tǒng)上通過網(wǎng)絡(luò)來交流信息。發(fā)送進(jìn)程創(chuàng)建消息,將之發(fā)送到網(wǎng)絡(luò),接收進(jìn)程接收信息發(fā)送響應(yīng)v客戶/服務(wù)器進(jìn)程l發(fā)起通信為客戶;等待

2、通信連接為服務(wù)器v套接字(socket)l程序與網(wǎng)絡(luò)之間的API網(wǎng)絡(luò)應(yīng)用程序設(shè)計基礎(chǔ)n開發(fā)環(huán)境在windows平臺上,開發(fā)網(wǎng)絡(luò)程序需要:vWinsock2.hvWs2_32.libvWs2_32.dllWinsock概述nWinsock是網(wǎng)絡(luò)開發(fā)接口而不是協(xié)議 Winsock是一套開放的、支持多種協(xié)議的windows下網(wǎng)絡(luò)編程接口,應(yīng)用程序通過調(diào)用winsock的API實現(xiàn)相互間的通信,而winsock利用下層的網(wǎng)絡(luò)通信協(xié)議功能和操作系統(tǒng)調(diào)用實現(xiàn)實際通信工作。 Windows平臺有兩個版本winsock:1.1和2.0,目前大量使用的是2.0版Winsock概述nWinsock支持的協(xié)議vIP

3、 S=socket(AF_INET,SOCK_STREAM/SOCK_DGRAM,0)v紅外線 S=socket(AF_IRDA,SOCK_STREAM,0)vNetBIOS S=socket(AF_NETBIOS, SOCK_DGRAM,0)Winsock概述vATMvIPX/SPXv藍(lán)牙vAppletalknWinsock是一種規(guī)范,建立winsock2規(guī)范的主要目的是提供一個與協(xié)議無關(guān)的傳送接口,這個接口是建立在套接字基礎(chǔ)上的Winsock概述套接字套接字實際上是一個指向傳輸提供者的句柄,在win32中,套接字是一個獨立數(shù)據(jù)類型:socketn Socket類型v流式套接字l面向連接、有

4、序、可靠的數(shù)據(jù)流服務(wù)v數(shù)據(jù)報套接字l無連接、雙向的但不保證可靠性和有序性v原始套接字l允許訪問底層傳輸協(xié)議的一種套接字類型Winsock基本概念nWinsock尋址n特殊地址n字節(jié)順序n套接字模式n套接字I/O模式n帶外數(shù)據(jù)Winsock基本概念n Winsock尋址尋址尋址:通過某種方式找到參與通訊的終端通過某種方式找到參與通訊的終端 因為winsock要兼容多個協(xié)議,所以必須采用通用的尋址方式。TCP/IP使用IP地址和端口號來制定一個地址,但其他協(xié)議也許采用不同的形式,如果winsock強迫使用特定的尋址方式,添加其他協(xié)議就不太可能了。Winsock的第一個版本使用sockaddrnSt

5、ruct sockaddru_short sa_family;Char sa_data14n為便于操作,微軟又增加了sockaddr的TCP/IP版本:sockaddr_inn Sockaddr_in struct sockaddr_in short sin_family; /地址家族,應(yīng)為AF_INET unsigned short sin_port; / 16位端口號,網(wǎng)絡(luò)字節(jié)順序struct in_addr sin_addr; /32位IP地址網(wǎng)絡(luò)字節(jié)順序 char sin_zero8; /保留,應(yīng)設(shè)為0; 其中其中in_addr也是一個結(jié)構(gòu)體,用來存儲也是一個結(jié)構(gòu)體,用來存儲IP地址地

6、址說明:通信端口號分為下面這三類:說明:通信端口號分為下面這三類: “已知已知”端口、端口、 已注冊端口、動態(tài)和私用端口。已注冊端口、動態(tài)和私用端口。l 0 1023是為固定服務(wù)保留的。l 1024 49151已注冊的端口,供普通用戶的普通用戶進(jìn)程或程序使用。l 49152 65535是動態(tài)和(或)私用端口。共用體表示幾個變量共用一個內(nèi)存位置,在不同的時間保存不同的數(shù)據(jù)類型和不同長度的變量。在union中,所有的共用體成員共用一個空間,并且同一時間只能儲存其中一個成員變量的值。 n in_addrstruct in_addr union/*以4個u_char 來描述*/ struct u_ch

7、ar s_b1, s_b2,s_b3,s_b4; S_un_b;/*以2個u_short 來描述*/ struct u_short s_w1, s_w2; S_un_w; u_long S_addr; /以1個u_long來描述S_un;n 特殊地址vINADDR_ANY 允許服務(wù)器應(yīng)用監(jiān)聽主機計算機上的每個地址的客戶機的活動;一般在該地址綁定套接字和本地接口來監(jiān)聽連接。如果你有一個多址系統(tǒng),這個地址就允許一個獨立應(yīng)用接收發(fā)自多個接口的回應(yīng)vINADDR_BROADCAST 用于在一個IP網(wǎng)絡(luò)中發(fā)送廣播UDP數(shù)據(jù)報,要使用這個特殊地址,需要應(yīng)用設(shè)置套接字選項SO_BROADCASTn 字節(jié)順序

8、不同計算機有時使用不同的字節(jié)順序存儲數(shù)據(jù):Little-Endian(Intel)和Big-Endian(網(wǎng)絡(luò)字節(jié)順序)任何從winsock函數(shù)對IP地址和端口號的引用和傳送給winsock函數(shù)的IP地址和端口號均是按照網(wǎng)絡(luò)順便組織的。包括sockaddr_in這一數(shù)據(jù)結(jié)構(gòu)中的IP地址域和端口域注:注:主機字節(jié)順序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序函數(shù)主機字節(jié)順序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序函數(shù):u_long htonl(u_long hostlong)u_short htons(u_short hostshort)網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換成主機字節(jié)順序函數(shù):網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)換成主機字節(jié)順序函數(shù):u_long ntohl(u_l

9、ong netlong)u_short ntohs(u_short netshort)附:sockaddr_in的初始化sockaddr_in sockAddr;/設(shè)置地址家族sockAddr.sin_family=AF_INET;/轉(zhuǎn)換端口號6789到網(wǎng)絡(luò)字節(jié)順序sockAddr.sin_port=htons(6789);/將IP地址轉(zhuǎn)換成以網(wǎng)絡(luò)字節(jié)順序表示的地址sockAddr.sin_addr.S_un.S_addr =inet_addr(127.0.0.1);n套接字模式套接字模式 套接字模式用于決定在一個套接字調(diào)用時,那些 winsock函數(shù)的行為v阻塞模式阻塞模式v非阻塞模式非阻塞

10、模式n 套接字I/O模型 套接字模型描述了一個應(yīng)用程序如何對套接字上進(jìn)行的 I / O進(jìn)行管理及處理以及管理多個套接字,一般采用異步方式來管理多個套接字的I/O.一般包括:se lect(選擇) 、WSAAsyncSelect(異步選擇) 、WSA EventSelect(事件選擇),overlapped(重疊)以及completion port(完成端口) 注:套接字I/O模型與套接字模式是無關(guān)的。套接字模型的出現(xiàn),正是為了解決套接字模式存在的某些限制。n帶外數(shù)據(jù) 也稱為TCP緊急數(shù)據(jù),它是相連的每一對流式套接字間一個邏輯上獨立的傳輸通道,獨立于普通數(shù)據(jù)傳輸給用戶Winsock編程詳解以面向

11、連接的TCP協(xié)議為例講解winsock編程過程n C/S模式 在TCP/IP網(wǎng)絡(luò)中兩個進(jìn)程間的相互作用的主機模式是客戶機/服務(wù)器模式(Client/Server model)。該模式的建立基于以下兩點: 1、非對等作用,C/S模式在操作過程中采取的是主動請示方式 2、通信完全是同步的C/S模式工作時服務(wù)器端先啟動,過程如下: 1、打開一通信通道并告知本地主機,它愿意在某一個公認(rèn)地址上接收客戶請求。2、等待客戶請求到達(dá)該端口。3、接收到重復(fù)服務(wù)請求,處理該請求并發(fā)送應(yīng)答信號。4、返回第二步,等待另一客戶請求5、關(guān)閉服務(wù)器 客戶端后啟動,過程如下: 1、打開一通信通道,并連接到服務(wù)器所在主機的特定

12、端口。2、向服務(wù)器發(fā)送服務(wù)請求報文,等待并接收應(yīng)答;繼續(xù)提出請求3、請求結(jié)束后關(guān)閉通信通道并終止。 服務(wù)器和客戶端的流程服務(wù)器和客戶端的流程Winsock編程流程n Winsock初始化每個winsock應(yīng)用都必須加裝相應(yīng)版本的winsock DLL,否則返回SOCKET_ERROE,錯誤信息為WSANOINITIALISED.v加裝winsock庫:WSAStartupv釋放winsock庫:WSACleanupv注:所有的winsock函數(shù)都是從WS2_32.DLL導(dǎo)出的,所以應(yīng)包含相應(yīng)庫文件(VC+默認(rèn)情況下不包含):#pragma comment(lib,”WS2_32”)附:n wV

13、ersionRequested參數(shù)用于指定準(zhǔn)備加載的Winsock庫的版本。高位字節(jié)指定所需要的Winsock庫的副版本,而低位字節(jié)則是主版本。然后,可用宏MAKEWORD(X,Y)(其中,x是高位字節(jié),y是低位字節(jié))方便地獲得wVersionRequested的正確值。n lpWSAData參數(shù)是指向LPWSADATA結(jié)構(gòu)的指針,WSAStartup用其加載的庫版本有關(guān)的信息填在這個結(jié)構(gòu)中。n 套接字的創(chuàng)建和關(guān)閉使用之前必須先調(diào)用socket函數(shù)創(chuàng)建一個套接字對象,成功返回套接字句柄SOCKET socket(int af,int type,int protocol); 參數(shù):af: 通信發(fā)

14、生的區(qū)域 type: 要建立的套接字類型 procotol: 使用的特定協(xié)議 BOOL closesocket(SOCKET s);n “服務(wù)器”其實是一個進(jìn)程,它需要等待任意數(shù)量的客戶機連接,以便為它們的請求提供服務(wù)。對服務(wù)器監(jiān)聽的連接來說,它必須在一個已知的名字上。在TCP/IP中,這個名字就是本地接口的IP地址,加上一個端口編號。每種協(xié)議都有一套不同的定址方案,所以有一種不同的命名方法。在Winsock中,第一步是將指定協(xié)議的套接字綁定到它已知的名字上。這個過程是通過API調(diào)用bind來完成的。下一步是將套接字置為監(jiān)聽模式。這時,用API函數(shù)listen來完成的。最后,若一個客戶機試圖建

15、立連接,服務(wù)器必須通過accept或WSAAccept調(diào)用來接受連接。n 綁定套接字到指定的IP地址和端口號 int bind (SOCKET s, const struct sockaddr* name, int namelen); 參數(shù):參數(shù):s: 是由socket()調(diào)用返回的并且未作連接的套接 字描述符(套接字號); name:等待連接的地址; namelen:由協(xié)議決定的地址長度 其它:其它:沒有錯誤,bind()返回0,否則SOCKET_ERROR附:TCP中綁定套接字到本地地址sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=

16、htons(4567);sin.sin_addr.S_un.S_addr=INADDR_ANY;If(bind(sListen,(LPSOCKADDR)&sin,sizeof(sin)=SOCKET_ERROR)printf(“failed bind”);return 0;n 設(shè)置套接字進(jìn)入監(jiān)聽狀態(tài)監(jiān)聽用于面向連接服務(wù)器,表明它愿意接收連接 int listen(SOCKET s, int backlog); 參數(shù):參數(shù):s:已連接的套接字 backlog:指定了正在等待連接的最大隊列長度。 其他:其他: listen僅應(yīng)用在支持連接的套接字上,函數(shù)成功后,套接字進(jìn)入被動模式,到來的連接會被通

17、知要排隊等候接受處理 n 接受連接請求 SOCKET accept(SOCKET s,struct sockaddr* name,int* addrlen);注:accept函數(shù)返回后,addr結(jié)構(gòu)中會包含發(fā)出連接請求的那個客戶機的IP地址信息,而addrlen參數(shù)則指出結(jié)構(gòu)的長度。此外,accept會返回一個新的套接字描述符,它對應(yīng)于已經(jīng)接受的那個客戶機連接。對于該客戶機后續(xù)的所有操作,都應(yīng)使用這個新套接字。至于原來那個監(jiān)聽套接字,它仍然用于接受其他客戶機連接,而且仍處于監(jiān)聽模式。n 客戶機只需三步操作: 1)用socket或WSASocket創(chuàng)建一個套接字。 2)解析服務(wù)器名(以基層協(xié)議為準(zhǔn))。 3)用connect或WSAConnect初

溫馨提示

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

評論

0/150

提交評論