網路 (十二)UDP簡介

2021-07-05 08:00:07 字數 1972 閱讀 3097

1、udp特點

2、udp程式設計模型

3、echo伺服器和客戶端的udp實現

服務端**

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define handle_error(msg) \

dowhile(0)

void echo_serv(int sock)

; struct sockaddr_in peeraddr;

socklen_t peerlen;

int n;

while(true)

else

if(n > 0)}}

}int main()

echo_serv(sock);

close(sock);

return

0;}

客戶端**

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define handle_error(msg) \

dowhile(0)

int main()

; char sendbuf[1024] = ;

socklen_t peerlen = peerlen = sizeof(servaddr);

int n;

while(fgets(sendbuf,sizeof(sendbuf) , stdin) != null)

close(sock);

return

0;}

4、udp程式設計注意項

0.1 udp報文可能會丟失

針對丟失,需要我們提供重傳機制

0.2 udp報文可能亂序或者重複

針對亂序或者重複,需要維護資料報之間的序號

0.3 udp缺乏流量控制

udp也有自己的傳送和接收緩衝區,拿傳送來說,如果某一時刻將傳送緩衝區寫滿了,如果再寫入資料,此時資料會覆蓋掉之前的資料,所以流量控制需要我們自己實現。

0.4 udp協議資料報文可能發生截斷

如果傳送方傳送了10個位元組的資料,而接收方第一次只接收了5個位元組,剩餘的5個位元組就接收不到了,不會被保留在緩衝區中。

0.5 recvfrom返回0,不代表連線關閉,udp無連線,可能只是對方傳送了0個位元組

0.6 icmp 非同步錯誤

假如在服務端沒有啟動的情況下,啟動了客戶端,並且向服務端傳送了資料,依照上面的客戶端**,客戶端程式應該阻塞在了recvfrom函式,但是服務端根本沒有啟動,sendto函式傳送資料後,會產生乙個icmp非同步錯誤,sendto函式並不會發生錯誤,它的功能只是將使用者緩衝區資料拷貝到udp傳送緩衝區中,可是recvfrom無法接收到這個錯誤,因此一直阻塞,解決方法就是下面的connect函式

0.7 udp也可使用connect

0.6中的錯誤可通過呼叫connect建立乙個udp連線來解決,但是connect所建立的連線並不是真正意義上像tcp端到端的連線,它並不做三次握手,也並不向對方傳遞什麼資料,僅僅是維護了套接字和對等方之間關係,通過該套接字只能傳送資料給該對等方了,相當於繫結了遠端位址;一旦連線成功後,sendto函式就不必指定對方位址了,也可換使用send/recv等方法

0.8 udp外出介面可自動選擇

UDP協議簡介

伺服器模式的網路應用都需要使用udp協議。udp協議從問世至今已經被使用了很多年,雖然其最初的光彩已經被一些類似協議所掩蓋,但是即使是在今天,udp仍然不失為一項非常實用和可行的網路傳輸層協議。與我們所熟知的tcp 傳輸控制協議 協議一樣,udp協議直接位於ip 網際協議 協議的頂層。根據osi 開...

UDP協議簡介

與我們所熟知的tcp 傳輸控制協議 協議一樣,udp協議直接位於ip 網際協議 協議的頂層。根據osi 開放系統互連 參考模型,udp和tcp都屬於傳輸層協議。udp協議的主要作用是將網路資料流量壓縮成資料報的形式。乙個典型的資料報就是乙個二進位制資料的傳輸單位。每乙個資料報的前8個位元組用來包含報...

UDP協議簡介

與我們所熟知的tcp 傳輸控制協議 協議一樣,udp協議直接位於ip 網際協議 協議的頂層。根據osi 開放系統互連 參考模型,udp和tcp都屬於傳輸層協議。udp協議的主要作用是將網路資料流量壓縮成資料報的形式。乙個典型的資料報就是乙個二進位制資料的傳輸單位。每乙個資料報的前8個位元組用來包含報...