下篇 | 开发板AMR接收虚拟机Ubuntu传来的文件

2023-05-16

上篇笔记:虚拟机Ubuntu向开发板AMR传送文件

已经做好了虚拟机向开发板传送文件的笔记啦,然后有发送肯定有接收的,不然就发空气啦!接下来,写开发板如何接受虚拟机发送过来的文件的笔记。

废话不多说啦!进入主题吧!


大概描述一下此流程:

1.在开发板中,创建一个UDP的通信端点(即socket);

2.然后准备IP地址和端口号,并存放进sockaddr_in结构体中;

3.绑定好socket(即bind);

4.等待虚拟机发送文件属性过来,然后判断是否接受

5.然后给虚拟机做出应答

6.如果允许虚拟机发送文件,那么开始接受文件,否则就不接受,等待虚拟机再一次发文件属性来过,再判断是否接收。

接受文件的流程就是这样子啦,配合上篇笔记,就可以实现虚拟机向开发板传送文件这个功能了。

 


具体操作,请阅读代码:

/*
公众号:小浩笔记
备注:小浩除去头文件,减短篇幅,方便阅读

*/

//创建套接字函数
int Socket(int domain, int type, int protocol)
{
    int sockfd = socket(domain, type, protocol);
    if(sockfd == -1)
    {
        perror("创建UDP套接字失败");
        exit(0);
    }

    return sockfd;
}

//绑定地址的函数
int Bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen)
{
    if(bind(sockfd, addr, addrlen) == -1)
    {
        perror("绑定地址失败");
        exit(0);
    }
    return 0;
}

//udp连接的函数
int Connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen)
{
    int ret = connect(sockfd, addr, addrlen);
    if(ret != 0)
    {
        perror("连接失败");
        exit(0);
    }
    return ret;
}

//监听的函数
int Listen(int sockfd, int backlog)
{
    int ret = listen(sockfd, backlog);
    if(ret != 0)
    {
        perror("设置监听失败");
        exit(0);
    }
    return ret;
}
//接受请求的函数
int Accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
    int connfd = accept(sockfd, addr, addrlen);
    if(connfd == -1)
    {
        perror("接收连接失败");
        exit(0);
    }
    return connfd;
}

