当前位置: 首页 > 科技观察

Hi3861-UDP-BroadcastingforLearningDemoDevelopment

时间:2023-03-13 06:01:02 科技观察

了解更多开源请访问:开源基础软件社区https://ost.51cto.com1.前言net_demo.h文件中,testFun是什么?它是如何选择客户端或者服务端然后跳转到tcp_client_test.c文件执行TcpClientTest()函数的呢?看不懂别人的高级代码,就跟着官方的代码,自己写了个简单的代码,学习了另一种传输协议UDP。二、UDP简介1、用户数据报协议(UDP)的定义:UDP(UserDatagramProtocol)是一种简单的面向数据报的传输层协议。提供非面向连接的、不可靠的数据流。UDP不提供可靠性,也不提供数据包到达确认、排序和流量控制等功能。它只是将应用程序传递的数据报发送到IP层,但不能保证它们一定会到达目的地。因此,数据包可能会丢失、重复和乱序。但是由于UDP在传输数据报之前不需要客户端与服务器端建立连接,也没有超时重传等机制,所以传输速度非常快。2、回顾TCP“面向连接的TCP”是指在正式通信之前必须与对方建立连接。TCP协议是一种可靠的、一对一的、面向连接的通信协议。3、UDP/TCP的区别TCP和UDP最大的区别是:TCP是面向连接的,而UDP是无连接的。TCP协议和UDP协议各有优缺点,适用于不同要求的通信环境。TCP协议和UDP协议的区别如下表所示。在实际使用中,TCP主要用在对文件传输的准确性要求比较高,不是很紧急的场合,比如电子邮件,远程登录等,有时在这些应用场景中,即使丢失一两个字节也会造成无法修复的错误,所以TCP传输协议一般用于这些场景。由于UDP可以提高传输效率,因此UDP被广泛应用于数据量大、精度要求不高的数据传输。比如我们平时在网站上看视频或者听音乐的时候,基本都是使用UDP传输协议。开发流程图:UDP:TCP:3.代码1.在net_params.h文件中移动连接WiFi和配置WiFi的代码:#ifndefPARAM_HOTSPOT_SSID#definePARAM_HOTSPOT_SSID"Fsr"//你的APSSID#endif#ifndefPARAM_HOTSPOT_PSK#定义PARAM_HOTSPOT_PSK"12345678"//你的APPSK#endif连接到WiFi://连接到wifiWifiDeviceConfigconfig={0};//准备AP配置参数strcpy(config.ssid,PARAM_HOTSPOT_SSID);strcpy(config.preSharedKey,PARAM_HOTSPOT_PSK);config.securityType=PARAM_HOTSPOT_TYPE;操作系统延迟(10);//开始连接intnetId=ConnectToHotspot(&config);记得在udp文件夹下编译BUILD.gn中WiFi的.c文件:2.SimpleUDP//1.createudpintsock_fd;诠释;sock_fd=socket(AF_INET,SOCK_DGRAM,0);//SOCK_DGRAM:UDP类型套接字if(sock_fd<0){perror("sock_fd创建错误\r\n");返回;}//2.配置地址structsockaddr_insend_addr;socklen_tsend_addr_len=sizeof(send_addr);//内存初始化memset((void*)&send_addr,0,send_addr_len);send_addr.sin_family=AF_INET;send_addr.sin_addr.s_addr=inet_addr("192.168.11.41");//就是把一个点分十进制IP转成一个长整型(u_long类型)send_addr.sin_port=htons(1234);//端口号,由主机字节序转换为网络字节序//3.配置发送消息char*msg="helloworld";while(1){//4.Sending//UDPsocket是“无连接”的,所以每次发送都要先指定目标主机和端口,主机可以是多播地址ret=sendto(sock_fd,msg,strlen(msg),0,(structsockaddr*)&send_addr,发送地址长度);printf("发送UDP消息{%s}完成!\r\n",msg);睡眠(1*1000*1000);//5.从Addr={0}接收structsockaddr_in;socklen_tfromLen=sizeof(fromAddr);//UDPsocket是“无连接”的,所以每次在第一次接收之前你都不知道消息是从哪里来的,你可以通过fromAddr参数获取发送者的信息(主机,端口号)ret=recvfrom(sock_fd,&response,sizeof(response),0,(structsockaddr*)&fromAddr,&fromLen);if(ret<=0){printf("recvfrom失败或中止,%ld!\r\n",ret);}响应[ret]='\0';printf("recvUDPmessage{%s}%lddone!\r\n",response,ret);printf("peerinfo:ipaddr=%s,port=%d\r\n",inet_ntoa(fromAddr.sin_addr),ntohs(fromAddr.sin_port));//Convertthenetworkaddressinto"."点间距字符串格式将16位数字从网络字节序转换为主机字节序}代码中的主要函数使用与TCP相同的套接字,已经提到以上,【FFH】学习设备开发之Hi3861-TCPclient-SwitchLight讲解。两种开发过程的区别:①创建的socket类型是type=SOCK_STREAM(TCP)/SOCK_DGRAM(UDP)。intsockfd=socket(AF_INET,type,0);②TCP连接主机需要多一步,而UDP不需要。3、代码运行结果为netcat,-u表示主机使用UDP协议传输,-l开启监听,-p指定端口。4、UDP广播由于UDP是无连接的,一对多发送消息,自然具有广播消息的功能。主要代码如下://1.Createudpintsock_fd;诠释;sock_fd=socket(AF_INET,SOCK_DGRAM,0);if(sock_fd<0){perror("sock_fd创建错误\r\n");返回;}//2.设置广播模式intyes=1;ret=setsockopt(sock_fd,SOL_SOCKET,SO_BROADCAST,(char*)&yes,sizeof(yes));//SOL_SOCKET指示当前socketfd,授予SO_BROADCAST广播权限if(ret==-1){perror("setsockopterror\r\n");返回;}//3.配置广播地址structsockaddr_inbroadcast_addr;socklen_tbroadcast_addr_len=sizeof(broadcast_addr);//初始化地址内存memset((void*)&broadcast_addr,0,broadcast_addr_len);broadcast_addr.sin_family=AF_INET;broadcast_addr.sin_addr.s_addr=htonl(INADDR_BROADCAST);//INADDR_BROADCAST:发送给所有主机的地址broadcast_addr.sin_port=htons(char*234g)="hello";while(1){ret=sendto(sock_fd,msg,strlen(msg),0,(structsockaddr*)&broadcast_addr,broadcast_addr_len);usleep(1*1000*1000);设置广播模式的函数:setsockopt(sock_fd,SOL_SOCKET,SO_BROADCAST,(char*)&yes,sizeof(yes));intsetsockopt(intsocket,intlevel,intoption_name,constvoid*option_value,size_t,ption_len);第一个参数socket是套接字描述符,第二个参数level是要设置的选项的级别,如果要在套接字级别设置选项,则必须将级别设置为SOL_SOCKET。第三个参数option_name指定要设置的选项,option_name可以有什么值取决于级别。当level为SOL_SOCKET时,option_name可以为SO_DEBUG来开启或关闭调试信息。SO_REUSEADDR,开启或关闭地址复用功能。当option_value不等于0时,开启,否则关闭。SO_DONTROUTE,开启或关闭路由查找功能。当option_value不等于0时,开启,否则关闭。SO_BROADCAST,允许或禁止发送广播数据。当option_value不等于0时允许,否则禁止。不需要确定具体发送给哪个主机,所以设置广播地址为all。broadcast_addr.sin_addr.s_addr=htonl(INADDR_BROADCAST);//INADDR_BROADCAST:发送给所有主机的地址想了解更多开源,请访问:开源基础软件社区https://ost.51cto.com。