Linux socket網(wǎng)絡(luò)編程.ppt_第1頁
Linux socket網(wǎng)絡(luò)編程.ppt_第2頁
Linux socket網(wǎng)絡(luò)編程.ppt_第3頁
Linux socket網(wǎng)絡(luò)編程.ppt_第4頁
Linux socket網(wǎng)絡(luò)編程.ppt_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗三 TCP/IP Socket網(wǎng)絡(luò)編程,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,內(nèi)容大綱,Socket編程接口 Linux Socket TCP/IP網(wǎng)絡(luò)程序框架與示例,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,一些基本概念,IP地址 端口號 字節(jié)序,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,IP地址,IP地址是Internet中主機的標(biāo)識 Internet中的主機要與別的機器通信必須具有一個IP地址 一個IP地址為32位(IPV4),或者128位(IPV6) 每個數(shù)據(jù)包都必須攜帶目的IP地址和源IP地址,路由器依靠此信息為數(shù)據(jù)包選擇路由 特殊的

2、IP地址:廣播地址、多播地址 表示形式:常用點分形式,如202.38.64.10,最后都會轉(zhuǎn)換為一個32位的整數(shù)。,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,端口號,為了區(qū)分一臺主機接收到的數(shù)據(jù)包應(yīng)該遞交給哪個進(jìn)程來進(jìn)行處理,使用端口號 TCP端口號與UDP端口號獨立 端口號一般由IANA (Internet Assigned Numbers Authority) 管理 眾所周知端口:11023,1255之間為大部分眾所周知端口,2561023端口通常由UNIX占用 注冊端口:102449151 動態(tài)或私有端口:4915165535,2020/8/26,TCP/IP Socket

3、網(wǎng)絡(luò)編程,端到端通信數(shù)據(jù)包投遞過程,網(wǎng)絡(luò)數(shù)據(jù)包封包與拆包過程,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,數(shù)據(jù)包接收拆包分類流程,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,IP數(shù)據(jù)包頭,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,TCP包頭,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,UDP數(shù)據(jù)包頭,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,什么是Socket,獨立于具體協(xié)議的網(wǎng)絡(luò)編程接口 在ISO模型中,主要位于會話層和傳輸層之間 BSD Socket(伯克利套接字)是通過

4、標(biāo)準(zhǔn)的UNIX文件描述符和其它程序通訊的一個方法,目前已經(jīng)被廣泛移植到各個平臺。,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,Socket類型,流式套接字(SOCK_STREAM) 提供了一個面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無差錯、無重復(fù)的發(fā)送且按發(fā)送順序接收。內(nèi)設(shè)置流量控制,避免數(shù)據(jù)流淹沒慢的接收方。數(shù)據(jù)被看作是字節(jié)流,無長度限制。 數(shù)據(jù)報套接字(SOCK_DGRAM) 提供無連接服務(wù)。數(shù)據(jù)包以獨立數(shù)據(jù)包的形式被發(fā)送,不提供無差錯保證,數(shù)據(jù)可能丟失或重復(fù),順序發(fā)送,可能亂序接收。 原始套接字(SOCK_RAW) 可以對較低層次協(xié)議,如IP、ICMP直接訪問。,2020/8/26

5、,TCP/IP Socket網(wǎng)絡(luò)編程,Socket的位置,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,Linux Socket,基本上就是BSD Socket 需要使用的頭文件 數(shù)據(jù)類型:#include 函數(shù)定義:#include ,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,16/83,Socket常用函數(shù)介紹,基本函數(shù) 網(wǎng)絡(luò)信息檢索函數(shù),2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,17/83,基本函數(shù),網(wǎng)絡(luò)連接函數(shù) socket創(chuàng)建套接字 bind綁定本機端口 connect建立連接 listen監(jiān)聽端口 accept接受連接 recv, recvfr

6、om數(shù)據(jù)接收 send, sendto數(shù)據(jù)發(fā)送 close, shutdown關(guān)閉套接字,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,基本函數(shù),轉(zhuǎn)換函數(shù) IP地址轉(zhuǎn)換函數(shù) inet_addr()點分十進(jìn)制數(shù)表示的IP地址轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序的IP地址 inet_ntoa()網(wǎng)絡(luò)字節(jié)序的IP地址轉(zhuǎn)換為點分十進(jìn)制數(shù)表示的IP地址 字節(jié)排序函數(shù) htonl4字節(jié)主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序 ntohl 4字節(jié)網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機字節(jié)序 htons2字節(jié)主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序 ntohs2字節(jié)網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機字節(jié)序,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,網(wǎng)絡(luò)信息檢索函數(shù)

