Socket通信-文檔資料_第1頁
Socket通信-文檔資料_第2頁
Socket通信-文檔資料_第3頁
Socket通信-文檔資料_第4頁
Socket通信-文檔資料_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1Socket通信2Socket通信(一)Socket相關(guān)理論(二)TCP的工作流程(三)Socket相關(guān)代碼3(一)Socket相關(guān)理論 提到網(wǎng)絡(luò)編程就必須說Socket。因?qū)懢W(wǎng)絡(luò)程序就必須要用Socket。 對于網(wǎng)絡(luò)編程,我們也言必稱TCP/IP,似乎其它網(wǎng)絡(luò)協(xié)議已經(jīng)不存在了。對于TCP/IP,我們還知道TCP和UDP,TCP面向連接,UDP面向無連接,前者可以保證數(shù)據(jù)的正確和可靠性,后者則允許數(shù)據(jù)丟失。 最后,我們還知道,在建立連接前,必須知道對方的IP地址和端口號。4(一)Socket相關(guān)理論我們還知道如下幾個事實:1。一個指定的端口號不能被多個程序共用。 比如,如果鼠標(biāo)占用了80端口

2、,那么U盤就不能用80端口了。2。很多防火墻只允許特定目標(biāo)端口的數(shù)據(jù)包通過。3。服務(wù)程序在listen某個端口并accept某個連接請求后,會生成一個新的socket來對該請求進(jìn)行處理。5(一)Socket相關(guān)理論 如果一個socket創(chuàng)建后并與80端口綁定后,是否就意味著該socket占用了80端口呢?如果是這樣的,那么當(dāng)其accept一個請求后,生成的新的socket到底使用的是什么端口呢?如果是系統(tǒng)會默認(rèn)給其分配一個空閑的端口號,那一定不是80端口了,于是以后的TCP數(shù)據(jù)包的目標(biāo)端口就不是80了-防火墻一定會阻止其通過的!6(一)Socket相關(guān)理論 實際上,我們可以看到,防火墻并沒有阻

3、止這樣的連接,而且這是最常見的連接請求和處理方式。為什么防火墻沒有阻止這樣的連接?它是如何判定那條連接是因為connet80端口而生成的?是不是TCP數(shù)據(jù)包里有什么特別的標(biāo)志?或者防火墻記住了什么東西?7(一)Socket相關(guān)理論類型流式套接字(SOCK_STREAM)-TCP提供了一個面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無差錯、無重復(fù)的發(fā)送且按發(fā)送順序接收。內(nèi)設(shè)置流量控制,避免數(shù)據(jù)流淹沒慢的接收方。數(shù)據(jù)被看作是字節(jié)流,無長度限制。數(shù)據(jù)報套接字(SOCK_DGRAM)-UDP提供無連接服務(wù)。數(shù)據(jù)包以獨(dú)立數(shù)據(jù)包的形式被發(fā)送,不提供無差錯保證,數(shù)據(jù)可能丟失或重復(fù),順序發(fā)送,可能亂序接收。8 Sock

4、et 的 位置傳輸層傳輸層傳輸層網(wǎng)絡(luò)層網(wǎng)絡(luò)層9(一)Socket相關(guān)理論在TCP和UDP同屬于傳輸層,共同架設(shè)在IP層(網(wǎng)絡(luò)層)之上。而IP層主要負(fù)責(zé)的是在節(jié)點之間(End to End)的數(shù)據(jù)包傳送,這里的節(jié)點是一臺網(wǎng)絡(luò)設(shè)備,比如計算機(jī)。因為IP層只負(fù)責(zé)把數(shù)據(jù)送到節(jié)點,而不能區(qū)分上面的不同應(yīng)用,所以TCP和UDP協(xié)議在其基礎(chǔ)上加入了端口的信息,端口于是標(biāo)識的是一個節(jié)點上的一個應(yīng)用。除了增加端口信息,UPD協(xié)議基本就沒有對IP層的數(shù)據(jù)進(jìn)行任何的處理了。而TCP協(xié)議還加入了更加復(fù)雜的傳輸控制,比如滑動的數(shù)據(jù)發(fā)送窗口(Slice Window),以及接收確認(rèn)和重發(fā)機(jī)制,以達(dá)到數(shù)據(jù)的可靠傳送。不管應(yīng)

