linux高級編程08-網(wǎng)絡(luò)udp_第1頁
linux高級編程08-網(wǎng)絡(luò)udp_第2頁
linux高級編程08-網(wǎng)絡(luò)udp_第3頁
linux高級編程08-網(wǎng)絡(luò)udp_第4頁
linux高級編程08-網(wǎng)絡(luò)udp_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Linux網(wǎng)絡(luò)UDPTCP/IP網(wǎng)絡(luò)簡介TCPIP參考模型是計算機(jī)網(wǎng)絡(luò)的始祖,它首先提出了網(wǎng)絡(luò)分層的概念。它一共分為4層:網(wǎng)絡(luò)接口層、互聯(lián)網(wǎng)層、傳輸層和應(yīng)用層,其參考模型如圖 :應(yīng)用層互聯(lián)網(wǎng)層傳輸層網(wǎng)絡(luò)接口層它主要實(shí)現(xiàn)將上層傳下來的數(shù)據(jù)包封裝成底層物理網(wǎng)絡(luò)支持的數(shù)據(jù)格式,并轉(zhuǎn)換成真正的電氣信號而在物理網(wǎng)絡(luò)上傳輸。它的功能是使主機(jī)能夠把分組發(fā)往任何網(wǎng)絡(luò),并使各分組獨(dú)立地到達(dá)目標(biāo) .主要功能是使源端和目的端上的對等實(shí)體可以進(jìn)行對話。 應(yīng)用層協(xié)議建立在網(wǎng)絡(luò)層協(xié)議之上,專門用于為用戶提供應(yīng)用服務(wù),一般是可見的。 OSI參考模型與TCP/IP參考模型應(yīng)用層表示層會話層傳輸層網(wǎng)絡(luò)層數(shù)據(jù)鏈路層物理層應(yīng)用層傳

2、輸層網(wǎng)絡(luò)層網(wǎng)絡(luò)接口層OSI參考模型TCP/IP參考模型OSI參考模型與TCP/IP參考模型對應(yīng)關(guān)系TCP/IP協(xié)議族TCP/IP 實(shí)際上一個一起工作的通信家族,為網(wǎng)際數(shù)據(jù)通信提供通路。為討論方便可將TCP/IP 協(xié)議組大體上分為三部分:1Internet 協(xié)議(IP)2傳輸控制協(xié)議(TCP)和用戶數(shù)據(jù)報文協(xié)議(UDP)3處于TCP 和UDP 之上的一組協(xié)議專門開發(fā)的應(yīng)用程序。它們包括:TELNET,文件傳送協(xié)議(FTP),域名服務(wù)(DNS)和簡單的郵件傳送程序(SMTP)等許多協(xié)議。網(wǎng)絡(luò)層第一部分也稱為網(wǎng)絡(luò)層。包括Internet 協(xié)議(IP)、網(wǎng)際控制報文協(xié)議(ICMP)和地址識別協(xié)議(AR

3、P). Internet 協(xié)議(IP)該協(xié)議被設(shè)計成互聯(lián)分組交換通信網(wǎng),以形成一個網(wǎng)際通信環(huán)境。它負(fù)責(zé)在源主機(jī)和目的地主機(jī)之間傳輸來自其較高層軟件的稱為數(shù)據(jù)報文的數(shù)據(jù)塊,它在源和目的地之間提供非連接型傳遞服務(wù)。 網(wǎng)際控制報文協(xié)議(ICMP)它實(shí)際上不是IP層部分,但直接同IP層一起工作,報告網(wǎng)絡(luò)上的某些出錯情況。允許網(wǎng)際路由器傳輸差錯信息或測試報文。 地址識別協(xié)議(ARP)ARP 實(shí)際上不是網(wǎng)絡(luò)層部分,它處于IP和數(shù)據(jù)鏈路層之間,它是在32位IP地址和48位局域網(wǎng)物理地址之間執(zhí)行翻譯的協(xié)議。傳輸層第二部分是傳輸層協(xié)議。包括傳輸控制協(xié)議和用戶數(shù)據(jù)報文協(xié)議。 傳輸控制協(xié)議(TCP)。由于IP 提供

