嵌入式学习——Linux高级编程复习(UDP编程)——day43

1. UDP编程——函数接口

1.1 socket

        1. 定义

              int socket(int domain, int type, int protocol);

        2. 功能

                创建一个用来进程通信的套接字,返回文件描述符

        3. 参数

                domain:AF_INET           IPv4协议族
                type:SOCK_STREAM    流式套接字            tcp传输协议
                        SOCK_DGRAM    数据报套接字            udp传输协议
                        SOCK_RAW        原始套接字            
                protocol:
                        默认为0 

        4. 返回值

                成功返回套接字新文件描述符
                失败返回-1 

        5. 注意

1.2 inet_addr

        1. 定义

              in_addr_t inet_addr(const char *cp);

        2. 功能

                将字符串IP地址转换为二进制IP地址 

        3. 参数

                cp:字符串IP地址空间首地址

        4. 返回值

                成功返回二进制IP地址

        5. 注意

1.3 htons

        1. 定义

              uint16_t htons(uint16_t hostshort);

        2. 功能

                将本地字节序(小端)转换为网络字节序(大端)

        3. 参数

                hostshort:本地端口号

        4. 返回值

                返回网络字节序端口号

        

      uint16_t ntohs(uint16_t netshort);
      功能:
        将网络字节序(大端)转换为本地字节序(小端)

1.4 bind

        1. 定义

              int bind(int sockfd, const struct sockaddr *addr,
                        socklen_t addrlen);

        2. 功能

                将套接字与IP地址端口绑定在一起

        3. 参数

                sockfd:文件描述符 
                addr:结构体空间首地址 
                addrlen:信息的长度

        4. 返回值

                成功返回0 
                失败返回-1 

        5. 注意

1.5 sendto

        1. 定义

              ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                              const struct sockaddr *dest_addr, socklen_t addrlen);

        2. 功能

                给另一个套接字发送消息

        3. 参数

                sockfd:套接字文件描述符
                buf:要发送数据存放空间的首地址
                len:要发送数据的长度
                flags:发送属性  默认为0 
                dest_addr:目的地址
                addrlen:目的地址信息长度

    struct sockaddr_in {
       sa_family_t    sin_family; /* address family: AF_INET */(协议族)
       in_port_t      sin_port;   /* port in network byte order */(端口号、小端存储要改成大端存储)
       struct in_addr sin_addr;   /* internet address */(IP地址)
   };

   /* Internet address. */
   struct in_addr {
       uint32_t       s_addr;     /* address in network byte order */
   };

        4. 返回值

                成功返回发送字节个数
                失败返回-1 

1.6 recvfrom

        1. 定义

              ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                                struct sockaddr *src_addr, socklen_t *addrlen);

        2. 功能

                接收数据

        3. 参数

                sockfd:套接字文件描述符
                buf:存放接收到数据空间的首地址
                len:最多允许接收的字节数
                flags:属性 默认为0 
                src_addr:存放发送端地址信息空间首地址
                addrlen:想要接收发送端地址大小的变量空间首地址

        4. 返回值

                成功返回实际接收字节数
                失败返回-1 

        5. 注意

                该函数具有阻塞功能

2. UDP编程示例程序

2.1 单方向收发

        1. 头文件

#ifndef __HEAD_H__
#define __HEAD_H__#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>#endif

        2.发送端代码(send.c)

#include "head.h"int main(int argc, char const *argv[])
{int sockfd = 0;char tmpbuff[1024] = {"hello world"};struct sockaddr_in recvaddr;ssize_t nsize = 0;sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("fail to socket");return -1;}recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);recvaddr.sin_addr.s_addr = INADDR_ANY;nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff)+1, 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (-1 == nsize){perror("fail to sendto");return -1;}printf("send %ld bytes success\n", nsize);close(sockfd);return 0;
}

        3. 接收端代码(recv.c)