7、,網(wǎng)絡(luò)信息檢索函數(shù) gethostname獲得主機名 getpeername獲得與套接口相連的遠(yuǎn)程協(xié)議地址 getsockname獲得套接口本地協(xié)議地址 gethostbyname根據(jù)主機名取得主機信息 gethostbyaddr根據(jù)主機地址取得主機信息 getprotobyname根據(jù)協(xié)議名取得主機協(xié)議信息,getprotobynumber根據(jù)協(xié)議號取得主機協(xié)議信息 getservbyname根據(jù)服務(wù)名取得相關(guān)服務(wù)信息 getservbyport根據(jù)端口號取得相關(guān)服務(wù)信息 getsockopt/setsockopt獲取/設(shè)置一個套接口選項 ioctlsocket設(shè)置套接口的工作方式,2020

8、/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,21/83,TCP/IP網(wǎng)絡(luò)程序框架,面向連接的C/S程序工作流程 無連接的C/S程序工作流程,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,面向連接的C/S程序工作流程(TCP),服務(wù)器端工作流程 使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧安裝情況 使用socket()函數(shù)創(chuàng)建服務(wù)器端通信套接口 使用bind()函數(shù)將創(chuàng)建的套接口與服務(wù)器地址綁定 使用listen()函數(shù)使服務(wù)器套接口做好接收連接請求準(zhǔn)備 使用accept()接收來自客戶端由connect()函數(shù)發(fā)出的連接請

9、求,根據(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 API,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,面向連接的C/S程序工作流程(TCP),客戶端程序工作流程 使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧安裝情況 使用socket()函數(shù)創(chuàng)建客戶端套接口 使用connect()函數(shù)發(fā)出也服務(wù)器建立連接的請求(調(diào)用前可

10、以不用bind()端口號,由系統(tǒng)自動完成) 連接建立后使用send()函數(shù)發(fā)送數(shù)據(jù),或使用recv()函數(shù)接收數(shù)據(jù) 使用closesocet()函數(shù)關(guān)閉套接口 最后調(diào)用WSACleanup()函數(shù),結(jié)束Winsock Sockets API,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,面向連接的C/S程序工作流程(TCP),服務(wù)器與客戶端五元組的建立,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,面向連接的C/S程序工作流程圖(TCP),BSD Socket網(wǎng)絡(luò)編程API socket,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,Socket參數(shù)說明,第一個參

11、數(shù)用來指明此socket對象所使用的地址簇或協(xié)議簇.,2020/8/26,Socket參數(shù)說明,第二個參數(shù)為socket的類型。,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,BSD Socket網(wǎng)絡(luò)編程API bind,完成此步,該socket擁有了本地IP地址,端口,通信協(xié)議,不能接收客戶端的請求,但可以向服務(wù)器發(fā)起連接。,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,Bind參數(shù)說明,第二個參數(shù)是一個指向sockaddr結(jié)構(gòu)的指針。 struct sockaddr只是提供地址類型規(guī)范,根據(jù)不同的應(yīng)用,sockaddr需要選用不同的類型。,2020/8/26,TCP/I

12、P Socket網(wǎng)絡(luò)編程,地址結(jié)構(gòu)體定義- UNIX域套接字,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,地址結(jié)構(gòu)體定義- IPV4,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,端口與IP地址,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,BSD Socket網(wǎng)絡(luò)編程API listen,第一個參數(shù)是綁定了IP及端口信息的socket文件描述符。 第二個參數(shù)為請求排隊的最大長度。當(dāng)有多個客戶端程序和服務(wù)器端相連時, 此值表示可以使用的處于等待的隊列長度。 listen 函數(shù)將綁定的socket文件描述符變?yōu)楸O(jiān)聽套接字,完成此步: 服務(wù)器已經(jīng)準(zhǔn)備接收客戶端連接請

13、求了。,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,BSD Socket網(wǎng)絡(luò)編程API客戶端發(fā)起連接 connect,其第一個參數(shù)為socket返回的文件描述符。 第二個參數(shù)儲存了服務(wù)器端的地址(包括服務(wù)器的IP地址和端口信息)。 第三個參數(shù)為該地址的長度。 如果執(zhí)行成功,此函數(shù)將與地址為addr的服務(wù)器建立連接,并返回0,如果失敗則返回-1。 正確完成此步:客戶端socket擁有了目的IP,端口信息。,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,BSD Socket網(wǎng)絡(luò)編程API服務(wù)器接收連接 accept,第一個參數(shù)是監(jiān)聽網(wǎng)絡(luò)后的socket文件描述符。 第二參數(shù)為