5、用層看到的是怎樣一個穩(wěn)定的TCP數(shù)據(jù)流,下面?zhèn)魉偷亩际且粋€個的IP數(shù)據(jù)包,需要由TCP協(xié)議來進(jìn)行數(shù)據(jù)重組。所謂的端口,是為了區(qū)分不同的應(yīng)用的,以在不同的IP包來到的時候能夠正確轉(zhuǎn)發(fā)。10(一)Socket相關(guān)理論 可得出信息: 防火墻除了獲取IP地址和端口號之外,并沒有足夠的信息判斷TCP數(shù)據(jù)包的更多信息。 所謂的端口,是為了區(qū)分不同的應(yīng)用的,以在不同的IP包來到的時候能夠正確轉(zhuǎn)發(fā)。11 TCP/IP只是一個協(xié)議棧,就像操作系統(tǒng)的運(yùn)行機(jī)制一樣,必須要具體實現(xiàn),同時還要提供對外的操作接口,就像操作系統(tǒng)會提供標(biāo)準(zhǔn)的編程接口。 TCP/IP引入了新型的“I/O”操作-Socket編程接口 socke

6、t的出現(xiàn)只是可以更方便的使用TCP/IP協(xié)議棧而已,其對TCP/IP進(jìn)行了抽象,形成了幾個最基本的函數(shù)接口。比如create,listen,accept,connect,read和write等等。(一)Socket相關(guān)理論12如果一個程序創(chuàng)建了一個socket,并讓其監(jiān)聽80端口,其實是向TCP/IP協(xié)議棧聲明了其對80端口的占有。以后,所有目標(biāo)是80端口的TCP數(shù)據(jù)包都會轉(zhuǎn)發(fā)給該程序(這里的程序,因為使用的是Socket編程接口,所以首先由Socket層來處理)。accept函數(shù)返回的新socket其實指代的是本次創(chuàng)建的連接,而一個連接是包括兩部分信息的,一個是源IP和源端口,另一個是宿IP

7、和宿端口。(所謂accept函數(shù),其實抽象的是TCP的連接建立過程。)(一)Socket相關(guān)理論13所以,accept可以產(chǎn)生多個不同的socket,而這些socket里包含的宿IP和宿端口是不變的,變化的只是源IP和源端口。這樣的話,這些socket宿端口就可以都是80,而Socket層還是能根據(jù)源/宿對來準(zhǔn)確地分辨出IP包和socket的歸屬關(guān)系,從而完成對TCP/IP協(xié)議的操作封裝!而同時,放火墻的對IP包的處理規(guī)則也是清晰明了,不存在前面設(shè)想的種種復(fù)雜的情形。 (一)Socket相關(guān)理論14(二)TCP的工作流程2.1 服務(wù)器端工作流程使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧安裝

8、情況使用socket()函數(shù)創(chuàng)建服務(wù)器端通信套接口使用bind()函數(shù)將創(chuàng)建的套接口與服務(wù)器地址綁定使用listen()函數(shù)使服務(wù)器套接口做好接收連接請求準(zhǔn)備使用accept()接收來自客戶端由connect()函數(shù)發(fā)出的連接請求根據(jù)連接請求建立連接后,使用send()函數(shù)發(fā)送數(shù)據(jù),或者使用recv()函數(shù)接收數(shù)據(jù)使用closesocket()函數(shù)關(guān)閉套接口(可以先用shutdown()函數(shù)先關(guān)閉讀寫通道)最后調(diào)用WSACleanup()函數(shù)結(jié)束Winsock Sockets API15(二)TCP的工作流程2.2 客戶端程序工作流程使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧安裝情況使用s

9、ocket()函數(shù)創(chuàng)建客戶端套接口使用connect()函數(shù)發(fā)出也服務(wù)器建立連接的請求(調(diào)用前可以不用bind()端口號,由系統(tǒng)自動完成)連接建立后使用send()函數(shù)發(fā)送數(shù)據(jù),或使用recv()函數(shù)接收數(shù)據(jù)使用closesocet()函數(shù)關(guān)閉套接口最后調(diào)用WSACleanup()函數(shù),結(jié)束Winsock Sockets API162.3 服務(wù)器與客戶端五元組的建立172.4 TCP的程序工作流程圖18客戶端的建立 相比于服務(wù)器,客戶端就簡單多了,因為它只需要一個SOCKET。 添加一個基于CSocket的子類Client,點擊完成。這個類我們用于和客戶端的連接和收發(fā)數(shù)據(jù)。 然后,在主對話框的

