2024.3.1

 机械臂

#include<myhead.h>
#define SER_IP "172.20.10.5"  //服务器ip
#define SER_PORT 8888 //服务器端口号
#define CLI_IP "192.168.111.154" //客户端IP
#define CLI_PORT 9999 //客户端端口号int main(int argc, const char *argv[])
{int cfd;//创建用于通信的套接字文件描述符if((cfd=socket(AF_INET,SOCK_STREAM,0))==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//绑定//填充地址信息结构体struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(CLI_PORT);cin.sin_addr.s_addr=inet_addr(CLI_IP);//绑定if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){perror("bind error");return -1;}printf("bind success\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);//ip地址//链接服务器if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");return -1;}printf("connect success\n");//数据收发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);char key=0;while(1){printf("请输入要控制的机械臂:\nW/w红色增大,S/s红色减小\nD/d蓝色增大,A/a蓝色减小\n");scanf("%c",&key);getchar();switch(key){case 'W':case'w':{rbuf[3]+=2;//每次操作的角度偏移2if(rbuf[3]>=90){rbuf[3]=90;}send(cfd,rbuf,sizeof(rbuf),0);}break;case 'S':case 's':{rbuf[3]-=2;//红色减小if(rbuf[3]>=90){rbuf[3]=90;}send(cfd,rbuf,sizeof(rbuf),0);}break;case 'D':case'd':{bbuf[3]+=2;//每次操作的角度偏移2if(bbuf[3]>=90){bbuf[3]=90;}send(cfd,bbuf,sizeof(bbuf),0);}break;case 'A':case 'a':{bbuf[3]-=2;if(bbuf[3]>=90){bbuf[3]=90;}send(cfd,bbuf,sizeof(bbuf),0);}break;default:goto A;}}close(cfd);A:;
return 0;
}

文件的上传和下载

