第五十三章、數據報套接字的發送接收

前面我們講了流套接字的發送接收,這一章我們來學習下在數據報套接字上發送和接收數據。

由於底層協議的不同,數據報套接字是UDP協議,UDP是無連接、不可靠的數據報協議。

如圖:

第五十三章、數據報套接字的發送接收

在這種通信方式中,客戶不與服務建立連接,它只是通過sendto向服務程序發送數據報,同時服務程序也不接收來自客戶的連接,它只是調用recvfrom函數,這個函數等待來自某個客戶的數據,並隨接收到的數據報一起返回客戶的地址,服務程序由此可以回應客戶。使用數據報套接字,可以將數據集中為一個包,為每個包單獨的指定目的地址,並且每個包獨立的進行通信。

接下來我們來看下sendto和recvfrom函數的定義:

ssize_t sendto (int __fd, const void *__buf, size_t __n, int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len)

ssize_t recvfrom (int __fd, void *__restrict __buf, size_t __n, int __flags, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len)

這兩個函數的前三個參數和read和write函數的參數相同(有不清楚的可以看我前面第五十一章),對於recvfrom,如果所接收的包的實際長度大於參數n,則得到該包的前n個字節,而數據包的剩餘部分被丟棄,無法在讀到此數據包的剩餘部分,因此,當採用數據報協議時,必須總是知道數據包的預期長度。

參數flags和send和recv函數中的flags相同(可以看我第五十二章)。

recvfrom的參數addr和addr_len,在函數返回時,他們給出套接字地址結構告訴是誰發送的數據報。如果不想知道這個信息,可以指定addr和addr_len為空指針。

sendto的最後兩個參數類似於connect,當發送數據報時,要在此套接字地址結構中填入協議地址以指明數據報發送給誰。

注意:sendto的最後一個參數是整型值,recvfrom的最後一個參數是指向整數的指針。

我們來看下程序:

客戶端:

第五十三章、數據報套接字的發送接收

服務端:

第五十三章、數據報套接字的發送接收


分享到:


相關文章: