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

下載本文檔

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

文檔簡介

1、Linux高級程序設(shè)計(第二版)人民郵電出版社出版楊宗德編著2009年9月9/7/20221第12章Linux socket網(wǎng)絡(luò)編程基礎(chǔ) 12網(wǎng)絡(luò)通信基礎(chǔ) BSD Socket TCP網(wǎng)絡(luò)通信編程3BSD Socket UDP網(wǎng)絡(luò)通信編程4使用TCP實現(xiàn)簡單聊天程序9/7/20222OSI模型及TCP/IP協(xié)議模式 9/7/20223TCP/IP體系結(jié)構(gòu)及各層協(xié)議 9/7/20224IP地址分類 9/7/20225IP地址劃分 類別前8位(二進制)點分十進制第一字節(jié)范圍默認子網(wǎng)掩碼廣播地址網(wǎng)絡(luò)數(shù)A0XXXXXXX1126(127為回環(huán)地址)255.0.0.0X.255.255.255126B1

2、0XXXXXX128191255.255.0.0X.X.255.25516384C110XXXXX192223255.255.255.0X.X.X.2552097152D1110XXXX224239N/AN/AN/AE1111XXXX240254N/AN/AN/A9/7/20226網(wǎng)絡(luò)數(shù)據(jù)包封包與拆包過程 9/7/20227數(shù)據(jù)包接收拆包分類流程 9/7/20228以太網(wǎng)鏈路層數(shù)據(jù)幀格式 9/7/20229IP數(shù)據(jù)包頭 9/7/202210TCP包頭 9/7/202211UDP數(shù)據(jù)包頭 9/7/202212第12章Linux socket網(wǎng)絡(luò)編程基礎(chǔ) 12網(wǎng)絡(luò)通信基礎(chǔ) BSD Socket T

3、CP網(wǎng)絡(luò)通信編程3BSD Socket UDP網(wǎng)絡(luò)通信編程4使用TCP實現(xiàn)簡單聊天程序9/7/202213類比 通信,面向連接的socket通信實現(xiàn) 9/7/202214通信過程首先,服務(wù)器端需要做以下準備工作:(1)調(diào)用socket()函數(shù)。建立socket對象,指定通信協(xié)議。(2)調(diào)用bind()函數(shù)。將創(chuàng)建的socket對象與當(dāng)前主機的某一個IP地和端口綁定。(3)調(diào)用listen()函數(shù)。使socket對象處于監(jiān)聽狀態(tài),并設(shè)置監(jiān)聽隊列大小??蛻舳诵枰鲆韵聹蕚涔ぷ鳎海?)調(diào)用socket()函數(shù)。建立socket()對象,指定相同通信協(xié)議。(2)應(yīng)用程序可以顯式的調(diào)用bind()函數(shù)為

4、其綁定IP地址和端口,當(dāng)然,也可以將這工作交給TCP/IP協(xié)議棧。接著建立通信連接:(1)客戶端調(diào)用connect()函數(shù)。向服務(wù)器端發(fā)出連接請求。(2)服務(wù)端監(jiān)聽到該請求,調(diào)用accept()函數(shù)接受請求,從而建立連接,并返回一個新的socket文件描述符專門處理該連接。然后通信雙方發(fā)送/接收數(shù)據(jù):(1)服務(wù)器端調(diào)用write()或send()函數(shù)發(fā)送數(shù)據(jù),客戶端調(diào)用read()或者recv()函數(shù)接收數(shù)據(jù)。反之客戶端發(fā)送數(shù)據(jù),服務(wù)器端接收數(shù)據(jù)。(2)通信完成后,通信雙方都需要調(diào)用close()或者shutdown()函數(shù)關(guān)閉socket對象。 9/7/202215BSD Socket網(wǎng)絡(luò)編

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

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

7、包括服務(wù)器的IP地址和端口信息)。第三個參數(shù)為該地址的長度。如果執(zhí)行成功,此函數(shù)將與地址為addr的服務(wù)器建立連接,并返回0,如果失敗則返回-1。正確完成此步:客戶端socket擁有了目的IP,端口信息。9/7/202225BSD Socket網(wǎng)絡(luò)編程API服務(wù)器接收連接 accept 第一個參數(shù)是監(jiān)聽網(wǎng)絡(luò)后的socket文件描述符。第二參數(shù)為struct sockaddr 類型的地址空間首地址,第三個參數(shù)為該段地址空間長度,因此第二個參數(shù)用來存儲客戶端的IP地址和端口信息,以便為客戶端返回數(shù)據(jù)。需要注意的是,如果執(zhí)行成功,此函數(shù)將返回一個新的文件描述符以標(biāo)識該連接,從而使原來的文件描述符可以