#include "head.h"int main(int argc, char const *argv[])
{int sockfd = 0;int ret = 0;ssize_t nsize = 0;char tmpbuff[4096] = {0};struct sockaddr_in recvaddr;sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("fail to socket");return -1;}recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);recvaddr.sin_addr.s_addr = INADDR_ANY;ret = bind(sockfd, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (-1 == ret){perror("fail to bind");return -1;}nsize = recvfrom(sockfd, tmpbuff, sizeof(tmpbuff), 0, NULL, NULL);if (-1 == nsize){perror("fail to recvfrom");return -1;}printf("recv %ld bytes success\n", nsize);printf("RECV:%s\n", tmpbuff);close(sockfd);return 0;
}

2.2 双向通信

        1. 头文件

#ifndef __HEAD_H__
#define __HEAD_H__#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <arpa/inet.h>#endif

        2.发送端代码(send.c)

#include "head.h"int main(int argc, char const *argv[])
{int sockfd = 0;char tmpbuff[4096] = {"你在吗?"};struct sockaddr_in recvaddr;ssize_t nsize = 0;sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("fail to socket");return -1;}	recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);recvaddr.sin_addr.s_addr = INADDR_ANY;nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff)+1, 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (-1 == nsize){perror("fail to sendto");return -1;}memset(tmpbuff, 0, sizeof(tmpbuff));nsize = recvfrom(sockfd, tmpbuff, sizeof(tmpbuff), 0, NULL, NULL);if (-1 == nsize){perror("fail to recvfrom");return -1;}printf("RECV:%s\n", tmpbuff);close(sockfd);return 0;
}

        3. 接收端代码(recv.c)

#include "head.h"int main(int argc, char const *argv[])
{int sockfd = 0;int ret = 0;struct sockaddr_in recvaddr;struct sockaddr_in sendaddr;char tmpbuff[4096] = {0};ssize_t nsize = 0;socklen_t addrlen = sizeof(sendaddr);sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("fail to socket");return -1;}	recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);recvaddr.sin_addr.s_addr = INADDR_ANY;ret = bind(sockfd, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if (-1 == ret){perror("fail to bind");return -1;}nsize = recvfrom(sockfd, tmpbuff, sizeof(tmpbuff), 0, (struct sockaddr *)&sendaddr, &addrlen);if (-1 == nsize){perror("fail to recvfrom");return -1;}printf("[%s:%d]%s\n", inet_ntoa(sendaddr.sin_addr), ntohs(sendaddr.sin_port), tmpbuff);sprintf(tmpbuff, "%s --------echo", tmpbuff);nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff), 0, (struct sockaddr *)&sendaddr, sizeof(sendaddr));if (-1 == nsize){perror("fail to sendto");return -1;}close(sockfd);return 0;
}

2.3 使用UDP进行文件复制(CP)

        1.服务端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <time.h>
#include <fcntl.h>typedef struct sockaddr * (SA);int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}struct sockaddr_in ser,cli;//man 7 ip bzero(&ser,sizeof(ser)); bzero(&cli,sizeof(ser));ser.sin_family = AF_INET;ser.sin_port  = htons(50000);//host to net  short ser.sin_addr.s_addr = INADDR_ANY ;//inet_addr("127.0.0.1")int ret = bind(sockfd,(SA)&ser,sizeof(ser));if(-1 == ret){perror("bind");exit(1);}int fd = open("2.png",O_CREAT|O_WRONLY|O_TRUNC,0666);if(-1 == fd){perror("open");exit(1);}while(1){char buf[1024]={0};socklen_t len = sizeof(cli);int rd_ret = recvfrom(sockfd,buf,sizeof(buf),0,(SA)&cli,&len);if(0 == strcmp(buf,"^_^")){break;}write(fd,buf,rd_ret);bzero(buf,sizeof(buf));strcpy(buf,"go on");sendto(sockfd,buf,strlen(buf),0,(SA)&cli,sizeof(cli));}close(fd);close(sockfd);return 0;
}

        2. 客户端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <fcntl.h>typedef struct sockaddr * (SA);
