久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1404|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

Linux下的UDP協(xié)議編程

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:107189 發(fā)表于 2016-3-5 17:42 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
Linux下的UDP協(xié)議編程
介紹UDP協(xié)議,并提供一個(gè)適用于客戶(hù)端和服務(wù)器端的實(shí)例子程序。
  關(guān)鍵詞:Linux;UDP協(xié)議;TCP/IP協(xié)議;程序設(shè)計(jì)
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)是一個(gè)面向數(shù)據(jù)報(bào)的簡(jiǎn)單傳輸層協(xié)議,它為應(yīng)用程序發(fā)送和接收數(shù)據(jù)報(bào)。它是一種無(wú)連接協(xié)議,即它不像TCP那樣需要建立服務(wù)器與客戶(hù)端的連接才可以工作。
  UDP是個(gè)很簡(jiǎn)單的協(xié)議,它建立在IP協(xié)議之上,利用IP數(shù)據(jù)報(bào)提供一種無(wú)連接的高效率的服務(wù)。它不保證數(shù)據(jù)的可靠,不進(jìn)行重傳,時(shí)延較短,很適用實(shí)時(shí)性要求高而不需要數(shù)據(jù)絕對(duì)可靠的應(yīng)用。在網(wǎng)絡(luò)通信質(zhì)量較好的情況下,UDP體現(xiàn)出高效率,這適合于傳送少量報(bào)文的應(yīng)用,其可靠性由應(yīng)用程序來(lái)保證,如:接收信號(hào)后向源方返回一個(gè)回響,超時(shí)重發(fā)、數(shù)據(jù)檢驗(yàn)等功能需應(yīng)用程序來(lái)實(shí)現(xiàn)。UDP不提供流控制,它按發(fā)送方的速率發(fā)送數(shù)據(jù),而不管接收方的緩存區(qū)大小,這樣容易造成溢出錯(cuò)誤。由于UDP不存在客戶(hù)端與服務(wù)器的連接,它可用同一個(gè)套接字向不同的目標(biāo)發(fā)送數(shù)據(jù)報(bào);同樣,UDP可以是雙向的,所以也可通過(guò)同一個(gè)套接字從幾個(gè)不同的發(fā)送源接收數(shù)據(jù)報(bào)。?
  linux系統(tǒng)是通過(guò)套接字來(lái)進(jìn)行網(wǎng)絡(luò)編程的。下面介紹幾個(gè)UDP數(shù)據(jù)報(bào)編程用到的基本套接字函數(shù):
  網(wǎng)絡(luò)程序通過(guò)socket和其他幾個(gè)函數(shù)調(diào)用,會(huì)返回一個(gè)用于通信的套接字描述符。Linux應(yīng)用程序在執(zhí)行任何形式的I/O的時(shí)候,程序是在讀或者寫(xiě)一個(gè)文件描述符。因此,我們可以將創(chuàng)建的套接字描述符看成普通文件的描述符來(lái)操作,并可以通過(guò)向套接字描述符讀寫(xiě)操作實(shí)現(xiàn)網(wǎng)絡(luò)之間的數(shù)據(jù)交流,這就是linux設(shè)備無(wú)關(guān)性的好處。
  (1)int socket(int domain,int type,int protocol)
  函數(shù)socket()用于創(chuàng)建一個(gè)套接字描述符。參數(shù)domain說(shuō)明網(wǎng)絡(luò)程序所在的主機(jī)采用的通信協(xié)議(AFUNIX和AFINET等)。AFUNIX只能用于單一的UNIX系統(tǒng)進(jìn)程間通信,而AFINET是針對(duì)Internet的,因而可以允許在遠(yuǎn)程主機(jī)之間通信。一般把它賦為AFINET。參數(shù)type指明創(chuàng)建的套接字類(lèi)型,對(duì)應(yīng)的參數(shù)值為SOCKDGRAM:數(shù)據(jù)報(bào)套接字,表明用的是UDP協(xié)議,提供無(wú)序的、不可靠的、無(wú)連接的通信。參數(shù)protocol,由于指定了type,所以這里一般只要用0來(lái)代替即可。?
  socket()得到套接字描述符,為網(wǎng)絡(luò)通信做基本的準(zhǔn)備工作,調(diào)用成功時(shí)將返回文件描述符,失敗時(shí)將返回-1,通過(guò)查看error文件可以知道有關(guān)出錯(cuò)的詳細(xì)信息。
  (2)int bind(int sockfd,struct sockaddr*myaddr,int addrlen)
  得到套接字描述符后,將套接口和機(jī)器上的一定的端口號(hào)綁定在一起。sockfd是調(diào)用socket函數(shù)返回的文件描述符;addrlen是sockaddr結(jié)構(gòu)的長(zhǎng)度:myaddr是一個(gè)指向sockaddr結(jié)構(gòu)的指針,它保存著本地套接字的地址(即端口和IP地址)信息。不過(guò)由于系統(tǒng)兼容性的問(wèn)題,一般不使用這個(gè)結(jié)構(gòu),而使用另外一個(gè)結(jié)構(gòu)(struct sockaddrin)來(lái)代替。bind()函數(shù)在成功被調(diào)用時(shí)返回0,如果出錯(cuò)返回-1。
  結(jié)構(gòu)類(lèi)型struct sockaddrin保存著套接口的地址信息,定義如下:
  struct sockaddrin{short int sinfamily;/*地址族*/
  unsigned short int sinport;/*端口號(hào)*/
  struct inaddr sinaddr;/*IP地址*/
  unsigned char sinzero[8];}/*填充0以保持與struct sockaddr同樣大小*/
  這個(gè)數(shù)據(jù)結(jié)構(gòu)使得使用其中的各個(gè)元素更為方便,sinzero(它用來(lái)將sockaddrin結(jié)構(gòu)填充到與sockaddr結(jié)構(gòu)同樣的長(zhǎng)度)應(yīng)該用bzero()或memset()函數(shù)將其置為0。另外,一個(gè)指向sockaddrin數(shù)據(jù)結(jié)構(gòu)的指針可以強(qiáng)行轉(zhuǎn)換為一個(gè)指向數(shù)據(jù)結(jié)構(gòu)sockaddr的指針,反之亦然。
  (3)int close(int sockfd)
  函數(shù)close用來(lái)關(guān)閉一個(gè)套接字描述符,參數(shù)sockfd為指定要關(guān)閉的套接字描述符,函數(shù)close()在成功執(zhí)行時(shí)返回0,否則返回-1。
  以上三個(gè)函數(shù)中,前兩個(gè)要包含頭文件#include〈sys/types.h〉和#include〈sys/socket.h〉,后一個(gè)包含#include〈unistd.h〉。再介紹兩個(gè)用于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ù)報(bào)編程
  UDP協(xié)議有自己的通信模型。首先由UDP服務(wù)器調(diào)用函數(shù)socket創(chuàng)建一個(gè)數(shù)據(jù)報(bào)類(lèi)型的套接字,然后服務(wù)器調(diào)用bind函數(shù)綁定在一個(gè)默認(rèn)的UDP端口上,接著調(diào)用函數(shù)recvfrom在指定的端口上等待UDP客戶(hù)機(jī)數(shù)據(jù)報(bào)的到來(lái)。而UDP客戶(hù)機(jī)首先也調(diào)用函數(shù)socket創(chuàng)建一個(gè)數(shù)據(jù)報(bào)類(lèi)型的套接字,然后調(diào)用函數(shù)sendto向UDP服務(wù)器發(fā)送數(shù)據(jù)報(bào)。需要注意的是,UDP客戶(hù)機(jī)應(yīng)用程序通常不需要調(diào)用函數(shù)bind將套接字綁定到某個(gè)固定的端口,linux操作系統(tǒng)會(huì)為進(jìn)程分配一個(gè)空閑的端口號(hào)。UDP服務(wù)器進(jìn)程接收到客戶(hù)機(jī)發(fā)來(lái)的數(shù)據(jù)報(bào)后,將從recvfrom函數(shù)中返回,對(duì)數(shù)據(jù)報(bào)進(jìn)行相關(guān)處理后,再調(diào)用sendto函數(shù)將結(jié)果返回到客戶(hù)端。
  通常,客戶(hù)端的設(shè)計(jì)和實(shí)現(xiàn)比服務(wù)器端的要容易一些,典型的UDP服務(wù)器與操作系統(tǒng)進(jìn)行交互作用,而且大多數(shù)需要同時(shí)處理多個(gè)客戶(hù)。一個(gè)UDP客戶(hù)機(jī)啟動(dòng)后直接與單個(gè)服務(wù)器通信,然后就結(jié)束了。而對(duì)于服務(wù)器來(lái)說(shuō),它啟動(dòng)后處于休眠狀態(tài),等待客戶(hù)請(qǐng)求的到來(lái)。當(dāng)客戶(hù)數(shù)據(jù)報(bào)到達(dá)時(shí),服務(wù)器蘇醒過(guò)來(lái),數(shù)據(jù)報(bào)中可能包含來(lái)自客戶(hù)的某種形式的請(qǐng)求消息。一個(gè)基本的UDP通信過(guò)程如圖1所示。

 
 
 
