关于机械臂的控制和基于tftp文件的上传和下载功能的实现

1、TCP客户端控制机械臂代码实现:

#include <myhead.h>
#define IP "192.168.126.58"
#define PORT 8888#define CLI_IP "192.168.126.91"  //客户端IP
#define CLI_PORT 6666  //客户端端口号int main(int argc, const char *argv[])
{//1.创建套接字文件描述符int cfd=-1;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;}//连接服务器//填充要连接的服务器地址信息结构体struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(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("请输入key的值>>>");scanf("%c",&key);getchar();switch(key){case 'w':case 'W':rbuf[3]+=3;if(rbuf[3]>=90){rbuf[3]=90;}send(cfd,rbuf,sizeof(rbuf),0);break;case 's':case 'S':rbuf[3]-=3;if(rbuf[3]<=-90){rbuf[3]=-90;}send(cfd,rbuf,sizeof(rbuf),0);break;case 'd':case 'D':bbuf[3]+=3;if(bbuf[3]>=180){bbuf[3]=180;}send(cfd,bbuf,sizeof(bbuf),0);break;case 'A':case 'a':bbuf[3]-=3;if(bbuf[3]<=0){bbuf[3]=0;}send(cfd,bbuf,sizeof(bbuf),0);break;default:printf("输入错误,请重新输入!!!\n");}}//关闭套接字close(cfd);return 0;
}

2、tftp实现文件的上传和下载

