基本套接字程式設計(7) udp篇

2021-07-09 04:59:15 字數 3694 閱讀 8836

udp 是user datagram protocol的簡稱, 中文名是使用者資料報協議,是osi(open system interconnection,開放式系統互聯) 參考模型中一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務,ietf rfc 768是udp的正式規範。udp在ip報文的協議號是17。

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

在使用tcp編寫的應用程式與使用udp編寫的應用程式之間存在一些本質差異,其原因在於這兩個傳輸層之間的差別:udp是無連線不可靠的資料報協議,非常不同於tcp提供的面向連線的可靠位元組流協議。然而,相比tcp,有些場合確實更適合使用udp,典型應用程式又:dns(網域名稱系統)、nfs(網路檔案系統)和snmp(簡單網路管理協議)。

與面向連線的協議相比,面向無連線協議極為不同。其中乙個重要的不同點就是客戶端與伺服器之間不必建立連線。

對於udp套接字程式設計而言,伺服器建立套接字後,呼叫bind()函式將套接字與準備接收資料的介面繫結在一起。和tcp程式設計不同的是,應用程式不必呼叫listen()和accept()函式等待客戶端的連線。而只需要等待接收資料了。開發udp套接字應用程式,有兩個重要的函式sendto()和recvfrom()。伺服器採用recvfrom()來接收來自客戶端的資料報,並獲得客戶端的端位址,之後向客戶端傳送資料時,採用sendto()函式。

下圖為udp套接字程式設計流程圖

從圖示中可以明顯的看出udp套接字網路程式設計與tcp的區別。

基本套接字程式設計(1) -- tcp篇,此處僅介紹訊息傳輸函式sendto()與recvfrom();

函式原型:

#include ssize_t sendto(int sockfd , const void *buf , size_t nbytes , int flags , const struct sockaddr *to , socklen_t addrlen);

返回值:成功返回寫的位元組數,出錯返回-1

函式說明:sendto() 用來將資料由指定的socket傳給對方主機。引數s為已建好連線的socket,如果利用udp協議則不需經過連線操作。引數buf指向欲連線的資料內容,引數flags 一般設0,詳細描述請參考send()。引數to用來指定欲傳送的網路位址,結構sockaddr請參考bind()。引數addrlen為sockaddr的結構長度。

引數:

返回值:

若無錯誤發生,返回所傳送資料的總數(請注意這個數字可能小於len中所規定的大小)。否則的話,返回socket_error錯誤(-1),應用程式可通過wsagetlasterror()獲取相應錯誤**。

函式原型:

#include ssize_t recvfrom(int sockfd , const void *buf , size_t nbytes , int flags , const struct sockaddr *from, socklen_t addrlen);

返回值:成功返回寫的位元組數,出錯返回-1

函式說明:recvfrom()用來接收遠端主機經指定的socket傳來的資料,並把資料傳到由引數buf指向的記憶體空間,引數nbytes為可接收資料的最大長度.引數,flags一般設0,其他數值定義參考recv(),引數from用來指定欲傳送的網路位址,結構sockaddr請參考bind()函式,引數fromlen為sockaddr的結構長度。

引數說明:

返回值:

同sendto()函式!若無錯誤發生,返回所接收資料的總數(請注意這個數字可能小於len中所規定的大小)。否則的話,返回socket_error錯誤(-1),應用程式可通過wsagetlasterror()獲取相應錯誤**。

github原始碼**

基本套接字函式

一 socket函式 為了執行網路i o,乙個程序必須做的第一件事就是呼叫socket函式,指定期望的通訊協議型別。int socket int family,int type,int protocol 成功則返回正數,出錯返回 1 sockfd socket af inet,sock stream...

基本UDP套接字程式設計

udp函式呼叫為 客戶不與伺服器建立連線,而是只管使用sendto函式給伺服器傳送資料報,其中必須指定目的地的位址為引數。類似地,伺服器不接受來客戶的連線,而是只管呼叫recvfrom函式,等待來自某個客戶的資料到達,recvfrom將與所接收的資料一道返回客戶的協議位址,因此可以把響應傳送給正確的...

UDP套接字程式設計

與面向連線的協議相比,面向無連線協議極為不同。其中乙個重要的不同點就是客戶端與伺服器之間不必建立連線。對於udp套接字程式設計而言,伺服器建立套接字後,呼叫bind 函式將套接字與準備接收資料的介面繫結在一起。和tcp程式設計不同的是,應用程式不必呼叫listen 和accept 函式等待客戶端的連...