精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

UDP網絡編程

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2022-08-26 20:58 ? 次閱讀

UDP網絡編程

1.UDP協議簡介

UDP協議采用無連接的方式,不管發送的數據包是否到達目的主機,數據包是否出錯。收到數據包的主機也不會告訴發送方是否正確收到了數據,它的可靠性是由上層協議來保障的。

UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據報協議,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,IETF RFC 768 [1] 是UDP的正式規范。UDP在IP報文的協議號是17。

UDP是無連接的服務。在無連接服務的情況下,兩個實體之間的通信不需先建立好一個連接,因此其下層的有關資源不需要事先進行預定保留。這些資源將在數據傳輸時動態地進行分配。無連接服務的另一特征就是它不需要通信的兩個實體同時是活躍的(即處于激活態)。當發送端的實體正在進行發送時,它才必須是活躍的。優點是靈活方便和比較迅速,但不能防止報文的丟失、重復或失序,特別適合于傳送少量零星的報文。

UDP報文沒有可靠性保證、順序保證和流量控制字段等,可靠性較差。但是正因為UDP協議的控制選項較少,在數據傳輸過程中延遲小、數據傳輸效率高,適合對可靠性要求不高的應用程序,或者可以保障可靠性的應用程序,如DNS、TFTP、SNMP等。

pYYBAGMIw3iAOAaBAAHTUyEWM6c268.png#pic_center

? UDP和TCP協議的主要區別是兩者在如何實現信息的可靠傳遞方面不同。TCP協議中包含了專門的傳遞保證機制,當數據接收方收到發送方傳來的信息時,會自動向發送方發出確認消息;發送方只有在接收到該確認消息之后才繼續傳送其它信息,否則將一直等待直到收到確認信息為止。與TCP不同,UDP協議并不提供數據傳送的保證機制。如果在從發送方到接收方的傳遞過程中出現數據包的丟失,協議本身并不能做出任何檢測或提示。因此,通常人們把UDP協議稱為不可靠的傳輸協議。

2.UDP通訊流程

poYBAGMIw3iASmZUAADXwfD9_Ss735.png#pic_center

一般在UDP通訊中我們不太區分服務端和客戶端,由于UDP通訊不需要建立連接,因此UDP通訊中主要稱為發送方和接收方。

  • 發送方創建過程:

1.創建網絡套接字socket
2.發送數據sendto

  • 接收方創建過程:

1.創建網絡套接字socket
2.綁定端口
3.接收數據recvfrom

2.1 函數接口

#include 
#include 
發送數據
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
形參: sockfd --套接字,socket函數返回值
???buf – 要發送是內容
???len --要發送的數據長度
???flags --一般填0即可
???dest_addr、addrlen —和connect后兩個參數類似
???dest_addr —對方網絡結構體信息
??? addrlen --dest_addr結構體大小
返回值: 成功返回發送字節數,失敗返回-1
接收數據
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
形參: sockfd --套接字,socket函數返回值
??? buf – 讀取內容存放地址
??? len --要讀取的數據長度
??? flags --一般填0即可
??? src_addr、addrlen —和accept后兩個參數類似
??? src_addr —保存發送者的IP和端口號
??? addrlen —src_addr結構體大小
返回值: 成功返回讀取到的字節數,失敗返回-1;
  • 發送方示例
#include           /* See NOTES */
#include 
#include 
#include 
#include  /* superset of previous */
#include 
#include 
#include 
int main(int argc,char *argv[])
{
	if(argc!=3)
	{
		printf("格式:./a.out <端口號> \n");
		return 0;
	}
	int sockfd=socket(AF_INET,SOCK_DGRAM,0);	
	if(sockfd==-1)
	{
		printf("創建網絡套接字失敗\n");
		return 0;
	}
	struct sockaddr_in s_addr=
	{
		.sin_family=AF_INET,
		.sin_port=htons(atoi(argv[1])),
		.sin_addr.s_addr=inet_addr(argv[2]),//本地所有IP
	};
	char buff[]="UDP發送數據測試!";
	ssize_t size;
	while(1)
	{
		size=sendto(sockfd,buff,sizeof(buff),0,( const struct sockaddr * )&s_addr,sizeof(s_addr));
		printf("發送數據成功size=%ld\n",size);
		sleep(1);
	}
}
地址>
  • 接收方示例