10、頭文件中添加#include MySocket.h,并且聲明一個Cilent類 m_mySocket; 接著,我們得再主對話框的OnInitDialog函數(shù)中添加m_mySocket.Creat(); /初始化SOCKET 19 這時候,我們可以為主對話框添加一個按鈕,caption設(shè)為“連接”,用于連接。雙擊這個按鈕,開始函數(shù)定義,在函數(shù)體中我們加入以下代碼:m_mySocket.Connect(_T(127.0.0.1),8888);第一個參數(shù)表示想要連接的服務(wù)器的IP,第二個參數(shù)表示端口?,F(xiàn)在,客戶端與服務(wù)器的連接工作已經(jīng)做好了,我們需要再在客戶端的主對話框中添加一個按鈕,caption

11、設(shè)為“發(fā)送”,用于發(fā)送信息,在改按鈕的函數(shù)中,我們添加以下代碼:m_mySocket.Send(客戶端發(fā)來了信息,100);/參數(shù)分別表示要發(fā)送的字符串和字符串的最大長度.20服務(wù)端的建立:添加一個基于CSocket的子類Socket,點擊完成。這個類我們用于監(jiān)聽。接下來呢,我們在Socket類函數(shù)實現(xiàn)中點屬性-重寫-OnAccept。點屬性-重寫-OnReceive。在OnReceive函數(shù)中,我們添加以下代碼:char str100;Receive(str,100);CString strtest; strtest=str; AfxMessageBox(strtest); 21在OnAcc

12、ept函數(shù)中,我們添加以下代碼:Socket SocketRev= new Socket ();Accept(SocketRev); 這段代碼的作用是在當(dāng)服務(wù)器監(jiān)聽到客戶端的連接請求時,新建一個CRecv的成員,并用它來接受客戶端的連接請求,也就是用它與客戶端綁定。 22這段代碼用于接收客戶端發(fā)送過來的字符串,然后以MessageBox的形式顯示出來。最后,在主對話框的頭文件中添加#include Listen.h ,并且聲明一個CListen變量 m_listen 。然后,在主對話框的OnInitDialog函數(shù)中,添加如下代碼:m_listen.Create(8888); /8888表示的

13、是我們要監(jiān)聽的端口 m_listen.Listen();23(三)Socket相關(guān)代碼 3.1 Socket基本函數(shù)的介紹3.1.1 創(chuàng)建套接字-Socket應(yīng)用程序在使用套接口通信前,必須要擁有一個套接口,使用socket()函數(shù)來給應(yīng)用程序創(chuàng)建一個套接口。SOCKET socket(int af, /要使用的協(xié)議地址族int type, /描述套接口的類型int protocol /該套接口使用的特定協(xié)議);24af參數(shù):說明套接字接口要使用的協(xié)議地址族,地址族與協(xié)議族含義相同。如果想建立一個TCP或UDP,只能用常量。AF_INET參數(shù)表示使用互聯(lián)網(wǎng)協(xié)議(IP)地址。Winsock還支持

14、其他協(xié)議,但一般很少使用。type參數(shù):描述套接口的類型,af是AF_INET的時候只能為SOCK_STREAM、SOCK_DGRAM或SOCK_RAWProtocol參數(shù):說明該套接口使用的特定協(xié)議,當(dāng)協(xié)議地址族af和協(xié)議類型type確定后,協(xié)議字段可以使用的值是限定的socket()參數(shù)說明253.1.2 將創(chuàng)建的套接口與服務(wù)器地址綁定bind()當(dāng)socket()創(chuàng)建了一個套接口后,需要將該套接口與該主機(jī)上提供服務(wù)的某端口聯(lián)系在一起,bind()函數(shù)用于完成這樣的綁定。int bind(SOCKET s, /標(biāo)識一個未綁定的套接口描述字const struct sockaddr FAR

15、* name, /存儲了套接口的地址信息int namelen /地址參數(shù)(name)的長度);26S參數(shù):標(biāo)識一個未綁定的套接口描述字,它是socket()函數(shù)調(diào)用成功時返回的值name參數(shù):是一個與指定協(xié)議有關(guān)的地址結(jié)構(gòu)指針,存儲了套接口的地址信息,Winsock中使用sockaddr_in結(jié)構(gòu)指定IP地址和端口信息struct sockaddr_inshort sin_family;u_short sin_port;struct in_addrsin_addr;char sin_zero8; sin_family一般為AF_INET,表示使用IP地址族;sin_port是以網(wǎng)絡(luò)字節(jié)序表示