int main(int argc, char **argv)
{
    if(argc != 3)
    {
        printf("参数错误!用法:<IP> <PORT>\n");
        exit(0);
    }

    // 1,创建UDP通信端点
    int sockfd = Socket(AF_INET, SOCK_DGRAM, 0);

    // 2,准备开发板的地址(IP+PORT)并绑定好socket
    struct sockaddr_in addr;
    socklen_t len = sizeof(addr);
    bzero(&addr, len);

    addr.sin_family = AF_INET; // 指定协议族,这里是IPv4地址
    addr.sin_addr.s_addr = inet_addr(argv[1]); // IP地址
    addr.sin_port = htons(atoi(argv[2])); // PORT端口号

    Bind(sockfd, (struct sockaddr *)&addr, len);

    // 3,等待ubuntu发来文件的属性信息
    struct fileinfo finfo;
    struct sockaddr_in ubuntuAddr;
    len = sizeof(ubuntuAddr);
    while(1)
    {
        bzero(&finfo, sizeof(finfo));
        bzero(&ubuntuAddr, len);
        recvfrom(sockfd, &finfo, sizeof(finfo), 0,
                    (struct sockaddr *)&ubuntuAddr, &len);

        printf("ubuntu发来文件:\n");
        printf("名字:%s\n, 大小:%d\n", finfo.name, finfo.size);

        printf("是否接收?[y/n]\n");
        char response = getchar();
        getchar(); // 吃掉回车符

        // 给ubuntu发去确认信息:y/n
        sendto(sockfd, &response, 1, 0,
                (struct sockaddr *)&ubuntuAddr, len);

        if(response == 'n')
            continue;


        // 开始接收ubuntu的文件内容
        int fd = open(finfo.name, O_WRONLY|O_TRUNC|O_CREAT, 0666);

        char buf[1024];
        int total = 0;
        while(total < finfo.size)
        {
            bzero(buf, 1024);
            int n = recvfrom(sockfd, buf, 1024, 0, NULL, NULL);

            if(n == -1)
            {
                perror("接收文件内容失败");
                exit(0);
            }

            total += n;
            write(fd, buf, n);
        }

        close(fd);
        printf("接收完毕\n");
    }

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

下篇 | 开发板AMR接收虚拟机Ubuntu传来的文件 的相关文章

  • 深度学习入门(八)——深度卷积神经网络

    深度卷积神经网络 卷积神经网络卷积层和特征响应图参数共享稀疏连接多通道卷积激活函数池化 不变性和感受野分布式表征分层表达卷积神经网络结构 LeNetAlexNet网络结构局部响应归一化 GoogLeNetNetwork In Network
  • 深度学习入门(九)——深度学习框架概览

    深度学习框架概览 CaffeTheanoTensorFlowTorchPytorchMXNetcuda convnet2NeonDeeplearning4jCNTKPaddlePaddleKeras 工欲善其事 xff0c 必先利其器 深度
  • 高级篇之ENC1V2新用法USB/RS232串口转Visca-Over-IP

    高级篇之ENC1V2新用法USB RS232串口转Visca Over IP 术语背景现实需求 大家好 xff0c 最近ENC1 V2卖的很火 xff0c 主要是因为发现了它的一个新用法 xff0c 究竟是什么 xff0c 马上揭晓 术语
  • win10+Python3.7 安装 labelImg, lxml无法找不到DLL

    问题 E labelImg gt labelImg Traceback most recent call last File 34 e anda lib runpy py 34 line 193 in run module as main
  • const和#define的区别,详细!

    区别 xff1a xff08 1 xff09 就起作用的阶段而言 xff1a define是在编译的预处理阶段 起作用 xff0c 而const是在 编译 运行 的时候起作用 xff08 2 xff09 就起作用的方式而言 xff1a de
  • ubuntu16.04使用USB转TTL(ch340)串口转usb调试过程

    输入命令 xff1a lsmod grep usbserial 输入 xff1a lsusb 发现了ch341的一些相关信息 输入命令 xff08 查看USB转串口接入状态 xff09 xff1a dmesg usb 6 1 ch341 u
  • LinuxCNC学习-Machinekit手册介绍

    原文链接 http www machinekit io docs common user intro 1 Machinekit用户手册 1 1 关于手册 本手册的重点是如何 使用 Machinekit 安装并配置了Machinekit后 x
  • LinuxCNC学习-HAL库介绍

    原文链接 xff1a http www machinekit io docs hal intro 1 HAL库介绍 HAL代表硬件抽象层 在最高级别上 xff0c 它只是一种允许加载和互连多个 构建块 以组装复杂系统的方式 硬件 部分是因为
  • double float 类型在内存中的存储形式

    一 基础知识 浮点数分为 单精度和双精度 xff0c 在内存中都分为三部分 xff1b 符号位 xff1b 指数位 xff1b 尾数位 xff1b Float类型内存形式 xff1a 图1 float类型在内存中的形式 double类型内存
  • php array_walk break跳出循环的方法

    场景分析解决 场景 array walk使用的地方不要太多 xff0c 在某种情况眷下需要它跳出循环 分析 break 不是array walk的关键字return 不能达到break的效果 相当于foreach的 continue 歪个楼
  • gazebo黑屏打不开world的解决方法

    打开gazebo的时候会发现一直处于黑屏这种状态 xff0c 这是因为model库加载不正确导致的 cd gazebo mkdir p models cd gazebo models wget http file ncnynl com ro
  • JAVA Http的Post请求传参添加Authorization Basic Auth验证

    PostMan添加Authorization验证 pom xml添加依赖包 lt dependency gt lt groupId gt org apache commons lt groupId gt lt artifactId gt c
  • 一个字符串吧大写字母转换为小写字母

    709 转换成小写字母 难度简单140收藏分享切换为英文接收动态反馈 实现函数 ToLowerCase xff0c 该函数接收一个字符串参数 str xff0c 并将该字符串中的大写字母转换成小写字母 xff0c 之后返回新的字符串 示例
  • TX2/Linux下can总线的接收与发送命令和C程序实例

    本文博客深度参考了前辈的作品 xff1a TX2 Linux下can总线的接收与发送详解 xff01 https blog csdn net hhlenergystory article details 81976069 Linux CAN
  • ubuntu18.04 安装Qt交叉编译环境目标机为rk3288

    本文在虚拟机条件下安装成功 xff0c 采用Ubuntu18 04 64位镜像作为编译环境 需要准备材料 交叉编译器 xff1a 目标机器为64位的使用 gcc linaro 6 3 1 2017 05 x86 64 aarch64 lin
  • 使用matlab实现指定三维区域随机生成N个不相交球的函数

    自从写了这篇博客之后 xff0c 更多的人来问我这个问题了 简单写一个随机在一个三维区域生成球的matlab函数 风一样的航哥的博客 CSDN博客 comsol随机生成球体 上次简单写的功能 xff0c 可以实现一些比较稀疏的分布 xff0
  • 在嵌入式里面实现printf()类似的功能

    学习C语言大多数都是从printf 34 hello world 34 开始的 xff0c 对于printf的熟悉程度最高 xff0c 在嵌入式编程中 xff0c 实现printf函数有一种很标准的办法就是实现putch xff0c 绑定对
  • 我的第一个rust程序,感受一下

    周末了 xff0c 要学习一点让自己开心的东西 听说rust语言很年轻 xff0c 性能超过了C 43 43 xff0c 还能支持嵌入式编程 xff0c 作为一名未来要出名的代码工程师 xff0c 岂能错过 xff1f 于是上周开始学习这个
  • 走进他人内心的七项修炼

    本文是一篇读书笔记 xff0c 书名叫 我就是你啊 之所以看这本书 xff0c 是因为在结婚之后 xff0c 发现很多时候会吵架 xff0c 会发现自己情绪不好 xff0c 然后无能为力去解决 让我们来回顾一下 xff0c 化解一场纷争需要
  • 使用优先队列解决自己构造的数据类型

    在C 43 43 中优先队列有两种 xff0c 最大堆和最小堆 当数据类型为int的时候 xff0c 大家都会使用 xff0c 但是如果数据不是单一的 xff0c 比如数据是一个hashmap怎么办 xff1f 例子如下 xff1a You

随机推荐