#include 
#include           /* See NOTES */
#include 
#include 
#include  /* superset of previous */
#include 
#include 
#include 
int main(int argc,char *argv[])
{
	if(argc!=2)
	{
		printf("./a.out <端口號>\n");
		return 0;
	}
	/*1.創建網絡套接字*/
	int sockfd=socket(AF_INET,SOCK_DGRAM, 0);
	if(sockfd==-1)
	{
		printf("創建UDP網絡套接字失敗\n");
		return 0;
	}
	/*2.綁定端口號*/
	struct sockaddr_in addr=
	{
		.sin_family=AF_INET,
		.sin_port=htons(atoi(argv[1])),//發送的端口號
		.sin_addr.s_addr=INADDR_ANY,//本地所有IP
	};
	if(bind(sockfd,(const struct sockaddr *)&addr,sizeof(struct sockaddr)))
	{
		printf("綁定端口號失敗\n");
		return 0;
	}
	/*開始接收數據*/
	char buff[256];
	struct sockaddr_in c_addr;
	socklen_t addrlen=sizeof(struct sockaddr_in);
	ssize_t size;
	while(1)
	{
		size=recvfrom(sockfd,buff,sizeof(buff)-1,0,(struct sockaddr *)&c_addr,&addrlen);
		if(size<=0)
		{
			printf("接收數據失敗\n");
			continue;
		}
		buff[size]='\0';
		printf("[%s:%d] %s,len=%ld byte\n",inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port),buff,size);
	}
	close(sockfd);
}
pYYBAGMIw3mAUCmxAALajOIQxME649.png#pic_center

2.2 設置UDP廣播特性

??默認情況下UDP通訊是不支持廣播特性,需要廣播特性則需要設置UDP套接字屬性。

//設置該套接字為廣播類型,
	int nb = 0;
	nb = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
	if(nb == -1)
	{
		printf("設置廣播類型錯誤.\n");
	}
  • 廣播發送方示例
#include           /* See NOTES */
#include 
#include 
#include 
#include  /* superset of previous */
#include 
#include 
#include 
int main(int argc,char *argv[])
{
	if(argc!=3)
	{
		printf("格式:./a.out <端口號> \n");
		return 0;
	}
	int sockfd=socket(AF_INET,SOCK_DGRAM,0);	
	if(sockfd==-1)
	{
		printf("創建網絡套接字失敗\n");
		return 0;
	}
	//設置該套接字為廣播類型,
	const int opt = 1;
	int nb = 0;
	nb = setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
	if(nb == -1)
	{
		printf("設置廣播類型錯誤.\n");
	}
	struct sockaddr_in s_addr=
	{
		.sin_family=AF_INET,
		.sin_port=htons(atoi(argv[1])),
		.sin_addr.s_addr=inet_addr(argv[2]),//本地所有IP
	};
	char buff[]="UDP send data test,hello,world!";
	ssize_t size;
	while(1)
	{
		size=sendto(sockfd,buff,sizeof(buff),0,( const struct sockaddr * )&s_addr,sizeof(s_addr));
		printf("發送數據成功size=%ld\n",size);
		sleep(1);
	}
}
地址>
poYBAGMIw3qAGM7nAAWskBeT12A100.png#pic_center

審核編輯 黃昊宇
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 廣播
    +關注

    關注

    1

    文章

    305

    瀏覽量

    23034
  • 編程
    +關注

    關注

    88

    文章

    3591

    瀏覽量

    93593
  • UDP
    UDP
    +關注

    關注

    0

    文章

    322

    瀏覽量

    33876
