udp伺服器的實現與tcp之間是很有差別的,下面我們來說要注意的幾點:
①、首先、需要呼叫socket建立套接字 ,socket函式的引數與tcp呼叫時有點不一樣,udp是資料報傳輸,所以傳輸的型別是要改為sock_dgram,也就是socket函式的第二個引數需要更改;
②、呼叫bind來繫結伺服器,所以我們需要 知道的伺服器的ip與埠號;
③、udp伺服器不需要進行三次握手來建立鏈結,所以不需要設定監聽狀態;
④、繫結之後可以直接進行讀寫;(udp通訊的讀寫方式不是使用read、write);
引數socket表示的是當前的socketsynopsis
#include #include ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
引數buf表示的是接受到資料指標;
引數flags預設預設 0;
引數addr為輸入輸出型引數,輸出的是傳送方的協議位址。
引數addrlen為輸入輸出型引數,填寫的是addr的大小。
引數socket表示的是當前的socket#include #include ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
引數buf表示的是到資料指標;
引數flags預設預設 0;
引數addr為輸入輸出型引數,填寫的傳送方的協議位址。
引數addrlen為輸入輸出型引數,填寫的是addr的大小。
伺服器**:
客戶端實現**:#include#include#include#include#include#include#include//實現udp伺服器
static void usage(const char * proc )
int main(int argc ,char * argv)
//建立套接字 套接字引數 資料傳輸型別為資料報傳輸 sock_dgrm
int sockfd =socket(af_inet,sock_dgram,0);
if(sockfd < 0)
//當然作為伺服器本身就是一對多的,所以需要繫結ip與埠
struct sockaddr_in local;
local.sin_family = af_inet;
local.sin_port = htons(atoi(argv[2]));
local.sin_addr.s_addr = inet_addr(argv[1]);
//繫結埠 與ip
if(bind(sockfd,(struct sockaddr*)&local,sizeof(local)) < 0 )
//繫結成功之後不需要設定為監聽狀態,因為udp是不可靠傳輸的,所以不需要建立鏈結也就不需要儲存鏈結
char buf[1024];
while(1)
else if(s == 0)
{}else
}close(sockfd);
return 0;
}
#include#include#include#include#include#include#includestatic void usage(const char * proc )
int main(int argc ,char * argv)
//建立udp套接字 ,傳輸型別為sock_dgram
int sockfd =socket(af_inet,sock_dgram,0);
if(sockfd < 0)
//建立成功
char buf[1024];
printf("please enter\n");
while(1)
buf[s-1] = 0;
//給定接受方的協議位址
struct sockaddr_in peer;
peer.sin_family = af_inet;
peer.sin_port = htons(atoi(argv[2]));
peer.sin_addr.s_addr = inet_addr(argv[1]);
//想伺服器傳送資料
if(sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&peer,sizeof(peer)) < 0)
struct sockaddr_in server;
socklen_t len = sizeof(server);
//接受伺服器的資料
s = recvfrom(sockfd,buf,sizeof(buf)-1,0,(struct sockaddr*)&server,&len);
//接受失敗
if(s<0 )
//接受到檔案結尾 表示 伺服器關閉
else if(s == 0)
//將受到的資料放到顯示器上
else
}close(sockfd);
return 0;
}
傳輸層無法保證資料的可靠傳輸,只能通過應用層來實現了。實現的方式可以參照tcp可靠性傳輸的方式,只是實現不在傳輸層,實現轉移到了應用層。
實現確認機制、重傳機制、視窗確認機制。
如果你不利用linux協議棧以及上層socket機制,自己通過抓包和發包的方式去實現可靠性傳輸,那麼必須實現如下功能:
傳送:包的分片、包確認、包的重發
接收:包的調序、包的序號確認
目前有如下開源程式利用udp實現了可靠的資料傳輸。分別為rudp、rtp、udt。
【rudp】
rudp 提供一組資料服務質量增強機制,如擁塞控制的改進、重發機制及淡化伺服器演算法等,從而在包丟失和網路擁塞的情況下, rtp 客戶機(實時位置)面前呈現的就是乙個高質量的 rtp 流。在不干擾協議的實時特性的同時,可靠 udp 的擁塞控制機制允許 tcp 方式下的流控制行為。
【rtp】
【udt】
基於udp的資料傳輸協議(udp-baseddata transfer protocol,簡稱udt)是一種網際網路資料傳輸協議。udt的主要目的是支援高速廣域網上的海量資料傳輸,而網際網路上的標準資料傳輸協議tcp在高頻寬長距離網路上效能很差。顧名思義,udt建於udp之上,並引入新的擁塞控制和資料可靠性控制機制。udt是面向連線的雙向的應用層協議。它同時支援可靠的資料流傳輸和部分可靠的資料報傳輸。由於udt完全在udp上實現,它也可以應用在除了高速資料傳輸之外的其它應用領域,例如點到點技術(p2p),防火牆穿透,多**資料傳輸等等。
因專案中的需要,現在詳細分析一下udt是如何通過udp實現資料的可靠傳輸。通過閱讀原始碼的方式。
UDP套接字 C實現
介紹套接字 套接字是網際網路使用者層的介面,可以實現不同終端間的資料傳遞 在c中套接字的各種函式和資料結構分布在很多庫里,在此不詳細說每乙個函式在哪個庫中,使用到的程式中使用到套接字的函式都包括在以下庫中 include include include include include 執行環境 執行...
c 實現tcp伺服器 TCP套接字 C實現
udp套接字的介紹見另一篇文章 這篇文章已經介紹了很多基礎的巢狀字的函式,在這裡不做贅述,這篇實驗報告,只介紹udp中沒有的函式 實際上套接字是網際網路應用程式的介面,可以把它理解為你辦公室的門 當你想從你的辦公室給同事傳遞訊息時,你住需要把信放在門口,然後會有人 傳輸層等 會把信放到你的同事的門口...
UDP伺服器的實現
udp是一種面向無連線的不可靠傳輸協議,有處理速度快 消耗資源小的特點。好奇udp通訊怎麼實現併發服務。tcp可以通過監聽服務,建立新的會話,實現併發 udp沒有這種監聽機制,如何實現併發?其實,udp本身就可連線多個客戶端。udp是不區分客戶端,也不需要等待客戶端的連線請求。這樣就不用併發處理了。...