int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}struct sockaddr_in ser,cli;//man 7 ip bzero(&ser,sizeof(ser)); bzero(&cli,sizeof(ser));ser.sin_family = AF_INET;ser.sin_port = htons(50000);//host to net  short ser.sin_addr.s_addr = INADDR_ANY;int fd = open("/home/linux/1.png",O_RDONLY);if(-1 == fd){perror("open");exit(1);}char buf[1024]={0};socklen_t len = sizeof(ser);while(1){bzero(buf,sizeof(buf));int rd_ret = read(fd,buf,sizeof(buf));if(rd_ret<=0){break;}sendto(sockfd,buf,rd_ret,0,(SA)&ser,len);bzero(buf,sizeof(buf));recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);}strcpy(buf,"^_^");sendto(sockfd,buf,strlen(buf),0,(SA)&ser,len);close(fd);close(sockfd);return 0;
}

2.4 使用UDP进行两端聊天(chat)

        1. 服务端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <time.h>
#include <pthread.h>typedef struct sockaddr * (SA);struct sockaddr_in ser,cli;void* th1(void* arg)
{int sockfd =* (int*)arg;while(1){char buf[256]={0};socklen_t len = sizeof(cli);recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);printf("from c:%s\n",buf);}}void* th2(void* arg)
{int sockfd =* (int*)arg;while(1){printf("to c:");char buf[256]={0};fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';sendto(sockfd,buf,strlen(buf),0,(SA)&cli,sizeof(cli));}}int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}//man 7 ip bzero(&ser,sizeof(ser)); bzero(&cli,sizeof(ser));ser.sin_family = AF_INET;ser.sin_port  = htons(50000);//host to net  short ser.sin_addr.s_addr = INADDR_ANY;int ret = bind(sockfd,(SA)&ser,sizeof(ser));if(-1 == ret){perror("bind");exit(1);}pthread_t tid1,tid2;socklen_t len = sizeof(cli);char buf[256]={0};recvfrom(sockfd,buf,sizeof(buf),0,(SA)&cli,&len);pthread_create(&tid1,NULL,th1,&sockfd);pthread_create(&tid2,NULL,th2,&sockfd);pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;
}

        2. 客户端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <pthread.h>typedef struct sockaddr * (SA);struct sockaddr_in ser,cli;
void* th1(void* arg)
{int sockfd =* (int*)arg;while(1){char buf[256]={0};socklen_t len = sizeof(cli);recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);printf("from s:%s\n",buf);}}
void* th2(void* arg)
{int sockfd =* (int*)arg;while(1){printf("to s");char buf[256]={0};fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';sendto(sockfd,buf,strlen(buf),0,(SA)&ser,sizeof(ser));}}
int main(int argc, char *argv[])
{int sockfd = socket(AF_INET,SOCK_DGRAM,0);if(-1 == sockfd){perror("socket");exit(1);}//man 7 ip bzero(&ser,sizeof(ser)); bzero(&cli,sizeof(ser));ser.sin_family = AF_INET;ser.sin_port  = htons(50000);//host to net  short ser.sin_addr.s_addr = INADDR_ANY; pthread_t tid1,tid2;char buf[256]="start";sendto(sockfd,buf,strlen(buf),0,(SA)&ser,sizeof(ser));pthread_create(&tid1,NULL,th1,&sockfd);pthread_create(&tid2,NULL,th2,&sockfd);pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;
}

3. UDP特性
    1.实现简单
    2.占用资源较小
    3.不安全、不可靠

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024新消费特点---探索消费升级与品牌力量

最近看到不少消费视频&#xff0c;想起之前听过江南春的一场分享&#xff0c;结尾总结了张思维导图&#xff0c;分享给大家&#xff01; 随着时代的变迁&#xff0c;消费者的需求和市场环境也在不断演进。今天&#xff0c;我们将深入探讨消费升级的深层含义以及品牌如何在竞争…

集成学习 Ensemble Learning

目录 一、集成学习概览1、介绍2、学习器3、boosting和bagging比较1、样本选择2、样例权重3、预测函数4、计算5、其他 4、结合策略 二、Adaboost1、介绍2、运行过程3、特点4、代码示例 三、随机森林1、介绍2、随机森林生成3、特点4、优缺点5、代码示例6、参数介绍 四、GBDT1、介…

新火种AI|苹果终于迈进了AI时代,是创新还是救赎?

作者&#xff1a;一号 编辑&#xff1a;美美 苹果的AI战略&#xff0c;能够成为它的救命稻草吗&#xff1f; 苹果&#xff0c;始终以其独特的创新能力引领着行业的发展方向。在刚结束不久的2024年的全球开发者大会&#xff08;WWDC&#xff09;上&#xff0c;苹果再次证明了…

深入浅出 Qt 中 QListView 的设计思想,并掌握大规模、高性能列表的实现方法

在大规模列表控件的显示需求中&#xff0c;必须解决2个问题才能获得较好的性能&#xff1a; 第一就是数据存在哪里&#xff0c; 避免出现数据的副本。第二就是如何展示Item&#xff0c;如何复用或避免创建大量的Item控件。 在QListView体系里&#xff0c;QAbstractListModel解…

面试-NLP八股文

机器学习 交叉熵损失&#xff1a; L − ( y l o g ( y ^ ) ( 1 − y ) l o g ( 1 − ( y ^ ) ) L-(ylog(\hat{y}) (1-y)log(1-(\hat{y})) L−(ylog(y^​)(1−y)log(1−(y^​))均方误差&#xff1a; L 1 n ∑ i 1 n ( y i − y ^ i ) 2 L \frac{1}{n}\sum\limits_{i1}^{n}…

大模型学习之GLM结构

探索GLM&#xff1a;一种新型的通用语言模型预训练方法 随着人工智能技术的不断进步&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域也迎来了革命性的发展。OpenAI的ChatGPT及其后续产品在全球范围内引起了广泛关注&#xff0c;展示了大型语言模型&#xff08;LLM&a…

分离式网络变压器与传统网络变压器在电路设计中如何选择?

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;今天分享的是&#xff1a;分离式网络变压器与传统网络变压器在电路设计中如何选择&#xff1f; 首先&#xff0c;我们要了解传统网络变压器和分离式网络变压器在设计上主要有以下不同点&#xff1a; 1、传统网络变…

​​Vitis HLS 学习笔记--添加 RTL 黑盒函数

目录 1. 简介 2. 用法详解 2.1 需要的文件 2.1.1 RTL 函数签名 2.1.2 黑盒 JSON 描述文件 2.1.3 RTL IP 文件 2.2 操作步骤 3. 总结 1. 简介 Vitis HLS 工具可以将现有的 Verilog RTL IP&#xff08;即硬件描述语言编写的模块&#xff09;集成到 C/C HLS 项目中。通过…

专家解读 | NIST网络安全框架(3):层级配置

NIST CSF在核心部分提供了六个类别的关键功能和子功能&#xff0c;并围绕CSF的使用提供了层级&#xff08;Tier&#xff09;和配置&#xff08;Profile&#xff09;两种工具&#xff0c;使不同组织和用户更方便有效地使用CSF&#xff0c;本文将深入探讨CSF层级和配置的主要内容…

【PL理论】(24) C- 语言:有块的作用域 | 更新的语法 | 新的语义域 | 环境 vs. 内存

&#x1f4ad; 写在前面&#xff1a;我们将再次扩展之前的C语言&#xff0c;让我们向这种语言引入“作用域”的概念。 目录 0x00 C- 语言&#xff1a;有块的作用域 0x01 C- 语言&#xff1a;更新的语法 0x02 新的语义域 0x03 环境 vs. 内存 0x00 C- 语言&#xff1a;有块的…

Golang | Leetcode Golang题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; func reverse(a []int) {for i, n : 0, len(a); i < n/2; i {a[i], a[n-1-i] a[n-1-i], a[i]} }func postorderTraversal(root *TreeNode) (res []int) {addPath : func(node *TreeNode) {resSize : len(res)for ; node ! nil; node n…

大语言模型QA

Q:关于 Yi-9B 通过 input/output cosine 来分析模型,可能文档里没有把前提说明白。该指标确实存在你们提到的不同模型大小不可比的问题。所以我们比较的是同一个模型在不同训练阶段,以及 layer 深度相同的dense models 之间的比较。除了发现yi-6B/34B 随着训练 tokens 的增加…

Polkadot <> Kusama 桥:打造无信任互操作性的开创性范例

原文&#xff1a;https://www.parity.io/blog/trustless-interoperability 作者&#xff1a;Adrian Catangiu&#xff5c;Rust 区块链核心工程师&#xff0c;Parity Technologies 编译&#xff1a;OneBlock Polkadot <> Kusama 桥是无信任互操作性的开创性范例。本文深…

TCP相关细节

1. 常用TCP参数 1.1 ReceiveBufferSize ReceiveBuffersize指定了操作系统读缓冲区的大小&#xff0c; 默认值是8192(如图5-10 所示)。在第4章的例子中,会有"假设操作系统缓冲区的长度是8" 这样的描述,可通过socket.ReceiveBufferSize 8 实现。当接收端缓冲区满了的时…

实用软件下载:XMind 2024最新安装包及详细安装教程

​XMind不仅是一款易用且功能强大的思维导图软件&#xff0c;也是一个开源项目。XMind以构建一个社区向全球提供领先的跨平台思维导图和头脑风暴软件为目标&#xff0c;以帮助用户提升效率。XMind公司是XMind开源项目的主要代码贡献者&#xff0c;与此同时&#xff0c;我们欢迎…

Stable Diffusion本地化部署详细攻略

一、硬件要求 内存&#xff1a;至少16GB 硬盘&#xff1a;至少60GB以上的磁盘空间&#xff0c;推荐SSD固态硬盘 显卡&#xff1a;推荐NVIDIA显卡 显存&#xff1a;至少4GB Stabl Diffusion因为是在本地部署&#xff0c;对显卡的要求比较高&#xff0c;如果经济能力可以的话…

AI大模型爆发,你还不学就晚了!抓住时代机遇,快速入门指南!

AI大模型风起云涌&#xff0c;你准备好乘风破浪了吗&#xff1f; 在一个阳光明媚的午后&#xff0c;小李坐在自己的工位上&#xff0c;眼前的代码如同繁星般繁多。他是一名资深的软件工程师&#xff0c;但在最近的技术浪潮中&#xff0c;他却感到了一丝不安。他的朋友圈里&…

RN6752V1 高性能AHD转MIPIDVPBT656BT601芯片方案,目前适用于车载方案居多

RN6752V1描述&#xff1a; RN6752V1是一种模拟高清晰度&#xff08;模拟高清&#xff09;视频解码器IC&#xff0c;专为汽车应用而设计。它集成了所有必要的功能块&#xff1a; AFE&#xff0c;PLL&#xff0c;解码逻辑&#xff0c;MIPI和I2C接口等&#xff0c;在一个小的5mm …

LLM资料大全:文本多模态大模型、垂直领域微调模型、STF数据集、训练微调部署框架、提示词工程等

前言 自ChatGPT为代表的大语言模型&#xff08;Large Language Model, LLM&#xff09;出现以后&#xff0c;由于其惊人的类通用人工智能&#xff08;AGI&#xff09;的能力&#xff0c;掀起了新一轮[自然语言处理]领域的研究和应用的浪潮。尤其是以ChatGLM、LLaMA等平民玩家都…

【ARM Cache 及 MMU 系列文章 6.5 -- 如何进行 Cache miss 统计?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 ARM Cache Miss 统计Cache 多层架构简介Cache 未命中的类型Cache 未命中统计Cache miss 统计代码实现Cache Miss 统计意义ARM Cache Miss 统计 在ARMv8/v9架构中,缓存未命中(Cache …