收藏 人收藏

    評論

    相關推薦

    626.【day27】23 尚硅谷 Java語言高級 UDP網絡編程舉例 #硬聲創作季

    編程項目開發
    充八萬
    發布于 :2023年07月19日 08:16:33

    基于IPv6的Winsock網絡編程

    {u_int8_t __u6_addr8[16];}2 程序源代碼UDP協議(User Datagram Protocol),即用戶數據報協議,是定義用來在互連網絡環境中提供包交換的計算機通信的協議。UDP
    發表于 05-08 06:14

    嵌入式Linux系統開發學習路線

    Linux網絡發展、TCPIP協議、socket編程、TCP網絡編程UDP網絡
    發表于 09-21 10:09

    【Rico Board試用體驗】嵌入式網絡編程實現與測試

    和服務器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快。 這里將介紹常用的UDP網絡編程。3 UDP編程介紹
    發表于 12-11 22:52

    Linux基礎

    過程中使用非常廣泛,通過Linux網絡發展、TCP/IP協議、socket編程、TCP網絡編程UDP
    發表于 08-03 09:46

    python黑客操作:遠程開機和關機

    FF FF”連續6個“FF”,后面跟著MAC地址信息,一旦網卡檢測到數據包的內容,就會喚醒目標計算機。讓我們看看如何編寫代碼。該代碼涉及UDP網絡編程,稍后將專門編寫。此功能只需要輸入目標計算機
    發表于 01-19 20:22

    鴻蒙HarmonyOS and 無人機

    利用鴻蒙Hispark WIFI IOT 套件控制大疆TELLO 無人機第一步:查看無人機通信協議:第二步:結合UDP網絡編程--UDP demo 寫入無人機的wifi名稱,密碼,ip
    發表于 11-20 09:16

    鴻蒙HarmonyOS 結合 大疆Tello TT無人機 開啟智能家居物聯網新模式

    /RoboMaster%20TT/Tello_SDK_3.0_User_Guide.pdf)第二步:結合鴻蒙UDP網絡編程相關部分寫入無人機的wifi名稱,密碼,ip地址,端口
    發表于 12-22 14:32

    迅為4412開發板Qt網絡編程-UDP實現服務器和客戶端

    UDP 協議是開放式,無連接,不可靠的傳輸層通信協議,但它收發數據的速度相對于 TCP 快很多,常用在傳輸音視頻等數據量非常大的場合。udp 網絡編程只需要使用一個類 QUdpSock
    發表于 05-13 10:56

    基于UDP協議的Socket網絡編程模式的實現

    傳輸層進行網絡通信編程的接口是Socket&它是通用的開發網絡通信程序標準) 本文介紹了基于UDP協議Socket編程機制和原理& 提出了在
    發表于 09-09 15:10 ?42次下載

    Linux下的UDP協議編程

    Linux下的UDP協議編程 介紹UDP協議,并提供一個適用于客戶端和服務器端的實例子程序。  關鍵詞:Linux;UDP協議;TCP/IP協議;程序設計
    發表于 10-16 22:22 ?3953次閱讀
    Linux下的<b class='flag-5'>UDP</b>協議<b class='flag-5'>編程</b>

    Linux開發_網絡編程網絡通信介紹

    介紹Linux網絡編程: TCP網絡編程UDP網絡編程
    的頭像 發表于 09-17 15:46 ?1254次閱讀
    Linux開發_<b class='flag-5'>網絡</b><b class='flag-5'>編程</b>、<b class='flag-5'>網絡</b>通信介紹

    TCP/UDP網絡編程的基礎知識合集1

    本文主要記錄TCP/UDP網絡編程的基礎知識,采用TCP/UDP實現宿主機和目標機之間的網絡通信。
    的頭像 發表于 05-18 17:31 ?684次閱讀

    TCP/UDP網絡編程的基礎知識合集2

    本文主要記錄TCP/UDP網絡編程的基礎知識,采用TCP/UDP實現宿主機和目標機之間的網絡通信。
    的頭像 發表于 05-18 17:31 ?624次閱讀

    TCP/UDP網絡編程的基礎知識合集3

    本文主要記錄TCP/UDP網絡編程的基礎知識,采用TCP/UDP實現宿主機和目標機之間的網絡通信。
    的頭像 發表于 05-18 17:31 ?763次閱讀
    TCP/<b class='flag-5'>UDP</b><b class='flag-5'>網絡</b><b class='flag-5'>編程</b>的基礎知識合集3