14、struct sockaddr 類型的地址空間首地址,第三個參數(shù)為該段地址空間長度,因此第二個參數(shù)用來存儲客戶端的IP地址和端口信息,以便為客戶端返回數(shù)據(jù)。 需要注意的是,如果執(zhí)行成功,此函數(shù)將返回一個新的文件描述符以標(biāo)識該連接,從而使原來的文件描述符可以繼續(xù)等待新的連接,這樣便可以實現(xiàn)多客戶端。如果執(zhí)行失敗,將返回-1。 至此,兩端的連接已經(jīng)建立,而服務(wù)器端又是如何區(qū)別多個連接的呢?,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,如何區(qū)分多個客戶端,對于任何一個TCP連接,最重要的信息包括源IP:源端口,目的IP:目的端口四個信息。例如,客戶機192.168.0.10/24的300

15、0、4000兩端口同時向服務(wù)器192.168.0.100/24的80端口發(fā)起兩個連接,在服務(wù)器端是如何區(qū)別兩個連接的呢?,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,BSD Socket網(wǎng)絡(luò)編程API讀/寫socket,2020/8/26,BSD Socket網(wǎng)絡(luò)編程APIsend/recv,第一個參數(shù)為發(fā)送的目標(biāo)socket對象; 第二個參數(shù)為欲發(fā)送的數(shù)據(jù)位置; 第三個參數(shù)為數(shù)據(jù)的大?。?第四個參數(shù)操作flags,支持的值為0或MSG_OOB(發(fā)送帶外數(shù)據(jù))等。對套接字調(diào)用write()的行為與將flags設(shè)置為0的send()的行為完全相同。 如果執(zhí)行成功,此函數(shù)將返回發(fā)送數(shù)據(jù)

16、的大小,如果失敗,將返回-1。,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,BSD Socket網(wǎng)絡(luò)編程API 關(guān)閉socket對象 close/shutdown,howto=0這個時候系統(tǒng)會關(guān)閉讀通道,但是可以繼續(xù)往socket描述符中寫。 howto=1關(guān)閉寫通道,和上面相反,此時只可以讀。 howto=2關(guān)閉讀寫通道,和close一樣,在多進(jìn)程程序里,當(dāng)幾個子進(jìn)程共享一個套接字時,如果使用shutdown,那么所有的子進(jìn)程都將不能操作,這時只能使用close()函數(shù)來關(guān)閉子進(jìn)程的套接字描述符。,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,2020/8/26,TCP

17、/IP Socket網(wǎng)絡(luò)編程,無連接的C/S程序工作流程(UDP),無連接的數(shù)據(jù)報傳輸服務(wù)通信時,客戶端與服務(wù)器端所使用的函數(shù)是類似的,其工作流程如下: 使用WSAStartup()函數(shù)檢查系統(tǒng)協(xié)議棧的安裝情況 使用socket()函數(shù)創(chuàng)建套接口,以確定協(xié)議類型 調(diào)用bind()函數(shù)將創(chuàng)建的套接口與本地地址綁定,確定本地地址和本地端口號 使用sendto()函數(shù)發(fā)送數(shù)據(jù),或者使用recvfrom()函數(shù)接收數(shù)據(jù),使用closesocket()函數(shù)關(guān)閉套接口 調(diào)用WSACleanup()函數(shù),結(jié)束Windows Sockets API,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,20

18、20/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,無連接的C/S程序工作流程(UDP),注意事項: 通信的一方可以不用bind()綁定地址和端口,由系統(tǒng)分配 不綁定IP地址和端口號的一方必須首先向綁定地址的一方發(fā)送數(shù)據(jù) 無連接的應(yīng)用程序也可以調(diào)用connect()函數(shù),但是它并不向?qū)Ψ桨l(fā)出建立連接的請求,而是在本地返回,由內(nèi)核將connect()中指定的目標(biāo)IP地址和端口號記錄下來,在以后的通信中就可以使用面向連接的數(shù)據(jù)發(fā)送函數(shù)send()和數(shù)據(jù)接收函數(shù)recv(),無連接的數(shù)據(jù)報傳輸過程中,作為服務(wù)器的一方必須先啟動 無連接客戶端一般不調(diào)用connect(),在數(shù)據(jù)發(fā)送前客戶與服務(wù)器各自通過socket()和bind()建立了半相關(guān),發(fā)送數(shù)據(jù)時除指定本地套接口的地址外,還需要指定接收方套接口地址,從而在數(shù)據(jù)收發(fā)過程中動態(tài)建立全連接,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,2020/8/26,TCP/IP Socket網(wǎng)絡(luò)編程,無連接的C/S程序工作流程圖(UDP),BSD Socket網(wǎng)絡(luò)編程API sen

溫馨提示

  • 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

提交評論