目錄
?一、UDP
1.1 介紹
1.2 UDP 的通信方式
1.3 單播
????????發送函數????????
????????接收函數
1.4 廣播
1.5 組播/多播
一、UDP
1.1 介紹
????????傳輸層的另外一個協議
????????????????面向無連接,不穩定,速度快,可以一對多
????????????????UDP(User Datagram Protocol,用戶數據報協議)是在一組互連的計算機網絡環境中提供分組交換計算機通信的數據報模式。該協議假定使用 IP 作為底層協議,按照OSI 模型工作在傳輸層。UDP 為應用程序提供了一種以最少的協議機制向其他程序發送消息的過程。該協議是面向事務的,不保證傳遞和重復保護。需要有序、可靠地傳輸數據流的應用程序應使用傳輸控制協議 (TCP)。
1.2 UDP 的通信方式
????????UDP 通信分為發送方和接收方
????????發送方和接收方的通信全靠 IP 和端口
????????而 TCP 靠對方的通信套接字
????????發送方:
????????????????創建套接字 --- socket
????????????????直接發送消息 --- sendto
????????接收方:
????????????????創建套接字 --- socket
????????????????綁定自身的 IP 和端口 --- bind
????????????????接收消息 --- recvfrom
1.3 單播
????????一對一通信
????????發送函數????????
????????函數原型
????????????????ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen)
????????函數參數
????????????????sockfd:通信套接字
????????????????buf:發送消息存放的空間首地址
????????????????len:消息的長度
????????????????flags:填 0 表示阻塞發送
????????????????dest_addr:struct sockaddr_in
????????????????addrlen:struct sockaddr_in 結構體大小
????????函數返回值
????????????????成功返回發送消息的長度,一個大于 0 的值,失敗返回負數
????????接收函數
????????函數原型
????????????????ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
????????函數參數
????????????????sockfd:通信套接字
????????????????buf:接收數據存放空間的首地址
????????????????len:接收數據的長度
????????????????flags:填 0 表示阻塞接收
????????????????src_addr:發送方 IP 和端口信息存放空間的首地址,需要去定義一個變量去承接發送方的 IP 和端口信息
????????????????addrlen:發送方核心結構體的大小,需要定義一個變量,變量取地址裝進來
????????函數返回值
????????????????成功返回接收到消息的長度,失敗返回負數
1.4 廣播
????????一對多,一個發送,剩下的接收
????????相較于單播
????????????????1、多了一個套接字屬性設置 setsockopt --- 讓套接字可以發送廣播消息
????????????????2、發送方多了廣播 IP --- 當前的 IP,前 3 個字節不變,最后一個字節為 255
????????????????????????例如:廣播 IP --- 192.168.0.255
????????????????3、接收方多了一個新的定義 --- INADDR_ANY --- 0.0.0.0
1.5 組播/多播
????????相較于單播和廣播,更改的內容最多
????????組播需要創建和加入
????????發送方:
????????????????1、創建通信套接字
????????????????????????組播的 IP 地址 --- 224.0.0.x ,?x 最好不要用 1,1 比較特殊
????????????????2、創建組播 --- setsockopt
????????????????????????需要使用組播的結構體 struct iq_mreqn --- vscode 無法跳轉這個結構體
struct ip_mreqn
{/* 多播組 IP 地址,大整數,可以用inet_pton(3) 將點分式轉換為大整數 */ struct in_addr imr_multiaddr; {in_addr_t s_addr;};/* 本機 IP 地址,可以用 0.0.0.0 代替,大整數,可以用 inet_pton(3) 將點分式轉換為大整數,INADDR_ANY */ struct in_addr imr_address; /* 當前使用的網絡設備的索引號,ip ad sh 命令可以,查看編號,用 if_nametoindex(3) 函數也可以通過網絡設備名字獲取編號,名字就是 ifconfig(1) 看到的名字,如 eth0、wlan0 等 */int imr_ifindex;
};
????????頭文件
????????????????#include <net/if.h>
????????函數原型
????????????????unsigned int if_nametoindex(const char *ifname)
????????函數參數
???????網卡的名字
????????????????setsockopt 中還需要幾個參數
????????????????????????IPPROTO_IP:組播的標志 --- 第二個參數
????????????????????????IP_MULTICAST_IF:發送方創建組播 --- 第三個參數
????????????????????????IP_ADD_MEMBERSHIP:接收方加入組播
????????????????????????UDP 作為一個了解 --- 要會寫單播,廣播,組播
????????在嵌入式的應用中,我們會使用到 UDP 的應用層協議,純粹的 UDP 用的相對較少,因為 UDP 的思想可以通過其它的傳感器實現,lora、zigbee