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

下載本文檔

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

文檔簡(jiǎn)介

1、Linux高級(jí)程序設(shè)計(jì)(第二版)人民郵電出版社出版楊宗德編著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實(shí)現(xiàn)簡(jiǎn)單聊天程序9/7/20222OSI模型及TCP/IP協(xié)議模式 9/7/20223TCP/IP體系結(jié)構(gòu)及各層協(xié)議 9/7/20224IP地址分類 9/7/20225IP地址劃分 類別前8位(二進(jìn)制)點(diǎn)分十進(jìn)制第一字節(jié)范圍默認(rèn)子網(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ù)包封包與拆包過(guò)程 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實(shí)現(xiàn)簡(jiǎn)單聊天程序9/7/202213類比 通信,面向連接的socket通信實(shí)現(xiàn) 9/7/202214通信過(guò)程首先,服務(wù)器端需要做以下準(zhǔn)備工作:(1)調(diào)用socket()函數(shù)。建立socket對(duì)象,指定通信協(xié)議。(2)調(diào)用bind()函數(shù)。將創(chuàng)建的socket對(duì)象與當(dāng)前主機(jī)的某一個(gè)IP地和端口綁定。(3)調(diào)用listen()函數(shù)。使socket對(duì)象處于監(jiān)聽(tīng)狀態(tài),并設(shè)置監(jiān)聽(tīng)隊(duì)列大小??蛻舳诵枰鲆韵聹?zhǔn)備工作:(1)調(diào)用socket()函數(shù)。建立socket()對(duì)象,指定相同通信協(xié)議。(2)應(yīng)用程序可以顯式的調(diào)用bind()函數(shù)為

4、其綁定IP地址和端口,當(dāng)然,也可以將這工作交給TCP/IP協(xié)議棧。接著建立通信連接:(1)客戶端調(diào)用connect()函數(shù)。向服務(wù)器端發(fā)出連接請(qǐng)求。(2)服務(wù)端監(jiān)聽(tīng)到該請(qǐng)求,調(diào)用accept()函數(shù)接受請(qǐng)求,從而建立連接,并返回一個(gè)新的socket文件描述符專門(mén)處理該連接。然后通信雙方發(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對(duì)象。 9/7/202215BSD Socket網(wǎng)絡(luò)編

5、程API socket9/7/202216Socket參數(shù)說(shuō)明第一個(gè)參數(shù)用來(lái)指明此socket對(duì)象所使用的地址簇或協(xié)議簇.9/7/202217Socket參數(shù)說(shuō)明第二個(gè)參數(shù)為socket的類型。 9/7/202218BSD Socket網(wǎng)絡(luò)編程API bind完成此步,該socket擁有了本地IP地址,端口,通信協(xié)議,不能接收客戶端的請(qǐng)求,但可以向服務(wù)器發(fā)起連接。9/7/202219Bind參數(shù)說(shuō)明第二個(gè)參數(shù)是一個(gè)指向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第一個(gè)參數(shù)是綁定了IP及端口信息的socket文件描述符。第二個(gè)參數(shù)為請(qǐng)求排隊(duì)的最大長(zhǎng)度。當(dāng)有多個(gè)客戶端程序和服務(wù)器端相連時(shí), 此值表示可以使用的處于等待的隊(duì)列長(zhǎng)度。listen 函數(shù)將綁定的socket文件描述符變?yōu)楸O(jiān)聽(tīng)套接字,完成此步: 服務(wù)器已經(jīng)準(zhǔn)備接收客戶端連接請(qǐng)求了。9/7/202224BSD Socket網(wǎng)絡(luò)編程API客戶端發(fā)起連接 connect其第一個(gè)參數(shù)為socket返回的文件描述符。第二個(gè)參數(shù)儲(chǔ)存了服務(wù)器端的地址(

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

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

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

10、操作,這時(shí)只能使用close()函數(shù)來(lái)關(guān)閉子進(jì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實(shí)現(xiàn)簡(jiǎn)單聊天程序9/7/202231面向無(wú)連接通信模型 9/7/202232BSD Socket網(wǎng)絡(luò)編程API sendto/ recvfrom 第一個(gè)參數(shù)為發(fā)送的目標(biāo)socket對(duì)象。第二個(gè)參數(shù)為欲發(fā)送的數(shù)據(jù)信息。第三個(gè)參數(shù)為發(fā)送數(shù)據(jù)的大小。第四個(gè)參數(shù)為flags,如send函數(shù)所示。第五個(gè)參數(shù)欲發(fā)送數(shù)據(jù)的目標(biāo)地址,其結(jié)構(gòu)體前面已經(jīng)介紹。第六個(gè)參數(shù)為此結(jié)

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論