![Linux網(wǎng)絡(luò)編程(第二版):第10章 基于UDP協(xié)議的接收和_第1頁](http://file4.renrendoc.com/view/51398dc479415ce7bd97ed102fc71dbe/51398dc479415ce7bd97ed102fc71dbe1.gif)
![Linux網(wǎng)絡(luò)編程(第二版):第10章 基于UDP協(xié)議的接收和_第2頁](http://file4.renrendoc.com/view/51398dc479415ce7bd97ed102fc71dbe/51398dc479415ce7bd97ed102fc71dbe2.gif)
![Linux網(wǎng)絡(luò)編程(第二版):第10章 基于UDP協(xié)議的接收和_第3頁](http://file4.renrendoc.com/view/51398dc479415ce7bd97ed102fc71dbe/51398dc479415ce7bd97ed102fc71dbe3.gif)
![Linux網(wǎng)絡(luò)編程(第二版):第10章 基于UDP協(xié)議的接收和_第4頁](http://file4.renrendoc.com/view/51398dc479415ce7bd97ed102fc71dbe/51398dc479415ce7bd97ed102fc71dbe4.gif)
![Linux網(wǎng)絡(luò)編程(第二版):第10章 基于UDP協(xié)議的接收和_第5頁](http://file4.renrendoc.com/view/51398dc479415ce7bd97ed102fc71dbe/51398dc479415ce7bd97ed102fc71dbe5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第10章基于UDP協(xié)議的接收和發(fā)送10.1UDP編程框架10.2UDP協(xié)議程序設(shè)計(jì)的常用函數(shù)10.3UDP接收和發(fā)送數(shù)據(jù)的例子10.4UDP協(xié)議程序設(shè)計(jì)中的幾個問題10.1UDP編程框架10.1.1UDP編程框圖10.1.2UDP服務(wù)器編程框架10.1.3UDP客戶端編程框架10.1.1UDP編程框圖UDP協(xié)議的程序設(shè)計(jì)框架如圖所示,客戶端和服務(wù)器之間的差別在于服務(wù)器必須使用bind()函數(shù)來綁定偵聽的本地UDP端口,而客戶端則可以不進(jìn)行綁定,直接發(fā)送到服務(wù)器地址的某個端口地址。1.UDP協(xié)議的服務(wù)器端流程2.UDP協(xié)議的客戶端流程3.UDP協(xié)議服務(wù)器和客戶端之間的交互1.UDP協(xié)議的服務(wù)器端流程UDP協(xié)議的服務(wù)器端程序設(shè)計(jì)的流程分為套接字建立、套接字與地址結(jié)構(gòu)進(jìn)行綁定、收發(fā)數(shù)據(jù)、關(guān)閉套接字等過程,分別對應(yīng)于函數(shù)socket()、bind()、sendto()、recvfrom()和close()。2.UDP協(xié)議的客戶端流程UDP協(xié)議的服務(wù)器端程序設(shè)計(jì)的流程分為套接字建立、收發(fā)數(shù)據(jù)、關(guān)閉套接字等過程,分別對應(yīng)于函數(shù)socket()、sendto()、recvfrom()和close()。3.UDP協(xié)議服務(wù)器和客戶端之間的交互UDP協(xié)議中服務(wù)器和客戶端的交互存在于數(shù)據(jù)的收發(fā)過程中。進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)收發(fā)的時候,服務(wù)器和客戶端的數(shù)據(jù)是對應(yīng)的:客戶端發(fā)送數(shù)據(jù)的動作,對服務(wù)器來說是接收數(shù)據(jù)的動作;客戶端接收數(shù)據(jù)的動作,對服務(wù)器來說是發(fā)送數(shù)據(jù)的動作。10.1.2UDP服務(wù)器編程框架服務(wù)器流程主要分為下述6個部分,即建立套接字、設(shè)置套接字地址參數(shù)、進(jìn)行端口綁定、接收數(shù)據(jù)、發(fā)送數(shù)據(jù)、關(guān)閉套接字等。(1)建立套接字文件描述符,使用函數(shù)socket(),生成套接字文件描述符。(2)設(shè)置服務(wù)器地址和偵聽端口,初始化要綁定的網(wǎng)絡(luò)地址結(jié)構(gòu)。(3)綁定偵聽端口,使用bind()函數(shù),將套接字文件描述符和一個地址類型變量進(jìn)行綁定。(4)接收客戶端的數(shù)據(jù),使用recvfrom()函數(shù)接收客戶端的網(wǎng)絡(luò)數(shù)據(jù)。(5)向客戶端發(fā)送數(shù)據(jù),使用sendto()函數(shù)向服務(wù)器主機(jī)發(fā)送數(shù)據(jù)。(6)關(guān)閉套接字,使用close()函數(shù)釋放資源。10.1.3UDP客戶端編程框架UDP協(xié)議的客戶端流程分為套接字建立、設(shè)置目的地址和端口、向服務(wù)器發(fā)送數(shù)據(jù)、從服務(wù)器接收數(shù)據(jù)、關(guān)閉套接字等5個部分。流程如下:(1)建立套接字文件描述符,socket();(2)設(shè)置服務(wù)器地址和端口,structsockaddr;(3)向服務(wù)器發(fā)送數(shù)據(jù),sendto();(4)接收服務(wù)器的數(shù)據(jù),recvfrom();(5)關(guān)閉套接字,close()。10.2UDP協(xié)議程序設(shè)計(jì)的常用函數(shù)10.2.1建立套接字socket()和綁定套接字bind()10.2.2接收數(shù)據(jù)recvfrom()/recv()10.2.3發(fā)送數(shù)據(jù)sendto()/send()10.2.1建立套接字socket()和綁定套接字bind()UDP協(xié)議建立套接字的方式同TCP方式一樣,使用socket()函數(shù),只不過協(xié)議的類型使用SOCK_DGRAM,而不是SOCK_STREAM。例如下面是建立一個UDP套接字文件描述符的代碼。ints;s=socket(AF_INET,SOCK_DGRAM,0);10.2.2接收數(shù)據(jù)recvfrom()/recv()當(dāng)客戶端成功建立了一個套接字文件描述符并構(gòu)建了合適的structsockaddr結(jié)構(gòu)或者服務(wù)器端成功地將套接字文件描述符和地址結(jié)構(gòu)綁定后,可以使用recv()或者recvfrom()來接收到達(dá)此套接字文件描述符上的數(shù)據(jù)或者在這個套接字文件描述符上等待數(shù)據(jù)的到來。1.recv()函數(shù)和recvfrom()函數(shù)介紹2.使用recvfrom()函數(shù)的例子3.應(yīng)用層recv()函數(shù)和內(nèi)核函數(shù)的關(guān)系1.recv()函數(shù)和recvfrom()函數(shù)介紹recv()函數(shù)和recvfrom()函數(shù)的原型如下:#include<sys/types.h>#include<sys/socket.h>ssize_trecv(ints,void*buf,size_tlen,intflags);ssize_trecvfrom(ints,void*buf,size_tlen,intflags,
structsockaddr*from,socklen_t*fromlen);2.使用recvfrom()函數(shù)的例子下面是一個簡單的例子,通過這個例子讀者可以了解如何使用recvfrom()函數(shù)以及什么時候使用recvfrom()函數(shù)。n
=recvfrom(s,buff,128,0,(structsockaddr*)&from,&from_len);3.應(yīng)用層recv()函數(shù)和內(nèi)核函數(shù)的關(guān)系應(yīng)用層的recvfrom()函數(shù)對應(yīng)內(nèi)核層的sys_recvfrom()系統(tǒng)調(diào)用函數(shù)。10.2.3發(fā)送數(shù)據(jù)sendto()/send()當(dāng)客戶端成功地建立了一個套接字文件描述符,并構(gòu)建了合適的structsockaddr結(jié)構(gòu)或者服務(wù)器端成功地將套接字文件描述符和地址結(jié)構(gòu)綁定后,可以使用send()或者sendto()函數(shù)來發(fā)送數(shù)據(jù)到某個主機(jī)上。1.send()函數(shù)和sendto()函數(shù)介紹2.使用函數(shù)sendto()的例子3.應(yīng)用層sendto()函數(shù)和內(nèi)核函數(shù)的關(guān)系1.send()函數(shù)和sendto()函數(shù)介紹send()函數(shù)和sendto()函數(shù)的原型如下:#include<sys/types.h>#include<sys/socket.h>ssize_tsend(ints,constvoid*buf,size_tlen,intflags);ssize_tsendto(ints,constvoid*buf,size_tlen,intflags,const
structsockaddr*to,socklen_ttolen);2.使用函數(shù)sendto()的例子下面是一個使用sendto()函數(shù)發(fā)送數(shù)據(jù)的簡單例子。s=socket(AF_INET,SOCK_DGRAM,0);
/*初始化一個IPv4族的數(shù)據(jù)報(bào)套接字*/3.應(yīng)用層sendto()函數(shù)和內(nèi)核函數(shù)的關(guān)系應(yīng)用層的sendto()函數(shù)對應(yīng)內(nèi)核層的sys_sendto()系統(tǒng)調(diào)用函數(shù)。10.3UDP接收和發(fā)送數(shù)據(jù)的例子10.3.1UDP服務(wù)器端10.3.2UDP服務(wù)器端數(shù)據(jù)處理10.3.3UDP客戶端10.3.4UDP客戶端數(shù)據(jù)處理10.3.5測試UDP程序10.3.1UDP服務(wù)器端UDP的服務(wù)器端與TCP服務(wù)器端十分相似,不過流程要簡單得多。服務(wù)器的代碼如下,其步驟為:(1)建立一個套接字文件描述符s。(2)填充地址結(jié)構(gòu)addr_serv,協(xié)議為AF_INET,地址為任意地址,端口為PORT_SERV(8888)。(3)將套接字文件描述符s綁定到地址addr_serv。(4)調(diào)用udpserv_echo()函數(shù)處理客戶端數(shù)據(jù)。20
udpserv_echo(s,(structsockaddr*)&addr_clie);
/*回顯處理程序*/10.3.2UDP服務(wù)器端數(shù)據(jù)處理函數(shù)udpserv_echo()的代碼如下,其中的處理過程很簡單,服務(wù)器循環(huán)等待客戶端的數(shù)據(jù),當(dāng)服務(wù)器接收到客戶端的數(shù)據(jù)后,將接收到的數(shù)據(jù)發(fā)回給客戶端。10.3.3UDP客戶端UDP客戶端向服務(wù)器端發(fā)送數(shù)據(jù)UDPTEST,然后接收服務(wù)器端的回復(fù)信息,并將服務(wù)器端的數(shù)據(jù)打印出來??蛻舳说拇a如下,其步驟為:(1)建立一個套接字文件描述符s。(2)填充地址結(jié)構(gòu)addr_serv,協(xié)議為AF_INET,地址為任意地址,端口為PORT_SERV(8888)。(3)將套接字文件描述符s綁定到地址addr_serv。(4)調(diào)用udpclie_echo()函數(shù)和服務(wù)器通信。10.3.4UDP客戶端數(shù)據(jù)處理udpclie_echo()函數(shù)的代碼如下,其中處理過程同樣簡單,向服務(wù)器端發(fā)送字符串UDPTEST,接收服務(wù)器的響應(yīng),并將接收到的服務(wù)器數(shù)據(jù)打印出來。08
sendto(s,buff,BUFF_LEN,0,to,len);
/*發(fā)送給服務(wù)器*/09
recvfrom(s,buff,BUFF_LEN,0,(structsockaddr*)&from,&len);
10.3.5測試UDP程序?qū)⒎?wù)器端的代碼存到udp_server01.c文件中,將客戶端的代碼存放到udp_client01.c文件中。按照如下方式進(jìn)行編譯:$gcc–oudp_server01udp_server01.c$gcc–oudp_client01udp_client01.c先運(yùn)行服務(wù)器程序,這時UDP服務(wù)器會在8888端口等待數(shù)據(jù)到來。$./udp_server01再運(yùn)行客戶端的程序,客戶端向服務(wù)器端發(fā)送字符串UDPTEST,并接收服務(wù)器的信息反饋。10.4UDP協(xié)議程序設(shè)計(jì)中的幾個問題10.4.1UDP報(bào)文丟失數(shù)據(jù)10.4.2UDP數(shù)據(jù)發(fā)送中的亂序10.4.3UDP協(xié)議中的connect()函數(shù)10.4.4UDP缺乏流量控制10.4.5UDP協(xié)議中的外出網(wǎng)絡(luò)接口10.4.6UDP協(xié)議中的數(shù)據(jù)報(bào)文截?cái)?0.4.1UDP報(bào)文丟失數(shù)據(jù)利用UDP協(xié)議進(jìn)行數(shù)據(jù)收發(fā)的時候,在局域網(wǎng)內(nèi)一般情況下數(shù)據(jù)的接收方均能接收到發(fā)送方的數(shù)據(jù),除非連接雙方的主機(jī)發(fā)生故障,否則不會發(fā)生接收不到數(shù)據(jù)的情況。1.UDP報(bào)文的正常發(fā)送過程2.UDP報(bào)文的丟失3.UDP報(bào)文丟失的對策1.UDP報(bào)文的正常發(fā)送過程而在Internet上,由于要經(jīng)過多個路由器,正常情況下一個數(shù)據(jù)報(bào)文從主機(jī)C經(jīng)過路由器A、路由器B、路由器C到達(dá)主機(jī)S,數(shù)據(jù)報(bào)文的路徑如圖10.9所示。主機(jī)C使用函數(shù)sendto()發(fā)送數(shù)據(jù),主機(jī)S使用recvfrom()函數(shù)接收數(shù)據(jù),主機(jī)S在沒有數(shù)據(jù)到來的時候,會一直阻塞等待。2.UDP報(bào)文的丟失路由器要對轉(zhuǎn)發(fā)的數(shù)據(jù)進(jìn)行存儲、處理、合法性判定、轉(zhuǎn)發(fā)等操作,容易出現(xiàn)錯誤,所以很可能在路由器轉(zhuǎn)發(fā)的過程中出現(xiàn)數(shù)據(jù)丟失的現(xiàn)象,如圖10.10所示。當(dāng)UDP的數(shù)據(jù)報(bào)文丟失的時候,函數(shù)recvfrom()會一直阻塞,直到數(shù)據(jù)到來。3.UDP報(bào)文丟失的對策主機(jī)C發(fā)送的數(shù)據(jù)經(jīng)過路由器,到達(dá)主機(jī)S后,主機(jī)S要發(fā)送一個接收到此數(shù)據(jù)報(bào)文的響應(yīng),主機(jī)C要對主機(jī)S的響應(yīng)進(jìn)行記錄,直到之前發(fā)送的數(shù)據(jù)報(bào)文1已經(jīng)被主機(jī)S接收到。如果數(shù)據(jù)報(bào)文在經(jīng)過路由器的時候,被路由器丟棄,則主機(jī)C和主機(jī)S會對超時的數(shù)據(jù)進(jìn)行重發(fā)。10.4.2UDP數(shù)據(jù)發(fā)送中的亂序UDP協(xié)議數(shù)據(jù)收發(fā)過程中,會出現(xiàn)數(shù)據(jù)的亂序現(xiàn)象。所謂亂序是發(fā)送數(shù)據(jù)的順序和接收數(shù)據(jù)的順序不一致,例如發(fā)送數(shù)據(jù)的順序?yàn)閿?shù)據(jù)包A、數(shù)據(jù)包B、數(shù)據(jù)包C,而接收數(shù)據(jù)包的順序變成了數(shù)據(jù)包B、數(shù)據(jù)包A、數(shù)據(jù)包C。1.UDP數(shù)據(jù)順序收發(fā)的過程2.UDP數(shù)據(jù)的亂序3.UDP亂序的對策1.UDP數(shù)據(jù)順序收發(fā)的過程2.UDP數(shù)據(jù)的亂序UDP的數(shù)據(jù)包在網(wǎng)絡(luò)上傳輸?shù)臅r候,有可能造成數(shù)據(jù)的順序更改,接收方的數(shù)據(jù)順序和發(fā)送方的數(shù)據(jù)順序發(fā)生了顛倒。這主要是由于路由的不同和路由的存儲轉(zhuǎn)發(fā)的順序不同造成的。路由器的存儲轉(zhuǎn)發(fā)可能造成數(shù)據(jù)順序的更改。3.UDP亂序的對策對于亂序的解決方法可以采用發(fā)送端在數(shù)據(jù)段中加入數(shù)據(jù)報(bào)序號的方法,這樣接收端對接收到數(shù)據(jù)的頭端進(jìn)行簡單地處理就可以重新獲得原始順序的數(shù)據(jù)。10.4.3UDP協(xié)議中的connect()函數(shù)connect()函數(shù)在TCP協(xié)議中會發(fā)生三次握手,建立一個持續(xù)的連接,一般不用于UDP。在UDP協(xié)議中使用connect()函數(shù)的作用僅僅表示確定了另一方的地址,并沒有其他的含義。04
connect(s,to,sizeof(*to));
/*連接*/10.4.4UDP缺乏流量控制UDP協(xié)議沒有TCP協(xié)議所具有的滑動窗口概念,接收數(shù)據(jù)的時候直接將數(shù)據(jù)放到緩沖區(qū)中。如果用戶沒有及時地從緩沖區(qū)中將數(shù)據(jù)復(fù)制出來,后面到來的數(shù)據(jù)會接著向緩沖區(qū)中放入。當(dāng)緩沖區(qū)滿的時候,后面到來的數(shù)據(jù)會覆蓋之前的數(shù)據(jù)造成數(shù)據(jù)的丟失。1.UDP缺乏流量控制概念2.緩沖區(qū)溢出對策1.UDP缺乏流量控制概念2.緩沖區(qū)溢出對策解決UDP接收緩沖區(qū)溢出的現(xiàn)象需要根據(jù)實(shí)際情況確定,一般可以用增大接收數(shù)據(jù)緩沖區(qū)和接收方接收單獨(dú)處理的方法來解決局部的UDP數(shù)據(jù)接收緩沖區(qū)溢出問題。02
#defineNUM_DATA100
/*接收緩沖區(qū)數(shù)量*/11
for(i=0;i<NUM_DATA;i++)
/*循環(huán)發(fā)送*/12
{...17
}10.4.5UDP協(xié)議中的外出網(wǎng)絡(luò)接口在網(wǎng)絡(luò)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度國防軍事訓(xùn)練合作合同范本
- 玉溪2025年云南玉溪市第二幼兒園龍湖園區(qū)招聘編制外人員筆試歷年參考題庫附帶答案詳解
- 漯河2024年河南漯河市沙澧河建設(shè)運(yùn)行保障中心人才引進(jìn)5人筆試歷年參考題庫附帶答案詳解
- 湖南2025年湖南農(nóng)業(yè)大學(xué)招聘58人筆試歷年參考題庫附帶答案詳解
- 河南2025年河南省醫(yī)學(xué)科學(xué)院電生理研究所招聘20人筆試歷年參考題庫附帶答案詳解
- 池州2024年安徽池州學(xué)院招聘事業(yè)編制黨政管理崗筆試歷年參考題庫附帶答案詳解
- 杭州浙江杭州市臨平區(qū)沾橋中學(xué)招聘2024學(xué)年第二學(xué)期臨時聘用教師筆試歷年參考題庫附帶答案詳解
- 2025年中國塑料鏈條市場調(diào)查研究報(bào)告
- 2025年金融查詢機(jī)外殼項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國非離子表面活性劑行業(yè)投資前景及策略咨詢研究報(bào)告
- 《鍋爐安全培訓(xùn)》課件
- 中國移動骨干光傳輸網(wǎng)介紹
- 室內(nèi)設(shè)計(jì)現(xiàn)場測量總結(jié)
- 《避孕藥具知識培訓(xùn)》課件
- 特教教師的教育科研
- 員工調(diào)崗調(diào)薪申請表
- 中心靜脈壓測量技術(shù)-中華護(hù)理學(xué)會團(tuán)體標(biāo)準(zhǔn)2023
- 項(xiàng)目考勤表(模板)
- 防呆防錯十大原理及案例分析
- 《我是班級的主人翁》的主題班會
- 產(chǎn)品報(bào)價(jià)單(5篇)
評論
0/150
提交評論