8、繼續(xù)等待新的連接,這樣便可以實現(xiàn)多客戶端。如果執(zhí)行失敗,將返回-1。至此,兩端的連接已經(jīng)建立,而服務(wù)器端又是如何區(qū)別多個連接的呢?9/7/202226如何區(qū)分多個客戶端對于任何一個TCP連接,最重要的信息包括源IP:源端口,目的IP:目的端口四個信息。例如,客戶機的3000、4000兩端口同時向服務(wù)器的80端口發(fā)起兩個連接,在服務(wù)器端是如何區(qū)別兩個連接的呢?9/7/202227BSD Socket網(wǎng)絡(luò)編程API讀/寫socket 9/7/202228BSD Socket網(wǎng)絡(luò)編程APIsend/recv第一個參數(shù)為發(fā)送的目標(biāo)socket對象;第二個參數(shù)為欲發(fā)送的數(shù)據(jù)位置;第三個參數(shù)為數(shù)據(jù)的大?。?/p>

9、第四個參數(shù)操作flags,支持的值為0或MSG_OOB(發(fā)送帶外數(shù)據(jù))等。對套接字調(diào)用write()的行為與將flags設(shè)置為0的send()的行為完全相同。如果執(zhí)行成功,此函數(shù)將返回發(fā)送數(shù)據(jù)的大小,如果失敗,將返回-1。9/7/202229BSD Socket網(wǎng)絡(luò)編程API 關(guān)閉socket對象 close/shutdownhowto=0這個時候系統(tǒng)會關(guān)閉讀通道,但是可以繼續(xù)往socket描述符中寫。howto=1關(guān)閉寫通道,和上面相反,此時只可以讀。howto=2關(guān)閉讀寫通道,和close一樣,在多進程程序里,當(dāng)幾個子進程共享一個套接字時,如果使用shutdown,那么所有的子進程都將不能

10、操作,這時只能使用close()函數(shù)來關(guān)閉子進程的套接字描述符。9/7/202230第12章Linux socket網(wǎng)絡(luò)編程基礎(chǔ) 12網(wǎng)絡(luò)通信基礎(chǔ) BSD Socket TCP網(wǎng)絡(luò)通信編程3BSD Socket UDP網(wǎng)絡(luò)通信編程4使用TCP實現(xiàn)簡單聊天程序9/7/202231面向無連接通信模型 9/7/202232BSD Socket網(wǎng)絡(luò)編程API sendto/ recvfrom 第一個參數(shù)為發(fā)送的目標(biāo)socket對象。第二個參數(shù)為欲發(fā)送的數(shù)據(jù)信息。第三個參數(shù)為發(fā)送數(shù)據(jù)的大小。第四個參數(shù)為flags,如send函數(shù)所示。第五個參數(shù)欲發(fā)送數(shù)據(jù)的目標(biāo)地址,其結(jié)構(gòu)體前面已經(jīng)介紹。第六個參數(shù)為此結(jié)

11、構(gòu)體的大小。9/7/202233BSD Socket網(wǎng)絡(luò)編程API getsockname / getpeername獲得一個套接字(這個套接口至少完成了綁定本地IP地址)的本地地址。如果成功則返回0 ,如果發(fā)生錯誤則返回-1。第1個參數(shù)為欲讀取信息的socket文件描述符第2,3個參數(shù)分別為存儲地址的內(nèi)存空間地址和大小。getpeername()函數(shù)將取得一個已經(jīng)連接上的套接字的遠程信息(比如IP 地址和端口)。 9/7/202234應(yīng)用示例使用 AF_UNIX實現(xiàn)本機數(shù)據(jù)流通信示例 見代碼使用AF_INET實現(xiàn)UDP點對點通信示例 見代碼9/7/202235第12章Linux socket網(wǎng)絡(luò)編程基礎(chǔ) 12網(wǎng)絡(luò)通信基礎(chǔ) BSD Socket TCP網(wǎng)絡(luò)通信編程3BSD Socket UDP網(wǎng)絡(luò)通信編程4使用TCP實現(xiàn)簡單聊天程序9/7/202236服務(wù)端運行結(jié)果(IP地址為) 9/7/202237客戶機運行結(jié)果(IP地址為) 此程序只實現(xiàn)一端到端的數(shù)據(jù)傳遞,且只能一發(fā)一收的方式 。具體見代碼分析。9/7/202238習(xí)題(1)七層模型與TCP/IP協(xié)議模型比較,各層完成的基本功能,對應(yīng)的各層最主要功能是什么?(2)寫出你所知道的網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)協(xié)議其簡單工作原理描述,并列出其工作在TCP/IP協(xié)議棧的哪一層。(3)試寫出網(wǎng)絡(luò)數(shù)據(jù)的封包

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論