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

    文章

    290

    浏览量

    22878
  • 编程
    +关注

    关注

    88

    文章

    3441

    浏览量

    92404
  • UDP
    UDP
    +关注

    关注

    0

    文章

    311

    浏览量

    33620
收藏 人收藏

    评论

    相关推荐

    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 3872次阅读
    Linux下的<b class='flag-5'>UDP</b>协议<b class='flag-5'>编程</b>

    Linux开发_网络编程网络通信介绍

    介绍Linux网络编程: TCP网络编程UDP网络编程
    的头像 发表于 09-17 15:46 1066次阅读
    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 523次阅读

    TCP/UDP网络编程的基础知识合集2

    本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信。
    的头像 发表于 05-18 17:31 455次阅读

    TCP/UDP网络编程的基础知识合集3

    本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信。
    的头像 发表于 05-18 17:31 574次阅读
    TCP/<b class='flag-5'>UDP</b><b class='flag-5'>网络</b><b class='flag-5'>编程</b>的基础知识合集3