#include<myhead.h>
#define SER_IP "172.20.10.5"
#define SER_PORT 69int main(int argc, const char *argv[])
{//创建套接字int cfd=socket(AF_INET,SOCK_DGRAM,0);if(cfd==-1){perror("socket error");return -1;}printf("cfd=%d\n",cfd);//收发数据char pack[516]="";//定义容器,记录服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);//下载short *p1=(short *)pack;*p1=htons(1);//设置操作码char *p2=(char *)p1+1;//输入文件名char name[50]="";puts("请输入文件名:");fgets(name,sizeof(name),stdin);strcpy(p2,name);//文件名char *p4=p2+strlen(p2)+1;strcpy(p4,"octet");int packlen=4+strlen(p2)+strlen(p4);//请求包的大小//向服务器发送请求包sendto(cfd,pack,packlen,0,(struct sockaddr*)&sin,sizeof(sin));while(1){//收取数据包,每次以512大小进行读取,直到读取结束puts("1.上传");puts("2.下载");puts("请输入你想要进行的操作:");int option;scanf("%d",&option);getchar();switch(option){case 1://上传{ struct sockaddr_in cin;socklen_t socklen = sizeof(cin);    //计算结构体的大小//以只读的方式打开文件int rfd = -1;if((rfd = open(name,O_RDONLY|O_CREAT|O_TRUNC,0664)) == -1){perror("open error");return -1;}short num = 0;while(1){//清空协议包bzero(pack,sizeof(pack));//接受发来的应答包int res = recvfrom(cfd,pack,sizeof(pack),0,(struct sockaddr*)&cin,&socklen);if(*p1 == ntohs(4)){//发送一个数据包*p1 = htons(3);num++;*(p1 + 1) = htons(num);//读取数据res = read(rfd, p1+2,512);sendto(cfd, pack, sizeof(pack),0,(struct sockaddr*)&cin,sizeof(cin));if(res == 0){printf("upload success\n");break;}}}close(rfd);}break;case 2:{struct sockaddr_in cin;socklen_t socklen = sizeof(cin);   //打开文件int wfd = -1;if((wfd = open(name,O_WRONLY|O_CREAT|O_TRUNC,0664)) == -1){perror("open error");return -1;}while(1){//清空协议包bzero(pack, sizeof(pack));int res = recvfrom(cfd, pack, sizeof(pack), 0, (struct sockaddr*)&cin,&socklen);//判断操作码是否为3 数据内容是否为512字节if(*p1 == ntohs(3)){//写入文件write(wfd, pack+4, res-4);//回复sendto(cfd, pack, 4, 0,(struct sockaddr*)&cin, sizeof(cin));//数据内容小于512字if(res-4 < 512){printf("download success\n");break;}}}close(wfd);}break;}}close(cfd);return 0;}

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

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

相关文章

Qt/事件分发器/事件过滤器

事件分发器 //事件分发器bool event(QEvent* e); //事件分发器&#xff1a;&#xff1a;用途 分发事件 bool MyLabel::event(QEvent* e) {if(e->type() QEvent::MouseButtonPress){//如果是鼠标摁下 拦截事件 不向下分发QMouseEvent* ev static_cast<QMouseEvent*>…

惠普GT5810打印机报错E9的处理方法

当打印机检测到供墨系统需要维护时&#xff0c;将会出现 E9 错误。 吴中函 打印出的带错误的供墨系统维护页包含解决该错误的说明。 出现 E9 警告时维持 HP Ink Tank 打印机的打印质量&#xff0c;出现 E9 警告时如何维持 HP Ink Tank 打印机的打印质量。 惠普5810报错E9通常…

基于springboot+vue的在线考试系统(源码+论文)

文章目录 目录 文章目录 前言 一、功能设计 二、功能页面 三、论文 前言 现在我国关于在线考试系统的发展以及专注于对无纸化考试的完善程度普遍不高&#xff0c;关于对考试的模式还大部分还停留在纸介质使用的基础上&#xff0c;这种教学模式已不能解决现在的时代所产生的考试…

JS 对象数组排序方法测试

输出 一.Array.prototype.sort() 1.默认排序 sort() sort() 方法就地对数组的元素进行排序&#xff0c;并返回对相同数组的引用。默认排序是将元素转换为字符串&#xff0c;然后按照它们的 UTF-16 码元值升序排序。 由于它取决于具体实现&#xff0c;因此无法保证排序的时…

Vision Pro开发者学习路线

官方给到的Vision Pro开发者学习路线&#xff1a; 1. 学习基础知识&#xff1a; - 学习 Xcode、Swift 和 SwiftUI 的基础知识&#xff0c;包括语法、UI 设计等。 - 掌握 ARKit 和 SwiftUI 的使用&#xff0c;了解如何创建沉浸式增强现实体验。 2. 学习 3D 建模&#xf…

记录vue3导入并使用echarts自定义主题文件设置统一图表样式

在做数据可视化网站时&#xff0c;有时需要用到多个图表&#xff0c;这时就需要对图表的样式做一个统一的设计使网站外观更整齐。具体步骤如下&#xff1a; 第一步&#xff1a;在echarts官网定制好主题&#xff0c;并下载js文件 第二步&#xff1a;在index.html文件引入该文件…

[AutoSar]BSW_Com08 CAN driver 模块介绍及参数配置说明 (一)

目录 关键词平台说明一、缩写和定义二、CAN driver 所在位置三、CAN 模块的主要功能四、功能规格4.1 Driver State Machine4.2 CAN控制器状态机4.3 CAN控制器状态机转换4.3.1 调用function Can_Init 导致的状态转换4.3.2 调用Can_ChangeBaudrate导致的状态转换4.3.3 调用Can_Se…

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

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

图像处理ASIC设计方法 笔记6 数据拼接和帧格式校正

第四章大模板卷积ASIC设计方案 P80 实时图SPRM 数据位宽64bit&#xff0c;4个SPRAM&#xff0c;同时得到4行数据 绘制卷积芯片数据路径图&#xff0c;卷积芯片内部模块图 根据这个图&#xff0c;本书后续对各个模块都进行介绍。 P81 第一个模块 图像输入前端FIFO 学习图像处…

关于脉冲负载应用中电阻器,您需要了解的 11 件事?

不幸的是&#xff0c;电阻器在脉冲负载下可能会失效。当脉冲功率耗散到器件的电阻元件时&#xff0c;它会产生热量并增加电阻器的温度。过热会损坏电阻元件&#xff0c;导致电阻变化甚至设备开路。为了避免在设计中出现这种情况&#xff0c;以下是您在选择元件时应了解的有关电…

RocketMQ - 深入研究一下Broker是如何持久化存储消息的

1. CommitLog消息顺序写入机制 首先思考一下,当生产者的消息发送到一个Broker上的时候,他接收到了一条消息,接着他会对这个消息做什么事情? 首先第一步,他会把整个消息直接写入磁盘上的一个日志文件,叫做CommitLog,直接顺序写入这个文件,如下图: 这个CommitLog是很…

redis运维

1.备份redis配置文件 cp /etc/redis.conf /etc/redis.conf.bak 2.将redis中不要的注释和空行删除 sed -i /^#/d; /^$/d /etc/redis.conf 3.redis配置文件 bing 0.0.0.0 &#xff1a;绑定本机所有网卡 daemonize yes&#xff1a;设置后台运行 requirepass redispwd…