2024.3.1

1.TCP机械臂测试

代码:

#include <myhead.h>
 
#define SER_IP "192.168.43.185" //服务器ip
#define SER_PORT 8888         //服务器端口号
 
#define CLI_IP "192.168.153.128" //客户端IP
#define CLI_PORT 9999          //客户端端口号
 
 
int main(int argc, const char *argv[])
{
    //1、创建用于通信的套接字文件描述符
    int cfd = socket(AF_INET, SOCK_STREAM, 0);
    if (cfd == -1)
    {
        perror("socket error");
        return -1;
    }
    printf("cfd = %d\n", cfd); //3
 
    //2、绑定(非必须)
    //2.1 填充地址信息结构体
    struct sockaddr_in cin;
    cin.sin_family = AF_INET;
    cin.sin_port = htons(CLI_PORT);
    cin.sin_addr.s_addr = inet_addr(CLI_IP);
    //2.2 绑定
    if (bind(cfd, (struct sockaddr *)&cin, sizeof(cin)) == -1)
    {
        perror("bind error");
        return -1;
    }
 
    printf("bind success\n");
 
    //3、连接服务器
    //3.1填充要连接的服务器地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;                //地址族
    sin.sin_port = htons(SER_PORT);          //端口号
    sin.sin_addr.s_addr = inet_addr(SER_IP); //ip地址
 
    //3.2 连接服务器
    if (connect(cfd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
    {
        perror("connect error");
        return -1;
    }
    printf("connect success\n");
 
    //4、数据收发
    char rbuf[5] = {0xff, 0x02, 0x00, 0x00, 0xff};
    unsigned char bbuf[5] = {0xff, 0x02, 0x01, 0x00, 0xff};
 
    //发送给服务器当做初始值
    send(cfd, rbuf, sizeof(rbuf), 0);
    sleep(1);
    send(cfd, bbuf, sizeof(bbuf), 0);
 
    printf("请键入W、S、A、D进行控制:");
	
    while (1)
    {
        char skb = Key();
        if (skb == 27)
            printf("\n请键入W、S、A、D进行控制(键入Q退出控制!):\n");
 
        switch (skb)
        {
        case 'W':
        case 'w':
        {
            int buf_size1 = sizeof(rbuf);
            r_angleUp(cfd, rbuf, buf_size1, skb);
        }
        break;
 
        case 'S':
        case 's':
        {
            int buf_size1 = sizeof(rbuf);
            r_angleDown(cfd, rbuf, buf_size1, skb);
        }
        break;
 
        case 'D':
        case 'd':
        {
            int buf_size2 = sizeof(bbuf);
            b_angleUp(cfd, bbuf, buf_size2, skb);
        }
        break;
 
        case 'A':
        case 'a':
        {
            int buf_size2 = sizeof(rbuf);
            b_angleDown(cfd, bbuf, buf_size2, skb);
        }
        break;
 
        case 'Q':
        {
            printf("\n控制已结束\n");
            return -1;
        }
        break;
 
        }
    }
    //5、关闭套接字
    close(cfd);
    return 0;
}
 
char Key();                                         
void r_angleUp(int fd, char buf[], int buf_size, char skb);   //红色臂向右偏移
void r_angleDown(int fd, char buf[], int buf_size, char skb); //红色臂向左偏移
void b_angleUp(int fd, char buf[], int buf_size, char skb);   //蓝色色臂向右偏移
void b_angleDown(int fd, char buf[], int buf_size, char skb); //蓝色臂向左偏移

char Key()
{
    
    char in;
    
    struct termios new_settings;    //保存用于操作的终端属性
    struct termios stored_settings; //保存当前的终端属性,以便之后恢复
 
   
    tcgetattr(0, &stored_settings);
   
    new_settings = stored_settings;
 
   
    new_settings.c_lflag &= (~ICANON);
 
    
 
    tcgetattr(0, &stored_settings);
    
    new_settings.c_cc[VMIN] = 1; //非规范模式读取时的最小字符数--VMIN
 
    
    tcsetattr(0, TCSANOW, &new_settings); //不等数据传输完毕就立即改变属性--TCSANOW
 
    in = getchar();
    
    tcsetattr(0, TCSANOW, &stored_settings);
    return in;
}

void r_angleUp(int fd, char buf[], int buf_size, char skb)
{
    if (skb != 27) //skb==ECS时退出控制
    {
        buf[3] += minStep; //每次操作的角度偏移minStep度
        if (buf[3] >= 90)
        {
            buf[3] = 90;
        }
        send(fd, buf, buf_size, 0);
    }
    return;
}
void r_angleDown(int fd, char buf[], int buf_size, char skb)
{
    if (skb != 27)
    {
        buf[3] -= minStep;
        if (buf[3] <= -90)
        {
            buf[3] = -90;
        }
        send(fd, buf, buf_size, 0);
    }
 
    return;
}
void b_angleUp(int fd, char buf[], int buf_size, char skb)
{
    if (skb != 27)
    {
        buf[3] += minStep;
        if (buf[3] >= 180)
        {
            buf[3] = 180;
        }
        send(fd, buf, buf_size, 0);
    }
    return;
}
void b_angleDown(int fd, char buf[], int buf_size, char skb)
{
    if (skb != 27)
    {
        buf[3] -= minStep;
        if (buf[3] <= 0)
        {
            buf[3] = 0;
        }
        send(fd, buf, buf_size, 0);
    }
    return;
}

2.基于UDP的TFTP文件传输

代码:

#include<myhead.h>
 
#define SER_IP "192.168.43.185"
#define SER_PORT 69
#define IP "192.168.153.128"
#define PORT 9999
 
enum mode
{
    TFTP_READ = 1,
    TFTP_WRITE = 2,
    TFTP_DATA = 3,
    TFTP_ACK = 4,
    TFTP_ERR = 5
};
 
void get_filename(char* filename, int size)
{
    bzero(filename, size);
 
    printf("请输入文件名:");
    fgets(filename, size, stdin);
    filename[strlen(filename) - 1] = 0;
}
 
void rw_request(char* pack, int pack_size, char* filename, int mode, int* packlen)
{
    bzero(pack, pack_size); 
 
    short* p1 = (short*)pack;
    *p1 = htons(mode);
 
    char* p2 = (char*)(p1 + 1);
    strcpy(p2, filename);
 
    char* p4 = p2 + strlen(p2) + 1;
    strcpy(p4, "octet");
 
    *packlen = 4 + strlen(p2) + strlen(p4);
}
 
void pack_data(char* pack, int num, char* rbuf, int len, int* packlen)
{
    bzero(pack, sizeof(pack)); 
 
    short* p1 = (short*)pack;
    *p1 = htons(TFTP_DATA);
 
    short* p2 = p1 + 1;
    *p2 = htons(num);
 
    char* p4 = (char*)(p2 + 1);
    for (int i = 0; i < len; i++)
    {
        *(p4 + i) = rbuf[i];
    }
 
    *packlen = 4 + len;
}
 
void pack_ack(char* ack, int num)
{
    bzero(ack, 4);
 
    short* a = (short*)ack;
    *a = htons(TFTP_ACK);
    *(a + 1) = htons(num);
}
 
void pack_errmsg(char* pack, char* msg, int* packlen)
{
    bzero(pack, sizeof(pack));
 
    short* p = (short*)pack;
    *p = htons(TFTP_ERR);
    *(p + 1) = htons(0);
 
    char* errmsg = (char*)(p + 2);
    strcpy(errmsg, msg);
 
    *packlen = 4 + strlen(errmsg);
}
 
void client_recv(int sfd, struct sockaddr_in* sin, socklen_t* socklen)
{
    char filename[128];
    get_filename(filename, sizeof(filename));
 
    char pack[516] = "";
    int packlen = 0;
    rw_request(pack, sizeof(pack), filename, TFTP_READ, &packlen);
    
    sendto(sfd, pack, packlen, 0, (struct sockaddr*)sin, *socklen);
 
    int fd = -1;
    if ((fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0664)) == -1)
    {
        perror("create file error");
        return;
    }
 
    char wbuf[512] = "";
    int block_num = 0;
    while (1)
    {
        bzero(pack, sizeof(pack));
        packlen = recvfrom(sfd, pack, sizeof(pack), 0, (struct sockaddr*)sin, socklen);
        short* p = (short*)pack;
        short code = ntohs(*p);
        short num = ntohs(*(p + 1));
 
        if (3 == code && num == ++block_num)
        {
            write(fd, pack + 4, packlen - 4);
 
            char ack[4];
            pack_ack(ack, block_num);
            sendto(sfd, ack, 4, 0, (struct sockaddr*)sin, *socklen);
            
            if (packlen < 512)
            {
                printf("下载完成\n");
                close(fd);
                break;
            }
        }
    }
}
 
void client_send(int sfd, struct sockaddr_in* sin, socklen_t* socklen)
{
    char filename[128];
    get_filename(filename, sizeof(filename));
 
    char pack[516] = "";
    int packlen = 0;
    rw_request(pack, sizeof(pack), filename, TFTP_WRITE, &packlen);
 
    sendto(sfd, pack, packlen, 0, (struct sockaddr*)sin, *socklen);
 
    int fd = -1;
    if ((fd = open(filename, O_RDONLY)) == -1)
    {
        perror("open error");
        return;
    }
 
    char ack[4];
    char rbuf[512] = "";
    int len;
    while (1)
    {
        recvfrom(sfd, ack, 4, 0, (struct sockaddr*)sin, socklen);
        short* a = (short*)ack;
        short code = ntohs(*a);
        short num = ntohs(*(a + 1));
 
        if (4 == code && (len = read(fd, rbuf, sizeof(rbuf))) > 0)
        {
            pack_data(pack, num + 1, rbuf, len, &packlen);
 
            sendto(sfd, pack, packlen, 0, (struct sockaddr*)sin, *socklen);
 
            bzero(rbuf, sizeof(rbuf));
 
        }
        else
        {
            printf("上传成功\n");
            break;
        }
    }
}
 
int main(int argc, char const *argv[])
{
    int sfd = -1;
    sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (-1 == sfd)
    {
        perror("socket error");
        return -1;
    }
    printf("sfd = %d\n", sfd);
 
    int reuse = 1;
    if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1)
    {
        perror("setsockopt error");
        return -1;
    }
    printf("端口号快速重用成功\n");
 
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(SER_PORT);
    sin.sin_addr.s_addr = inet_addr(SER_IP);
    socklen_t socklen = sizeof(sin);
 
    printf("1.上传\n");
    printf("2.下载\n");
    printf("0.退出\n");
    printf("请输入:");
    int n;
    scanf("%d", &n);
    getchar();
 
    if (1 == n)
    {
        client_send(sfd, &sin, &socklen);
    }
    else if (2 == n)
    {
        client_recv(sfd, &sin, &socklen);
    }
    else
    {
        printf("输入错误\n");
    }
    
    close(sfd);
 
    return 0;
}

