udp提供的是無連線、不可靠的資料報服務。
在傳輸過程中資料可能會丟失。我們只有通過在應用層進行正確的控制才能修復在傳輸層上存在的缺陷。因此,需要我們編寫可靠的udp應用程式。udp客戶端與伺服器互動的步驟如圖:
使用udp協議進行通訊時,客戶端並不需要與伺服器建立連線,只需要通過sendto系統呼叫給指定的伺服器傳送資料報。相同地,伺服器也不需要監聽或接收客戶端的連線,只需要通過recvfrom系統呼叫等待客戶端傳送資料報。
sendto函式與recvfrom函式都是阻塞的!
基本步驟如下:
使用系統呼叫socket建立乙個套接字並返回這個套接字的檔案描述符sockfd
#includeint socket(int domain, int type, int protocol);
乙個套接字為一條通訊線路的乙個端點。
domain
domain引數指定哪種協議族,常見的協議族有 af_inet、af_inet6 和 af_unix 。af_unix 用於通過檔案系統實現的本地套接字,af_inet 用於網路套接字。
type
type
引數指定服務型別,即 sock_stream 和 sock_dgram。
sock_stream 為流套接字,基於 tcp,提供可靠,有序的服務。
sock_dgram 為資料報套接字,基於 udp,提供不可靠,無序的服務。
protocol
prorocol引數指定具體的協議,通常前兩個引數就可以確定具體的協議,所以我們把這個引數預設設定為0。
要想讓建立的套接字可以被其他程序使用,那必須給該套接字命名。對套接字命名的意思是指將該套接字關聯乙個ip位址和埠號,使用系統呼叫bind
來實現。
#include int bind(int socket, const struct sockaddr *address, size_t address_len);
bind
系統呼叫把引數address
中的位址分配給與檔案描述符socket
關聯的套接字,address_len為address
位址結構的長度。
每種套接字都有自己的位址格式,對於af_inet位址族,套接字位址由socket_in來指定。
struct sockaddr_in;
struct in_addr
;
對於客戶套接字,我們一般不需要指定套接字的埠號,而對於伺服器套接字,我們需要指定套接字的埠號以便讓客戶正確向伺服器傳送資料。
udp 是無連線不可靠的資料報協議。伺服器不接收來自客戶的連線,而只管呼叫recvfrom
系統呼叫,等待客戶的資料到達。recvfrom
的宣告如下:
#include int recvfrom(int socket, void *buffer, size_t length, int flags, struct sockaddr *src_addr, socklen_t *src_len);
recvfrom的引數說明:
- socket:建立的套接字描述符udp是無連線的,客戶端可以直接向伺服器傳送訊息而不需要建立連線。使用- buffer:指向輸入緩衝區的指標
- length:緩衝區大小
- flags:在本文中,可以將 flags 置為0即可
- src_addr:指向客戶套接字位址的指標
- src_len:位址長度
recvfrom的返回值為讀入資料的長度。
sendto
系統呼叫向伺服器傳送訊息。函式定義如下:
#include int sendto(int socket, const void *buffer, size_t length, int flags, const struct sockaddr *dest_addr, socklen_t dest_len);
sendto
函式的引數說明:
-socket:建立的套接字描述符作業系統為每個套接字分配了乙個檔案描述符,使用完後需要關閉使作業系統**該檔案描述符,使用-buffer:輸出緩衝區的指標
-length:緩衝區大小
-flags:正常應用中,flags一般設定為0
-dest_len:位址長度
close
系統呼叫。
#includeint close(int sockfd);
伺服器端:
int main()
; int len = sizeof(cli);
int n = recvfrom(sockfd, recvbuf, 127, 0, (struct sockaddr*)&cli, &len);
if(n <= 0)
printf("recvbuff: %s\n", recvbuf);
sendto(sockfd, "ok", 2, 0, (struct sockaddr*)&cli, sizeof(cli));
} close(sockfd);
}
客戶端:
(一)UDP基本程式設計步驟
udp服務端程式設計分5步 1.建立 udp socket套接字,用socket函式。2.設定socket的屬性,用setsockopt 函式,可選 3.往socket繫結包含 ip資訊,位址資訊的 struct sockaddr in ipv4 結構體。用bind 函式 4.迴圈接收訊息,用rec...
基於UDP的網路程式設計步驟
基於udp 伺服器端 1.建立乙個socket,用函式socket 2.繫結ip位址 埠資訊等到socket上,用函式bind 3.迴圈接收資料,用函式recvfrom 4.關閉網路連線 include include include include include include include ...
8 UDP程式設計 基本步驟
傳輸的大小有限制,一般小於60k 1 使用datagramsocket 指定埠建立接收端 2 準備容器,封裝成datagrampacket包裹 3 阻塞式接收包裹receive datagrampacket p 4 分析資料 byte getdata getlength 5 釋放資源 public ...