久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
Linux下的UDP協(xié)議編程
[打印本頁]
作者:
51黑tt
時間:
2016-3-5 17:42
標(biāo)題:
Linux下的UDP協(xié)議編程
Linux下的UDP協(xié)議編程
介紹UDP協(xié)議,并提供一個適用于客戶端和服務(wù)器端的實例子程序。
關(guān)鍵詞:Linux;UDP協(xié)議;TCP/IP協(xié)議;程序設(shè)計
UDP Protocol Program Based on Linux
LIU Chang, PENG Chuwu
(School of Electrical Engineering, Hunan University, Changsha 410082,China)
Key words: Linux; UDP protocol; TCP/IP protocol; programming
UDP(User Datagram Protocol)是一個面向數(shù)據(jù)報的簡單傳輸層協(xié)議,它為應(yīng)用程序發(fā)送和接收數(shù)據(jù)報。它是一種無連接協(xié)議,即它不像TCP那樣需要建立服務(wù)器與客戶端的連接才可以工作。
UDP是個很簡單的協(xié)議,它建立在IP協(xié)議之上,利用IP數(shù)據(jù)報提供一種無連接的高效率的服務(wù)。它不保證數(shù)據(jù)的可靠,不進行重傳,時延較短,很適用實時性要求高而不需要數(shù)據(jù)絕對可靠的應(yīng)用。在網(wǎng)絡(luò)通信質(zhì)量較好的情況下,UDP體現(xiàn)出高效率,這適合于傳送少量報文的應(yīng)用,其可靠性由應(yīng)用程序來保證,如:接收信號后向源方返回一個回響,超時重發(fā)、數(shù)據(jù)檢驗等功能需應(yīng)用程序來實現(xiàn)。UDP不提供流控制,它按發(fā)送方的速率發(fā)送數(shù)據(jù),而不管接收方的緩存區(qū)大小,這樣容易造成溢出錯誤。由于UDP不存在客戶端與服務(wù)器的連接,它可用同一個套接字向不同的目標(biāo)發(fā)送數(shù)據(jù)報;同樣,UDP可以是雙向的,所以也可通過同一個套接字從幾個不同的發(fā)送源接收數(shù)據(jù)報。?
linux系統(tǒng)是通過套接字來進行網(wǎng)絡(luò)編程的。下面介紹幾個UDP數(shù)據(jù)報編程用到的基本套接字函數(shù):
網(wǎng)絡(luò)程序通過socket和其他幾個函數(shù)調(diào)用,會返回一個用于通信的套接字描述符。Linux應(yīng)用程序在執(zhí)行任何形式的I/O的時候,程序是在讀或者寫一個文件描述符。因此,我們可以將創(chuàng)建的套接字描述符看成普通文件的描述符來操作,并可以通過向套接字描述符讀寫操作實現(xiàn)網(wǎng)絡(luò)之間的數(shù)據(jù)交流,這就是linux設(shè)備無關(guān)性的好處。
(1)int socket(int domain,int type,int protocol)
函數(shù)socket()用于創(chuàng)建一個套接字描述符。參數(shù)domain說明網(wǎng)絡(luò)程序所在的主機采用的通信協(xié)議(AFUNIX和AFINET等)。AFUNIX只能用于單一的UNIX系統(tǒng)進程間通信,而AFINET是針對Internet的,因而可以允許在遠程主機之間通信。一般把它賦為AFINET。參數(shù)type指明創(chuàng)建的套接字類型,對應(yīng)的參數(shù)值為SOCKDGRAM:數(shù)據(jù)報套接字,表明用的是UDP協(xié)議,提供無序的、不可靠的、無連接的通信。參數(shù)protocol,由于指定了type,所以這里一般只要用0來代替即可。?
socket()得到套接字描述符,為網(wǎng)絡(luò)通信做基本的準(zhǔn)備工作,調(diào)用成功時將返回文件描述符,失敗時將返回-1,通過查看error文件可以知道有關(guān)出錯的詳細信息。
(2)int bind(int sockfd,struct sockaddr*myaddr,int addrlen)
得到套接字描述符后,將套接口和機器上的一定的端口號綁定在一起。sockfd是調(diào)用socket函數(shù)返回的文件描述符;addrlen是sockaddr結(jié)構(gòu)的長度:myaddr是一個指向sockaddr結(jié)構(gòu)的指針,它保存著本地套接字的地址(即端口和IP地址)信息。不過由于系統(tǒng)兼容性的問題,一般不使用這個結(jié)構(gòu),而使用另外一個結(jié)構(gòu)(struct sockaddrin)來代替。bind()函數(shù)在成功被調(diào)用時返回0,如果出錯返回-1。
結(jié)構(gòu)類型struct sockaddrin保存著套接口的地址信息,定義如下:
struct sockaddrin{short int sinfamily;/*地址族*/
unsigned short int sinport;/*端口號*/
struct inaddr sinaddr;/*IP地址*/
unsigned char sinzero[8];}/*填充0以保持與struct sockaddr同樣大小*/
這個數(shù)據(jù)結(jié)構(gòu)使得使用其中的各個元素更為方便,sinzero(它用來將sockaddrin結(jié)構(gòu)填充到與sockaddr結(jié)構(gòu)同樣的長度)應(yīng)該用bzero()或memset()函數(shù)將其置為0。另外,一個指向sockaddrin數(shù)據(jù)結(jié)構(gòu)的指針可以強行轉(zhuǎn)換為一個指向數(shù)據(jù)結(jié)構(gòu)sockaddr的指針,反之亦然。
(3)int close(int sockfd)
函數(shù)close用來關(guān)閉一個套接字描述符,參數(shù)sockfd為指定要關(guān)閉的套接字描述符,函數(shù)close()在成功執(zhí)行時返回0,否則返回-1。
以上三個函數(shù)中,前兩個要包含頭文件#include〈sys/types.h〉和#include〈sys/socket.h〉,后一個包含#include〈unistd.h〉。再介紹兩個用于UDP協(xié)議的接收和發(fā)送函數(shù),包含頭文件#include〈sys/socket.h〉:
int sendto(int sockfd,const void*msg,int len,unsigned int flags,struct
3利用UDP數(shù)據(jù)報編程
UDP協(xié)議有自己的通信模型。首先由UDP服務(wù)器調(diào)用函數(shù)socket創(chuàng)建一個數(shù)據(jù)報類型的套接字,然后服務(wù)器調(diào)用bind函數(shù)綁定在一個默認的UDP端口上,接著調(diào)用函數(shù)recvfrom在指定的端口上等待UDP客戶機數(shù)據(jù)報的到來。而UDP客戶機首先也調(diào)用函數(shù)socket創(chuàng)建一個數(shù)據(jù)報類型的套接字,然后調(diào)用函數(shù)sendto向UDP服務(wù)器發(fā)送數(shù)據(jù)報。需要注意的是,UDP客戶機應(yīng)用程序通常不需要調(diào)用函數(shù)bind將套接字綁定到某個固定的端口,linux操作系統(tǒng)會為進程分配一個空閑的端口號。UDP服務(wù)器進程接收到客戶機發(fā)來的數(shù)據(jù)報后,將從recvfrom函數(shù)中返回,對數(shù)據(jù)報進行相關(guān)處理后,再調(diào)用sendto函數(shù)將結(jié)果返回到客戶端。
通常,客戶端的設(shè)計和實現(xiàn)比服務(wù)器端的要容易一些,典型的UDP服務(wù)器與操作系統(tǒng)進行交互作用,而且大多數(shù)需要同時處理多個客戶。一個UDP客戶機啟動后直接與單個服務(wù)器通信,然后就結(jié)束了。而對于服務(wù)器來說,它啟動后處于休眠狀態(tài),等待客戶請求的到來。當(dāng)客戶數(shù)據(jù)報到達時,服務(wù)器蘇醒過來,數(shù)據(jù)報中可能包含來自客戶的某種形式的請求消息。一個基本的UDP通信過程如圖1所示。
4結(jié)束語
本文介紹了UDP套接字的通信機制。UDP是一個面向數(shù)據(jù)報的簡單傳輸層協(xié)議。建議網(wǎng)絡(luò)環(huán)境好,要求資源少的采用UDP,如很多實時系統(tǒng)一般采用UDP協(xié)議進行數(shù)據(jù)的網(wǎng)絡(luò)傳輸。如果需要對接收的UDP數(shù)據(jù)報進行排序和流量控制,并保證數(shù)據(jù)報的可靠性, 則必須在應(yīng)用程序中增加一些控制機制。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产探花在线精品一区二区
|
精品亚洲永久免费精品
|
成人一级视频在线观看
|
成人午夜视频在线观看
|
在线免费观看欧美
|
狠狠ri
|
国产综合网站
|
欧美天堂
|
亚洲成人免费视频
|
日本 欧美 国产
|
欧美中文字幕一区二区三区亚洲
|
九九色综合
|
精品中文视频
|
亚洲美女一区
|
91高清在线观看
|
成人高清视频在线观看
|
国产日产精品一区二区三区四区
|
蜜月va乱码一区二区三区
|
国产免费让你躁在线视频
|
精品久久久久久亚洲综合网站
|
亚洲一区二区三区免费观看
|
亚洲一区二区三区四区五区中文
|
手机在线观看av
|
91看国产
|
亚洲欧美日韩电影
|
国产精品视频一区二区三
|
久久精品日产第一区二区三区
|
久久久久国产
|
亚洲精品乱
|
综合久久久久久久
|
国产福利视频网站
|
精品欧美乱码久久久久久
|
成人在线免费网站
|
波多野结衣一区二区三区
|
国产乱码精品一区二区三区五月婷
|
天天天天操
|
麻豆一区二区三区精品视频
|
成人免费观看网站
|
亚洲国产高清免费
|
污污的网站在线观看
|
国产精品久久久久久久久久久新郎
|