套接字實現Udp伺服器

2021-08-03 13:22:06 字數 3560 閱讀 4349

udp伺服器的實現與tcp之間是很有差別的,下面我們來說要注意的幾點:

①、首先、需要呼叫socket建立套接字 ,socket函式的引數與tcp呼叫時有點不一樣,udp是資料報傳輸,所以傳輸的型別是要改為sock_dgram,也就是socket函式的第二個引數需要更改;

②、呼叫bind來繫結伺服器,所以我們需要 知道的伺服器的ip與埠號;

③、udp伺服器不需要進行三次握手來建立鏈結,所以不需要設定監聽狀態;

④、繫結之後可以直接進行讀寫;(udp通訊的讀寫方式不是使用read、write);

synopsis

#include #include ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,

struct sockaddr *src_addr, socklen_t *addrlen);

引數socket表示的是當前的socket

引數buf表示的是接受到資料指標;

引數flags預設預設 0;

引數addr為輸入輸出型引數,輸出的是傳送方的協議位址。

引數addrlen為輸入輸出型引數,填寫的是addr的大小。

#include #include ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,

const struct sockaddr *dest_addr, socklen_t addrlen);

引數socket表示的是當前的socket

引數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是不區分客戶端,也不需要等待客戶端的連線請求。這樣就不用併發處理了。...