4、非連接型傳遞服務(wù),因此TCP應(yīng)為應(yīng)用程序存取網(wǎng)絡(luò)創(chuàng)造了條件,使用可靠的面向連接的傳輸層服務(wù)。該協(xié)議為建立網(wǎng)際上用戶進(jìn)程之間的對話負(fù)責(zé)。此外,還確保兩個以上進(jìn)程之間的可靠通信。它所提供的功能如下。1監(jiān)聽輸入對話建立請求。2請求另一網(wǎng)絡(luò)站點(diǎn)對話。3可靠的發(fā)送和接收數(shù)據(jù)。4適度的關(guān)閉對話。傳輸層用戶數(shù)據(jù)報文協(xié)議(UDP)UDP 提供不可靠的非連接型傳輸層服務(wù),它允許在源和目的地站點(diǎn)之間傳送數(shù)據(jù),而不必在傳送數(shù)據(jù)之前建立對話。此外,該協(xié)議還不使用TCP使用的端對端差錯校驗(yàn)。當(dāng)使用UDP時,傳輸層功能全都發(fā)揮,而開銷卻比較低。它主要用于那些不要求TCP協(xié)議的非連接型的應(yīng)用程序。例如,名字服務(wù)、網(wǎng)絡(luò)管理、

5、視頻點(diǎn)播和網(wǎng)絡(luò)會議等. 在TCPIP模型中,上層功能的實(shí)現(xiàn)要依賴下層提供的服務(wù),如在底層是以太網(wǎng)的TCPIP網(wǎng)絡(luò)體系體系中,IP分組的傳送要封裝在以太網(wǎng)幀中,而TCPUDP包的傳送又是封裝在IP分組的data中實(shí)現(xiàn)的。 以太網(wǎng)幀目的以太網(wǎng)地址destination Ethernet address源以太網(wǎng)地址source Ethernet address協(xié)議protocol數(shù)據(jù)data校驗(yàn)和checksum協(xié)議protocol數(shù)據(jù)data校驗(yàn)和checksum目的IP地址destination IP address源IP地址source IP address長度Lengthl目的端口desti

6、nation port數(shù)據(jù)data序號SEQ應(yīng)答ACK源端口source portIP分組TCP包嵌入式Linux中TCP/IP網(wǎng)絡(luò)結(jié)構(gòu) Linux網(wǎng)絡(luò)層次結(jié)構(gòu)IPTCPUDPTCPSLIPEthernetARPINET套接字BSD套接字網(wǎng)絡(luò)應(yīng)用(network application)用戶內(nèi)核套接字接口協(xié)議層網(wǎng)絡(luò)設(shè)備層 Linux網(wǎng)絡(luò)層次模型 套接字網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)設(shè)備用戶進(jìn)程在Linux操作系統(tǒng)中,socket屬于文件系統(tǒng)的一部分,網(wǎng)絡(luò)通信可以被看做是對文件的讀取。這就使得用戶對網(wǎng)絡(luò)的控制像對文件的控制一樣方便。 套接字接口網(wǎng)絡(luò)的socket數(shù)據(jù)傳輸是一種特殊的IO,socket也是一種文件描

7、述符,它也有類似于對文件操作的函數(shù)調(diào)用,如完成打開、讀寫等操作。 在TCPIP協(xié)議地址族中,按照提供服務(wù)的層次關(guān)系,套接字有BSD和INET之分。BSD套接字接口套接字接口(又簡稱套接口)是為方便開發(fā)人員進(jìn)行TCPIP程序開發(fā),而為TCPIP協(xié)議所開發(fā)的一組應(yīng)用程序接口。由于它最早應(yīng)用于伯克利大學(xué)的BSD UNIX中,所以人們又把它稱為BSD socket(簡稱BSD)。 Linux BSD套接字支持下列套接字類型:Stream Stream(流)套接字提供可靠的雙工順序數(shù)據(jù)流,能保證傳輸過程中數(shù)據(jù)不丟失,不被弄混和復(fù)制。Internet地址中的TCP協(xié)議支持Stream套接字。Datagra