结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用AC自动机实现敏感词过滤(java)

主要分成2部分 trie树的构建&#xff08;前缀树&#xff0c;字典树&#xff09;fail指针的构建 1. trie 树 同一层级不会有重复的字符敏感词的最后一个字符会标记&#xff0c;并携带敏感词的长度 2. fail 指针的构建 fail 指针是指在某个分支匹配失败后&#xff0c;重新…

碰撞的小球(Colliding balls)

效果如下&#xff1a; 代码: #include <bits/stdc.h> #include <graphics.h>//必须库 #include <time.h> using namespace std; int main() {initgraph(650,400);//背景图大小circle(100,100,40);fillcircle(200,200,10);//球的数据srand(time(NULL));int …

Leetcoder Day37| 动态规划part04 背包问题

01背包理论基础 面试掌握01背包&#xff0c;完全背包和重背包就够用了。 背包问题的理论基础重中之重是01背包&#xff0c;一定要理解透&#xff01; 01 背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品…

[Redis]——Redis命令手册set、list、sortedset

&#x1f333;List类型常见命令 LPUSH / RPUSH [KEY] [element] …… 向列表左侧或者右侧插入一个或多个元素 LPOP / RPOP [key] 删除左边或者右边第一个元素 LRANGE [key] start end 返回索引start到end的元素&#xff08;索引从0开始&#xff09; BLPOP / BRPOP [key] [等…

