網路 UDP伺服器的實現

2021-08-03 16:49:40 字數 3476 閱讀 2652

(1)利用socket函式建立套接字

(2)伺服器用bind進行ip和埠號的繫結

(3)不需要設定監聽狀態

(4)繫結後直接讀寫

用來資料的接收

#include

#include

int recvfrom(int sockfd, void* buf, ssize_t len, int flags, struct sockaddr* src_addr,socklen_t *addrlen);

sockfd表示當前的套接字

buf表示要接收的資料指標

len表示接收的長度

flags引數設定為0

src_addr表示傳送方的協議位址

addrlen表示src_addr的大小

成功返回0

錯誤返回-1

用來進行資料的傳送

#include

#include

int sendto(int sockfd, void* buf , ssize_t len, int flags, struct sockaddr * src_addr, socklen_t addrlen);

sockfd表示當前的套接字

buf表示要傳送的資料指標

len表示要傳送的資料長度

flags設定為0

src_addr為傳送方的協議位址

addrlen為src_addr的大小

成功返回0

錯誤返回-1

#include#include#include#include#include#include#include#includestatic void usage()

int main(int argc, char* argv)

//建立socket

int sockfd = socket(af_inet,sock_dgram,0);

if(sockfd < 0)

struct sockaddr_in addr;

addr.sin_family = af_inet;

addr.sin_port = htons(atoi(argv[2]));

addr.sin_addr.s_addr = inet_addr(argv[1]);

//進行繫結

if(bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)) < 0)

char buf[1024];

//收發資料

while(1)

else if(s == 0)

else

}close(sockfd);

return 0;

}

#include#include#include#include#include#include#include#include#includestatic usage()

int main(int argc,char* argv)

//建立socket

int sockfd = socket(af_inet,sock_dgram,0);

if(sockfd < 0)

printf("請輸入...\n");

char buf[1024];

//進行寫和讀

while(1)

buf[s-1] = '\0';

//進行傳送

struct sockaddr_in client;

client.sin_family = af_inet;

client.sin_port = htons(atoi(argv[2]));

client.sin_addr.s_addr = inet_addr(argv[1]);

s = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&client,sizeof(client));

if(s < 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)

//正常收到

傳輸層無法保證資料的可靠傳輸,只能通過應用層來實現了。

實現的方式可以參照tcp可靠性傳輸的方式,只是實現不在傳輸層,實現轉移到了應用層。

實現確認機制、重傳機制、視窗確認機制。

除了利用linux協議棧以及上層socket機制之外,自己可以通過抓包和發包的方式去實現可靠性傳輸

需要實現如下功能:

傳送:包的分片、包確認、包的重發

接收:包的調序、包的序號確認

目前有如下開源程式利用udp實現了可靠的資料傳輸

分別為rudp、rtp、udt。

rudp 提供一組資料服務質量增強機制,如擁塞控制的改進、重發機制及淡化伺服器演算法等,從而在包丟失和網路擁塞的情況下, rtp 客戶機(實時位置)面前呈現的就是乙個高質量的 rtp 流。

在不干擾協議的實時特性的同時,可靠 udp 的擁塞控制機制允許 tcp 方式下的流控制行為。

應用程式通常在 udp 上執行 rtp 以便使用其多路結點和校驗服務;

這兩種協議都提供了傳輸層協議的功能。但是 rtp 可以與其它適合的底層網路或傳輸協議一起使用

如果底層網路提供組播方式,那麼 rtp 可以使用該組播表傳輸資料到多個目的地。

rtp 本身並沒有提供按時傳送機制或其它服務質量(qos)保證,它依賴於底層服務去實現這一過程。 

rtp 並不保證傳送或防止無序傳送,也不確定底層網路的可靠性。

基於udp的資料傳輸協議(udp-baseddata transfer protocol,簡稱udt)是一種網際網路資料傳輸協議。

udt的主要目的是支援高速廣域網上的海量資料傳輸,而網際網路上的標準資料傳輸協議tcp在高頻寬長距離網路上效能很差。

顧名思義,udt建於udp之上,並引入新的擁塞控制和資料可靠性控制機制。

udt是面向連線的雙向的應用層協議。它同時支援可靠的資料流傳輸和部分可靠的資料報傳輸。

由於udt完全在udp上實現,它也可以應用在除了高速資料傳輸之外的其它應用領域,例如點到點技術(p2p),防火牆穿透,多**資料傳輸等等。

UDP伺服器的實現

udp是一種面向無連線的不可靠傳輸協議,有處理速度快 消耗資源小的特點。好奇udp通訊怎麼實現併發服務。tcp可以通過監聽服務,建立新的會話,實現併發 udp沒有這種監聽機制,如何實現併發?其實,udp本身就可連線多個客戶端。udp是不區分客戶端,也不需要等待客戶端的連線請求。這樣就不用併發處理了。...

UDP伺服器的簡單實現

伺服器端 include include include include include include define err exit m do while 0 int main int argc,char argv int sock socket af inet,sock dgram,0 if ...

mysql udp伺服器 UDP伺服器

傳輸層主要應用的協議模型有兩種,一種是tcp協議,另外一種則是udp協議。tcp協議在網路通訊中佔主導地位,絕大多數的網路通訊借助tcp協議完成資料傳輸。但udp也是網路通訊中不可或缺的重要通訊手段。相較於tcp而言,udp通訊的形式更像是發簡訊。不需要在資料傳輸之前建立 維護連線。只專心獲取資料就...