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個位元組用來包含報...