#include <myhead.h>
#define IP "192.168.126.47"
#define PORT 69//定义下载函数
int do_download(int sfd,struct sockaddr_in sin)
{char pack[516]=""; //组件协议包:下载请求short *p1=pack;*p1=htons(1);    //设置操作码char *p2=pack+2;char filename[40]="";printf("请输入要下载的文件名>>>");fgets(filename,sizeof(filename),stdin);filename[strlen(filename)-1]=0;strcpy(p2,filename);char *p4=p2+strlen(p2)+1;strcpy(p4,"octet");       //模式位int packlen=4+strlen(p2)+strlen(p4);   //请求包的大小//向服务器发送请求包if(sendto(sfd,pack,packlen,0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("sendto error");return -1;}printf("请求成功\n");//收取服务器发来的数据包char rbuf[516]="";short *r1=rbuf;//创建一个文件int fd=-1;if((fd=open(filename,O_RDWR|O_CREAT|O_TRUNC,0664))==-1){perror("open error");return -1;}printf("fd=%d\n",fd);socklen_t socklen=sizeof(sin);while(1){//	printf("111\n");bzero(rbuf,sizeof(rbuf));int res=recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&sin,&socklen);if(*r1==ntohs(3)){if(write(fd,rbuf+4,res-4)<0){perror("write error");break;}*r1=htons(4);if(sendto(sfd,rbuf,4,0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("sendto error");return -1;}if(res<516){printf("下载完毕\n");break;}else if(rbuf[1]==5){printf("download error:%s\n",rbuf+4);}}}close(fd);return 0;//如果为512,则读取后,回复一个应打包,继续接收下一个//如果小于512,则读取数据后,回复一个应打包,结束接收数据	}//定义上传函数
int do_upload(int sfd,struct sockaddr_in sin)
{char pack[516]=""; //组件协议包:上传请求short *p1=pack;*p1=htons(2);    //设置操作码char *p2=pack+2;char filename[40]="";printf("请输入要上传的文件名>>>");fgets(filename,sizeof(filename),stdin);filename[strlen(filename)-1]=0;strcpy(p2,filename);char *p4=p2+strlen(p2)+1;strcpy(p4,"octet");       //模式位int packlen=4+strlen(p2)+strlen(p4);   //请求包的大小//向服务器发送请求包if(sendto(sfd,pack,packlen,0,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("sendto error");return -1;}printf("请求成功\n");//从linux系统中读取文件,然后发送给服务器//以只读的形式打开上传的文件int fd1=-1;if((fd1=open(filename,O_RDWR))==-1){perror("open error");return -1;}printf("fd1=%d\n",fd1);socklen_t socklen=sizeof(sin);//用来读取文件的容器char rbuf[516]="";short *r1=rbuf;      //操作码short *r2=rbuf+2;    //块编号int i=1;int len=0;         //读取文件的大小while(1){bzero(rbuf,sizeof(rbuf));int res=recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&sin,&socklen);if(*r1==ntohs(4)){bzero(rbuf,sizeof(rbuf));len=read(fd1,rbuf+4,512);	*r2=htons(i);    //给块编号赋值//把读取文件的内容发送给服务器*r1=htons(3);   //给操作码赋值if(sendto(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&sin,socklen)==-1){perror("sendto error");return -1;}i++;if(len<512){printf("上传完毕\n");break;}else if(rbuf[1]==5){printf("upload error:%s\n",rbuf+4);}}}close(fd1);return 0;}int main(int argc, const char *argv[])
{int sfd=-1;if((sfd=socket(AF_INET,SOCK_DGRAM,0))==-1){perror("socket error");return -1;}printf("sfd=%d\n",sfd);struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);socklen_t socklen=sizeof(sin);int menu=0;while(1){	system("clear");printf("****************\n");printf("*****1.下载*****\n");printf("*****2.上传*****\n");printf("*****3.退出*****\n");printf("****************\n");printf("请输入选项:");scanf("%d",&menu);getchar();//对菜单多分支选择switch(menu){case 1:{//下载功能do_download(sfd,sin);}break;case 2:{//上传功能do_upload(sfd,sin);}break;case 3:goto END;break;default:printf("输入错误,请重新输入\n");}printf("请输入任意键按回车结束\n");while(getchar()!='\n');}END:	close(sfd);return 0;
}

运行结果:

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

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

相关文章

【AI Agent系列】【MetaGPT多智能体学习】3. 开发一个简单的多智能体系统,兼看MetaGPT多智能体运行机制

本系列文章跟随《MetaGPT多智能体课程》&#xff08;https://github.com/datawhalechina/hugging-multi-agent&#xff09;&#xff0c;深入理解并实践多智能体系统的开发。 本文为该课程的第四章&#xff08;多智能体开发&#xff09;的第一篇笔记。主要记录下多智能体的运行…

rsyslog配置中支持的模块

rsyslog 配置语法 官方文档 支持的模块 rsyslog包含了很多模块,主要分为输入模块、输出模块等等。 下面是关于 rsyslog 支持的大的模块分类及其作用的说明: 模块分类作用代表模块链接Output Modules用于将日志消息输出到不同的目的地omfile - 将日志消息输出到文件omstdou…

CF 1867B

代码 #include<bits/stdc.h>using namespace std;const int N1e510;int ans[N];void solve() {//输入字符串长度和字符串int n;string s;cin>>n>>s;//下面说的修改操作是进行异或操作//k表示前后对称位置不相等的字符的对数//m表示前后对称位置相等的字符的…

C/C++基础语法

C/C基础语法 文章目录 C/C基础语法头文件经典问题链表链表基础操作 秒数转换闰年斐波那契数列打印n阶菱形曼哈顿距离菱形图案的定义大数计算 输入输出格式化输入输出getline()函数解决cin只读入一个单词的问题fgets读入整行输出字符数组&#xff08;两种方式puts和printf&#…

Linux或Windows下判断socket连接状态

前言 场景&#xff1a;客户端程序需要实时知道和服务器的连接状态。比较通用的做法应用层是采用心跳机制&#xff0c;每隔一端时间发送心跳能回复说明服务器正常。 实际应用场景中&#xff0c;服务端和客户端并不是一家厂商的&#xff0c;比如说笔者这种情况&#xff0c;服务端…

推特API(Twitter API)V2 查询用户信息

前面章节已经介绍使用code换取Token的整个流程了&#xff0c;这里不再重复阐述了&#xff0c;下面我们介绍如何使用Token查询用户信息等操作。 1.引入相关依赖Maven <dependency> <groupId>oauth.signpost</groupId> <artifactId>signpost-co…

二刷代码随想录——贪心day34

文章目录 前言贪心知识点贪心的套路 贪心一般解题步骤一、860. 柠檬水找零二、406. 根据身高重建队列三、452. 用最少数量的箭引爆气球总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划二刷完卡子哥的刷题计划&#xff0c;加油&#xff01; 二刷决定精…

day10_oop

今日内容 零、 复习昨日 一、作业 二、继承 三、重写 四、this和super 五、访问修饰符 零、 复习昨日 数组创建的两种方式 new int[3];new int[]{值,值2,…}存值: 数组名[下标] 值 构造方法什么作用?有参无参构造什么区别? 创建对象无参创建出的对象属性是默认值有参创建出的…

【力扣白嫖日记】602.好友申请II:谁有最多的好友

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 602.好友申请II&#xff1a;谁有最多的好友 表&#xff1a;RequestAccepted 列名类型requester_idintaccept…

外卖店优先级

题目描述 ”饱了么”外卖系统中维护着N 家外卖店&#xff0c;编号1~N。每家外卖店都有一个优先级&#xff0c;初始时(0时刻)优先级都为0。 每经过1个时间单位&#xff0c;如果外卖店没有订单&#xff0c;则优先级会减少1&#xff0c;最低减到0;而如果外卖店有订单&#xff0c;则…

【AIGC】微笑的秘密花园:红玫瑰与少女的美好相遇

在这个迷人的画面中&#xff0c;我们目睹了一个迷人的时刻&#xff0c;女子则拥有一头柔顺亮丽的秀发&#xff0c;明亮的眼睛如同星河般璀璨&#xff0c;优雅而灵动&#xff0c;她的微笑如春日暖阳&#xff0c;温暖而又迷人。站在红玫瑰花瓣的惊人洪水中。 在一片湛蓝无云的晴…

Liberod的License申请

Liberod的License申请 找到license申请的路径 查找C盘的磁盘序列号 键盘的win+R,输入cmd 输入vol,然后回车 图中的DiskID就是填写你C盘序列号的位置,填写完成后点击Register,几秒钟后会提示你,预计45分钟后会发送到你的邮箱

docker-mysql:5.7安装

1、下载mysql:5.7镜像 [rootlocalhost ~]# docker search mysql (某个XXX镜像名字) [rootlocalhost ~]# docker pull mysql:5.7 按装之前查看一下是否按装过mysql。如果安装过会占用3306端口。 [rootlocalhost ~]# ps -ef | grep mysql 2、安装 # -d&#xff1a;后台运行 #…

C语言基础(五)——结构体与C++引用

七、结构体与C引用 7.1 结构体的定义、初始化、结构体数组 C 语言提供结构体来管理不同类型的数据组合。通过将不同类型的数据组合成一个整体&#xff0c;方便引用 例如&#xff0c;一名学生有学号、姓 名、性别、年龄、地址等属性&#xff0c;如果针对学生的学号、姓名、年龄…

MJ V7 在 V6 Beta 发布后即将推出,即将到来的人工智能 API 访问!

让我们深入了解 MidJourney 的新功能 在发布官方 Beta 之前总结 V6 Alpha 随着 MidJourney V6 Alpha 上周成为默认版本&#xff0c;该团队现在正在努力在过渡到官方 Beta 版本之前进行进一步的改进&#xff1a; 一组 3 个视觉一致性功能 1 — 升级的“风格参考”功能 这将是…

团体程序设计天梯赛 L2-003 月饼(多重背包模板)

L2-003 月饼 分数 25 月饼是中国人在中秋佳节时吃的一种传统食品&#xff0c;不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量&#xff0c;请你计算可以获得的最大收益是多少。 注意&#xff1a;销售时允许取出一部分库存。样例给…

pytorch基础1-pytorch介绍与张量操作

专题链接&#xff1a;https://blog.csdn.net/qq_33345365/category_12591348.html 本教程翻译自微软教程&#xff1a;https://learn.microsoft.com/en-us/training/paths/pytorch-fundamentals/ 初次编辑&#xff1a;2024/3/1&#xff1b;最后编辑&#xff1a;2024/3/1 这是本…

高中数学:分式函数值域的求法

一、求值域的两种基本思路 1、根据函数图像和定义域求出值域。 难点&#xff1a;画出函数图像 2、研究函数单调性和定义域求出值域。 二、函数图像画法 高中所学的分式函数&#xff0c;基本由反比例函数平移得到。 复杂分式函数图像画法的两个要点&#xff1a; a、找垂直、…

mysql 常用命令练习

管理表格从表中查询数据从多个表查询修改数据sql变量类型 管理表格 创建一个包含三列的新表 CREATE TABLE products (id INT,name VARCHAR(255) NOT NULL,price INT DEFAULT 0,PRIMARY KEY(id) // 自增 ); 从数据库中删除表 DROP TABLE product; 向表中添加新列 ALTER TAB…

如何优化阿里云幻兽帕鲁/Palworld的多人联机性能,并避免内存溢出导致的异常退出游戏?

优化阿里云幻兽帕鲁/Palworld的多人联机性能并避免内存溢出导致的异常退出游戏&#xff0c;可以采取以下几种方法&#xff1a; 选择合适的内存配置&#xff1a;由于幻兽帕鲁是一个对内存需求较高的游戏&#xff0c;建议选择至少16GB的内存。对于不同的玩家数量&#xff0c;可以…