Flink 定义 Temporal Table 的两种方式:Temporal Table DDL 和 Temporal Table Function

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

小程序环形进度条爬坑

在做微信小程序的时候&#xff0c;发现用canvas做的环形进度条&#xff0c;在带滚动条的view里面显示有闪动、显示不全的问题&#xff0c;后面改成echart-weixin的pie图实现了&#xff0c;option配置如下 // 表示进度的百分比 var progressValue 70;option {series: [{type: …

GC机制以及Golang的GC机制详解

要了解Golang的GC机制,就需要了解什么事GC,以及GC有哪几种实现方式 一.什么是GC 当一个电脑上的动态内存不再需要时&#xff0c;就应该予以释放&#xff0c;以让出内存&#xff0c;这种内存资源管理&#xff0c;称为垃圾回收&#xff08;Garbage Collection&#xff09;&#x…

黑马点评-短信登录业务

原理 模型如下 nginx nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开tomcat访问redis&#xff0c;也可以作为静态资源服务器&#xff0c;轻松扛下上万并发&#xff0c; 负载均衡到下游tomcat服务器&#xff0c;打散流量。 我们都知道一台4核8G的tomca…

RH850P1X芯片学习笔记-Generic Timer Module -ATOM

文章目录 ARU-connected Timer Output Module (ATOM)OverviewGLOBAL CHANNEL CONTROL BLOCK ATOM Channel architectureATOM Channel modesSOMP-Signal Output Mode PWMSOMP - ARUSOMC-Signal Output Mode CompareSOMC - ARUSOMC – COMPARE COMMANDSOMC – OUTPUT ACTIONATOM …