16、的16位端口號;sin_addr是網(wǎng)絡(luò)字節(jié)序的32位IP地址;sin_zero字段一般不用,用0填充namelen參數(shù):表示地址參數(shù)(name)的長度 IP地址參數(shù)為INADDR_ANY,則由系統(tǒng)內(nèi)核來自動指定port為0,則由系統(tǒng)自動指派一個10245000之間惟一的端口號bind()參數(shù)說明273.1.3 服務(wù)器端啟動監(jiān)聽listen()函數(shù)在一個服務(wù)器端用socket()調(diào)用成功創(chuàng)建了一個套接口,并用bind()函數(shù)和一個指定的地址關(guān)聯(lián)后,就需要指示該套接口進(jìn)入監(jiān)聽連接請求狀態(tài),這需要通過listen()函數(shù)來實現(xiàn) int listen( SOCKET s, int backlog);S

17、參數(shù):代表一個已綁定了地址,但還未建立連接的套接口描述字Backlog參數(shù):指定了正在等待連接的最大隊列長度283.1.4 服務(wù)器端接受連接accept()函數(shù)在服務(wù)器端通過listen()函數(shù)調(diào)用表示服務(wù)器進(jìn)入監(jiān)聽客戶的連接請求狀態(tài),而在服務(wù)器端調(diào)用accept()函數(shù)時表示可以接收來自客戶端由connect()發(fā)出的連接請求,雙方進(jìn)入連接狀態(tài)。SOCKET accept(SOCKET s, / s標(biāo)識一個套接字struct sockaddr FAR * addr, /用來存放發(fā)出連接請求的那個客戶機(jī)的IP地址信息int FAR * addrlen /指出客戶套接口地址結(jié)構(gòu)的長度);29s參

18、數(shù):標(biāo)識一個套接字,該套接口處于監(jiān)聽狀態(tài)addr參數(shù):是一個地址結(jié)構(gòu)的指針,用來存放發(fā)出連接請求的那個客戶機(jī)的IP地址信息addrlen參數(shù):指出客戶套接口地址結(jié)構(gòu)的長度函數(shù)說明:該函數(shù)用于面向連接的服務(wù)器端,在IP協(xié)議族中,只用于TCP服務(wù)器端accept()函數(shù)參數(shù)說明303.1.5 發(fā)送數(shù)據(jù)-send()函數(shù)在已經(jīng)建立連接的套接口上發(fā)送數(shù)據(jù),可以使用send()函數(shù)int send(SOCKET s, /用于標(biāo)識已建立連接的套接字const char FAR * buf, /是一個字符緩沖區(qū),內(nèi)有將要發(fā)送的數(shù)據(jù)int len, /即將發(fā)送的緩沖區(qū)中的字符數(shù) int flags /用于控制

19、數(shù)據(jù)傳輸方式);31s參數(shù):用于標(biāo)識已建立連接的套接字buf參數(shù):是一個字符緩沖區(qū),內(nèi)有將要發(fā)送的數(shù)據(jù)len參數(shù):即將發(fā)送的緩沖區(qū)中的字符數(shù)flags參數(shù):用于控制數(shù)據(jù)傳輸方式,0表示按正常方式發(fā)送數(shù)據(jù);宏MSG_DONTROUTE說明系統(tǒng)目標(biāo)主機(jī)就在直接連接的本地網(wǎng)絡(luò)中,無需路由選擇;MSG_OOB指出數(shù)據(jù)是按帶外數(shù)據(jù)發(fā)送的函數(shù)說明:send()函數(shù)適用于已建立連接的數(shù)據(jù)報或流式套接口發(fā)送數(shù)據(jù),對于數(shù)據(jù)報類型套接口必須注意發(fā)送數(shù)據(jù)長度不大于通信子網(wǎng)的IP包最大長度send()函數(shù)參數(shù)說明323.1.6 接收數(shù)據(jù)recv()函數(shù)對于已建立連接的套接口來說,要從套接口上接收數(shù)據(jù),就要使用recv()函數(shù)。int recv(SOCKET s, /已建立連接的套接口char FAR * buf, /為用于接收數(shù)據(jù)的緩沖區(qū)int

溫馨提示

  • 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

提交評論