8、mDatagram(數(shù)據(jù)報)套接字提供雙工數(shù)據(jù)傳輸,但與Stream套接字不同,它是不可靠的,不保證信息的到達(dá)。Raw 利用Raw套接字可以直接處理下層協(xié)議(所以叫“Raw”)。 Socket編程基礎(chǔ)客戶機(jī)服務(wù)器模式 在網(wǎng)絡(luò)上大部分的通信都是在客戶機(jī)/服務(wù)器模式下進(jìn)行的,利用socket實(shí)現(xiàn)通信也不例外。在客戶機(jī)服務(wù)器模式中,將請求服務(wù)的一方稱為客戶端,而將提供服務(wù)的一方稱為服務(wù)器端。 socket編程相關(guān)數(shù)據(jù)結(jié)構(gòu) 套接口描述符 一個套接口描述符只是一個整型的數(shù)值,它的定義為int sockfd。(也是一種文件描述符)Socket編程基礎(chǔ)sockaddr數(shù)據(jù)結(jié)構(gòu)sockaddr數(shù)據(jù)結(jié)構(gòu)中保存著

9、套接口的地址信息,它的定義如下:struct sockaddrunsigned short sa_family; /*地址族,定義為AF_XXX*/charsa_data14;/*14字節(jié)的協(xié)議地址*/;sa_family中可以是其他的很多值,但一般把它賦值為“AF_INET”。sa_data則包括一個目的地址和一個端口地址。Sockaddr_in數(shù)據(jù)結(jié)構(gòu)sockaddr_in數(shù)據(jù)結(jié)構(gòu)的定義為:struct sockaddr_inshort int sin_family;/*地址族*/unsigned short int sin_port;/*端口號*/struct in_addr sin_a

10、ddr;/*IP地址*/unsigned char sin_zero8;/*填充0以保持與struct sockaddr 同樣大小*/;這兩個數(shù)據(jù)類型是等效的,可以相互轉(zhuǎn)換,通常使用sockaddr_in更為方便.網(wǎng)絡(luò)字節(jié)順序 因?yàn)槊恳粋€機(jī)器內(nèi)部對變量的字節(jié)存儲順序不同(有的系統(tǒng)是高位在前,底位在后,而有的系統(tǒng)是底位在前,高位在后 ),而網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)大家是一定要統(tǒng)一順序的。htons():表示“Host to Network Short”,把主機(jī)地址字節(jié)順序轉(zhuǎn)向網(wǎng)絡(luò)字節(jié)順序(對短型數(shù)據(jù)操作)。htonl():表示“Host to Network Long”,把主機(jī)地址字節(jié)順序轉(zhuǎn)向網(wǎng)絡(luò)字節(jié)順序

11、(對長型數(shù)據(jù)操作)。ntohs():表示“Network to Host Short”,把網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)向主機(jī)地址字節(jié)順序(對短型數(shù)據(jù)操作)。ntohl():表示“Network to Host Long”,把網(wǎng)絡(luò)字節(jié)順序轉(zhuǎn)向主機(jī)地址字節(jié)順序(對長型數(shù)據(jù)操作)。數(shù)據(jù)報通信 對于數(shù)據(jù)報通信的服務(wù)器端來說,它不必再在一個端口上偵聽,以等待建立連接,而只需生成一個端口描述符,并且把這個端口描述符綁定到本地地址上就可以了。 阻塞,等待客戶數(shù)據(jù)請求bind()recvfrom()socket()sendto()close()服務(wù)器bind()sendto()recvfrom()socket()close

12、()客戶機(jī)數(shù)據(jù)(請求)數(shù)據(jù)(應(yīng)答)socket通信常用API函數(shù)socket( ) 使用系統(tǒng)調(diào)用socket()來獲得文件描述符,該調(diào)用的聲明格式如下:#include #include int socket(int domain, int type, int protocol);socket函數(shù)說明bind( )一旦有了一個套接口以后,下一步工作就是把套接口綁定到本地計算機(jī)的某一個端口上,但如果只想使用connect()則無此必要。下面是系統(tǒng)調(diào)用bind()的定義:#include #include int bind(int sockfd, struct sockaddr *my_addr,