4結(jié)束語(yǔ)
  本文介紹了UDP套接字的通信機(jī)制。UDP是一個(gè)面向數(shù)據(jù)報(bào)的簡(jiǎn)單傳輸層協(xié)議。建議網(wǎng)絡(luò)環(huán)境好,要求資源少的采用UDP,如很多實(shí)時(shí)系統(tǒng)一般采用UDP協(xié)議進(jìn)行數(shù)據(jù)的網(wǎng)絡(luò)傳輸。如果需要對(duì)接收的UDP數(shù)據(jù)報(bào)進(jìn)行排序和流量控制,并保證數(shù)據(jù)報(bào)的可靠性, 則必須在應(yīng)用程序中增加一些控制機(jī)制。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 九九久久精品视频 | 国产成人综合av | 久久久蜜桃一区二区人 | 免费在线一区二区 | 日韩精品免费一区 | 97视频成人| 日韩欧美国产一区二区三区 | 日日爽 | 国产伦精品一区二区三区照片91 | 精品一区二区在线观看 | 亚洲国产精品suv | 午夜影视免费片在线观看 | 色毛片 | av在线影院 | 99影视| 成人在线电影网站 | 国产精品久久久久久久久久久久冷 | 国产成人精品一区二区三区在线 | 婷婷久久精品一区二区 | www.嫩草| 91精品国产综合久久久久久漫画 | 在线精品国产 | 国产精品久久精品 | av天天干| 美女天天操 | 日韩最新网址 | 成人一区在线观看 | 精品国产乱码久久久久久果冻传媒 | 中文字幕免费视频 | 国产一二三区免费视频 | 精品国产乱码久久久久久果冻传媒 | 亚洲成人一区二区 | 中文字幕不卡在线88 | 一区二区在线不卡 | 欧美一级片在线观看 | 99精品观看| www.久久久.com | 国产乱人伦精品一区二区 | 免费三级av| 91综合网| 日韩综合一区 |