UNIX網路程式設計學習 五 UDP程式設計

2021-08-22 02:25:51 字數 1253 閱讀 2967

udp相比tcp是無連線的。

它收發資料是通過recvfrom和sendto兩個函式。

它們的原型如下:

ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);

ssize_t sendto(int sockfd, void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t *addrlen)。

udp客戶端和服務端通訊過程引用書中圖如下:

相比於tcp,udp客戶端在socket之後就開始傳送資料;udp服務端在bind之後就開始接收資料。

udp客戶端傳送資料時,有兩點要考慮:

1.傳送資料過快。

2.伺服器程序未執行。

(1).傳送資料過快

由於udp不必等待來自服務端的應答,因此它可以一直傳送資料。這樣就很容易將服務端淹沒,行別地,如果客戶端傳送資料的頻寬大於服務端的頻寬,就更容易出現這樣的現象。事實上,服務端在接收到來自客戶端的資料時,是暫時先把資料存在乙個緩衝區中,然後從其中乙個乙個地拿資料。如果服務端的緩衝區滿了,那麼後來的資料報就會被丟棄,這就造成了資料的丟失。udp傳送資料過快可以通過限制客戶端的傳送資料報的數量,或擴大服務端的快取容量來解決。

(2).傳送的服務端不存在

當udp傳送的服務端不存在時,會有乙個埠不可達的錯誤。但udp並不會收到這樣的錯誤。如果udp和伺服器端進行了   connect,那麼這個錯誤就會返回給udp客戶端。此外,當udp客戶端進行了connect操作後,它之後傳送的資料也就確定了傳送的物件(如果一台機器上有多個ip,那麼未進行connect的udp會發到這幾個ip中的乙個)。

connect的udp和非connec的udp通訊過程比較(以傳送兩個資料報為例):

非connect:

1.連線套接字。

2.輸出第乙個資料報。

3.斷開套接字。

4.連線套接字。

5.輸出第二個資料報。

6.斷開套接字。

connect:

1.連線套接字。

2.輸出第乙個資料報。

3.輸出第二個資料報。

比較可以看出當要多次向乙個服務端傳送資料時,udp還是連線要高效些。

unix 網路程式設計 UDP

udp user datagram protocol 程式傳送資料給 udp socket,資料先被封裝成 udp資料報,然後又被封裝成ip資料報,然後被傳送到目標方。資料是否被正確傳輸無任何保證 是否到達目標方,是否按正確順序到達,是否目標方只收到乙份資料 每個udp資料報都有長度,這個長度包含在...

Linux UNIX網路程式設計筆記(四) UDP程式設計

udp客戶 伺服器的套接字函式 recvfrom 函式 接收資料,類似標準read include include ssize t recvfrom int sockfd,void buf,size t len,int flags,struct sockaddr from,size t addrle...

NodeJS 五 udp網路程式設計

var dgram require dgram var serverudp dgram.createsocket udp4 serverudp.on message function msg,rinfo serverudp.on listening function serverudp.bind 1...