13、 int addrlen);bind函數(shù)說明connect( )connect()系統(tǒng)調(diào)用由客戶端調(diào)用,它的用法如下:#include #include int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);connect函數(shù)說明sendto()和recvfrom( )因?yàn)閿?shù)據(jù)報套接口是無連接的,它并不連接到遠(yuǎn)程的主機(jī)上,所以在發(fā)送數(shù)據(jù)包之前,必須首先給出目的地址:int sendto(int sockfd, const void *msg, int len, unsigned int flags, const stu

14、ct sockaddr *to, int tolen);int recvfrom(int sockfd, void *buf, int len, unsigned int flags, stuct sockaddr *from, int *fromlen); sendto 函數(shù)說明recvfrom 函數(shù)說明close( )和shutdown( )可以使用close()調(diào)用關(guān)閉連接的套接口文件描述符,它的調(diào)用方式為:close(sockfd);這樣以后就不能再對此套接口進(jìn)行任何的讀寫操作了。使用系統(tǒng)調(diào)用shutdown(),可有更多的控制權(quán)。int shutdown(int sockfd, in

15、t how);第1個參數(shù)是希望切斷通信的套接口文件描述符。第2個參數(shù)how值如下:0:不允許再接收數(shù)據(jù)。1:不允許再發(fā)送數(shù)據(jù)。2:發(fā)送和接收數(shù)據(jù)都不允許。shutdown()調(diào)用如果成功返回0,如果失敗則返回-l。網(wǎng)絡(luò)數(shù)據(jù)報編程/*服務(wù)端程序UDPServer.c*/#include #include #include #include #include #define SERVER_PORT 8888#define MAX_MSG_SIZE 1024void udps_respon(int sockfd) struct sockaddr_in addr; int addrlen,n; cha

16、r msgMAX_MSG_SIZE;網(wǎng)絡(luò)數(shù)據(jù)報編程 while(1) /*等待數(shù)據(jù)請求*/ n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0, (struct sockaddr*)&addr,&addrlen); msgn=0; /*顯示服務(wù)器端已經(jīng)收到了信息*/ fprintf(stdout,I have received %s,msg); /*數(shù)據(jù)回送*/ sendto(sockfd,msg,n,0,(struct sockaddr*)&addr,addrlen); 網(wǎng)絡(luò)數(shù)據(jù)報編程int main(void) int sockfd; struct sockaddr_

17、in addr; sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd0) fprintf(stderr,Socket Error:%sn,strerror(errno); exit(1); 網(wǎng)絡(luò)數(shù)據(jù)報編程 bzero(&addr,sizeof(struct sockaddr_in); addr.sin_family=AF_INET; addr.sin_addr.s_addr=htonl(INADDR_ANY); addr.sin_port=htons(SERVER_PORT); if(bind(sockfd,(struct sockaddr *)&ad

18、dr,sizeof(struct sockaddr_in)0) fprintf(stderr,Bind Error:%sn,strerror(errno); exit(1); udps_respon(sockfd); close(sockfd);網(wǎng)絡(luò)數(shù)據(jù)報編程客戶端/*客戶端程序UDPClient.c,使用方法UDPClient ServerIP ServerPort*/#include #include #include #include #include #include #define MAX_BUF_SIZE 1024void udpc_requ(int sockfd,const st

19、ruct sockaddr_in *addr,int len) char bufferMAX_BUF_SIZE;網(wǎng)絡(luò)數(shù)據(jù)報編程客戶端 int n; while(1) /*從鍵盤讀入,寫到服務(wù)端*/ fgets(buffer,MAX_BUF_SIZE,stdin); sendto(sockfd,buffer,strlen(buffer),0,addr,len); bzero(buffer,MAX_BUF_SIZE); /*從網(wǎng)絡(luò)上讀,寫到屏幕上*/ n=recvfrom(sockfd,buffer,MAX_BUF_SIZE,0,NULL,NULL); buffern=0; fputs(buffer,stdout); 網(wǎng)絡(luò)數(shù)據(jù)報編程客戶端int main(int argc,char *argv) int sockfd,port; struct sockaddr_in addr; if(argc!=3) fprintf(stderr,Usage:%s server_ip server_portn,ar

溫馨提示

  • 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

提交評論