智慧城市中的公共服务创新:让城市生活更便捷

目录 一、引言 二、智慧城市公共服务创新的实践 1、智慧交通系统 2、智慧医疗服务 3、智慧教育系统 4、智慧能源管理 三、智慧城市公共服务创新的挑战 四、智慧城市公共服务创新的前景 五、结论 一、引言 随着信息技术的迅猛发展&#xff0c;智慧城市已成为现代城市发…

failed to connect to ‘127.0.0.1:58526‘: Connection refused

WSA使用体验 链接&#xff1a; 知乎-穿越时间一步到位&#xff0c;教你完美安装Windows 11 Android 安卓子系统 CPU不满足要求 明明是12700H&#xff0c;满足要求&#xff0c;但是应用商店说不满足&#xff0c;在设置&#xff08;注意不是控制面板的区域&#xff09;把地区改…

第二天 Kubernetes落地实践之旅

第二天 Kubernetes落地实践之旅 本章学习kubernetes的架构及工作流程&#xff0c;重点介绍如何使用Workload管理业务应用的生命周期&#xff0c;实现服务不中断的滚动更新&#xff0c;通过服务发现和集群内负载均衡来实现集群内部的服务间访问&#xff0c;并通过ingress实现外…

RabbitMQ队列

RabbitMQ队列 1、死信的概念 ​ 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理解&#xff0c;一般来说,producer将消息投递到broker或者直接到queue里了&#xff0c;consumer 从 queue取出消息进行消…

浅析虚函数的vptr和虚函数表

浅析虚函数的vptr和虚函数表 文章目录 浅析虚函数的vptr和虚函数表前言1. 基础理论2. 实现与内部结构 前言 ​ 为了实现虚函数&#xff0c;C使用一种称为虚拟表的特殊形式的后期绑定。该虚拟表是用于解决在动态/后期绑定方式的函数调用函数的查找表。虚拟表有时会使用其他名称…

【STM32+HAL】七针OLED(SSD1306)配置(SPI版)

一、前言 关于四针OLED的I2C版配置方式&#xff0c;请转至【STM32HAL】OLED显示初始化配置 二、实现功能&#xff1a; 用SPI通信方式初始化OLED显示&#xff08;相较于I2C速度更快&#xff09; 三、方法一&#xff1a;硬件SPI通信 1、打开SPI通信&#xff08;仅传输&#xf…

互联网加竞赛 车位识别车道线检测 - python opencv

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …

苍穹外卖Day05——总结5

前期文章 文章标题地址苍穹外卖Day01——总结1https://lushimeng.blog.csdn.net/article/details/135466359苍穹外卖Day01——解决总结1中存在的问题https://lushimeng.blog.csdn.net/article/details/135473412苍穹外卖Day02——总结2https://lushimeng.blog.csdn.net/articl…

STM32-SPI通信协议

串行外设接口SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线。 在某些芯片上&#xff0c;SPI接口可以配置为支持SPI协议或者支持I2S音频协议。 SPI接口默认工作在SPI方式&#xff0c;可以通过软件把功能从SPI模式切换…

【计算机网络】HTTPS 协议原理

https 一、HTTPS 是什么二、加密1. 加密概念2. 加密的原因3. 常见的加密方式&#xff08;1&#xff09;对称加密&#xff08;2&#xff09;非对称加密 三、数据摘要(数据指纹)四、HTTPS 的工作原理探究1. 只使用对称加密2. 只使用非对称加密3. 双方都使用非对称加密4. 非对称加…

java 实现图片新增水印(动态计算水印背景 + 水印文字),附带文字乱码解决方案

文章目录 概要实现流程代码如下小结 概要 图片增加水印背景以及水印文字&#xff0c;根据文字内容是否换行&#xff0c;以及文字行高大小自适应计算背景大小 结果图如下&#xff1a; 实现流程 定义图片来源&#xff0c;以及读取字体来源(防止中文乱码)计算文字所需高度 与…