关于机械臂的控制和基于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.hqwc.cn/news/505671.html

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

相关文章

nginx笔记整理

目录 一.Nginx基础介绍 二.nginx安装配置 三.Nginx配置文件 3.1nginx主配置文件(/etc/nginx/nginx.conf) 3.2默认的网站配置文件(/etc/nginx/conf.d/default.conf) 四.创建新的虚拟主机 五.Nginx日志 5.1nginx日志格式 5.2查看日志 5.3日志缓存(了解) 5.4日志轮转(/…

基于springboot+vue的二手车交易系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

MySQL:索引的优化方法

索引是帮助存储引擎快速获取数据的一种数据结构&#xff0c;形象的说就是索引是数据的目录。 索引创建的时机&#xff1a; 索引并不是越多越好的&#xff0c;虽然他再查询时会提高效率&#xff0c;但是保存索引和维护索引也需要一定的空间和时间成本的。 不创建索引&#xff1a…

基于YOLOv8的多端车流检测系统(用于毕设+开源)

目录 ✨基于YOLOv8&#x1f680;的多端车流检测系统-MTAS (Multi-Platform Traffic Analysis System) 一、基本功能介绍 1、客户端 &#xff08;pyside6yolov8pytorch&#xff09; 2、网页端&#xff08;Vue3TypestriptPython3MySQL&#xff09; 3、创新点&#xff08;毕设需…

ABAP - SALV教程08 列设置热点及绑定点击事件

实现思路&#xff1a;将列设置成热点&#xff0c;热点列是可点击的&#xff0c;再给SALV实例对象注册点击事件即可&#xff0c;一般作用于点击单号跳转到前台等功能 "设置热点方法METHODS:set_hotspot CHANGING co_alv TYPE REF TO cl_salv_table...."事件处理方法M…

python 使用curl_cffi 绕过jax3指纹-Cloudflare 5s盾

现在越来越多的网站已经能够通过JA3或者其他指纹信息&#xff0c;来识别你是不是爬虫了。传统的方式比如换UA&#xff0c;加代理是没有任何意义了&#xff0c;所以这个时候我们就需要使用到curl_cffi 了。 1.TLS 指纹是啥&#xff1f; 在绝大多数的网站都已经使用了 HTTPS&am…

微信小程序触屏事件_上划下划事件

一、微信小程序触屏事件 bindtouchstart&#xff1a;手指触摸动作开始 bindtouchmove&#xff1a;手指触摸后移动 bindend&#xff1a;手指触摸动作结束 属性类型说明touchesArray触摸事件&#xff0c;当前停留在屏幕中的触摸点信息的数组 Touch 对象 属性类型说明identi…

【Excel】【正则】判断手机号是否正确

发现导出的手机号&#xff0c;有部分存在问题&#xff0c;故想直接通过excel做正则的判断 先说结论&#xff1a;通过VBA实现了正则函数的嵌入&#xff0c;但实际效率非常低下&#xff0c;80万的数据跑了半小时&#xff08;T14 十代i7&#xff09; 参考文章&#xff1a;正则表…

点云数据结构化与体素化理论学习

一、PCD点云数据存储格式的进一步认识 &#xff08;一&#xff09;PCD点云存储格式相较于其它存储格式&#xff08;如PLY、STL、OBJ、X3D等&#xff09;的优势[1] &#xff08;1&#xff09;具有存储和处理有组织的点云数据集的能力&#xff0c;这对于实时应用和增强现实及机器…

主网NFT的发布合约

1.什么是nft? NFT:Non-fungible-token 非同质化货币 2.新建suimove项目 使用sui move new 项目名命令新建sui move项目 sui move new nft_qyx项目结构如下: 3.写nft合约 module qyx123::nft{use sui::object::{Self, UID};use sui::transfer;use sui::tx_context::{Sel…

Elasticsearch搜索引擎

目录 初识elasticsearch 了解ES 什么是elasticsearch elasticsearch的发展 搜索引擎技术排名&#xff1a; 总结 倒排索引 正向索引和倒排索引 正向索引 倒排索引 总结 es的一些概念 文档 索引 概念对比 架构 总结 安装es&#xff0c;kibana 安装es 安装kiba…

Javaweb之SpringBootWeb案例之自动配置的原理分析的详细解析

3.2.3 原理分析 3.2.3.1 源码跟踪 前面我们讲解了在项目当中引入第三方依赖之后&#xff0c;如何加载第三方依赖中定义好的bean对象以及配置类&#xff0c;从而完成自动配置操作。那下面我们通过源码跟踪的形式来剖析下SpringBoot底层到底是如何完成自动配置的。 源码跟踪技巧…