机械臂与tftp

机械臂: 

#include<myhead.h>
#define SER_IP "192.168.126.2"
#define SER_PORT 8888#define CLI_IP "192.168.252.165"
#define CLI_PORT 9999int main(int argc, const char *argv[])
{int cfd=socket(AF_INET,SOCK_STREAM,0);if(cfd==-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("connect 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);if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");return -1;}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){scanf("%c",&key);fflush;switch(key){case'W':case'w':{rbuf[3]+=2;if(rbuf[3]>=90){rbuf[3]=90;}send(cfd,rbuf,sizeof(rbuf),0);}break;case's':case'S':{rbuf[3]=rbuf[3]-2;if(rbuf[3]<=-90){rbuf[3]=90;}send(cfd,rbuf,sizeof(rbuf),0);}break;case'd':case'D':{bbuf[3]+=2;if(bbuf[3]>=180){bbuf[3]=180;}send(cfd,bbuf,sizeof(bbuf),0);}break;case'a':case'A':{bbuf[3]=bbuf[3]-2;if(bbuf[3]>=180){bbuf[3]=0;}}break;}}close(cfd);return 0;
}

tftp:

#include <myhead.h>
#define IP "192.168.126.2"
#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/717406.shtml

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

相关文章

支持向量机 SVM | 线性可分:公式推导

目录 一. SVM的优越性二. SVM算法推导小节概念 在开始讲述SVM算法之前&#xff0c;我们先来看一段定义&#xff1a; 支持向量机(Support VecorMachine, SVM)本身是一个二元分类算法&#xff0c;支持线性分类和非线性分类的分类应用&#xff0c;同时通过OvR或者OvO的方式可以应用…

安装Docker及DockerCompose

0.安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道…

10.轮廓系数-机器学习模型性能的常用的评估指标

轮廓系数&#xff08;Silhouette Coefficient&#xff09;是评估聚类算法效果的常用指标之一。它结合了聚类的凝聚度&#xff08;Cohesion&#xff09;和分离度&#xff08;Separation&#xff09;&#xff0c;能够量化聚类结果的紧密度和分离度。 背景 1.聚类分析的背景 在…

NDK介绍

NDK&#xff08;Native Development Kit&#xff09;是一个用于在Android平台上开发C和C代码的工具集。它允许开发人员使用C和C编写部分代码&#xff0c;并将其编译为本机代码库&#xff08;.so文件&#xff09;&#xff0c;然后通过JNI在Java应用程序中调用这些本地代码。 ND…

CUDA学习笔记01:vs2019环境配置

为了在window11 vs2019下使用CUDA编程&#xff0c;配置了一下环境&#xff0c;但是我电脑一开始自带CUDA&#xff0c;然后再安装的vs2019&#xff0c;这样安装顺序上是不对的&#xff0c;vs2019找不到CUDA配置项&#xff0c;网上找了很多办法貌似都不好使而且很复杂。 那么最快…

c++之拷贝构造和赋值

如果一个构造函数中的第一个参数是类本身的引用&#xff0c;或者是其他的参数都有默认值&#xff0c;则该构造函数为拷贝构造函数。 那么什么是拷贝构造呢&#xff1f;利用同类对象构造一个新对象。 1&#xff0c;函数名和类必须同名。 2&#xff0c;没有返回值。 3&#x…

Linux多线程控制:深入理解与应用(万字详解!)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;どうして (feat. 野田愛実) 0:44━━━━━━️&#x1f49f;──────── 3:01 &#x1f504; ◀️ ⏸ ▶️ …

6.2 指标的应用与设计(12%)

1、指标的作用 用简约的汇总数据量化业务强弱。 2、指标的理解 特点&#xff1a; &#xff08;1&#xff09;指标是游离态的&#xff0c;无法单独实现数据统计 eg&#xff1a;总销售额、总销售量 &#xff08;2&#xff09;需与统计维度结合&#xff0c;明确统计指标的对…

帕累托优化基本概念,如何系统学习?

帕累托优化&#xff0c;也称为帕累托改善或帕累托改进&#xff0c;是以意大利经济学家帕累托&#xff08;Vilfredo Pareto&#xff09;命名的。它的基本概念是在没有使任何人境况变坏的前提下&#xff0c;使得至少一个人变得更好。帕累托最优是指没有进行帕累托改进余地的状态&…

047 内部类

成员内部类用法 /*** 成员内部类** author Admin*/ public class OuterClass {public void say(){System.out.println("这是类的方法");}class InnerClass{public void say(){System.out.println("这是成员内部类的方法");}}public static void main(Stri…

(二)逻辑回归与交叉熵--九五小庞

什么是逻辑回归 线性回归预测的是一个连续值&#xff0c;逻辑回归给出的“是”和“否”的回答 Singmoid sigmoid函数是一个概率分布函数&#xff0c;给定某个输入&#xff0c;它将输出为一个概率值 逻辑回归损失函数 平方差所惩罚的是与损失为同一数量级的情形&#xff0…

Springboot企业级开发--1.开发入门

目录 目录 一.Spring Boot的主要特点和优势包括&#xff1a; 二.Spring Boot的核心功能可以归纳为以下几点&#xff1a; 三.Springboot是如何解决问题&#xff1f; Spring Boot 是一个开源的Java框架&#xff0c;其设计目标是为了简化新Spring应用的初始搭建以及开发过程。…

SandBox中的JavaAgent技术

8.1 JavaAgent Java Agent 是一种强大的技术&#xff0c;在运行时动态修改已加载类的字节码&#xff0c;为应用程序注入额外的功能和行为。 JDK 1.5 支持静态 Instrumentation&#xff0c;基本的思路是在 JVM 启动的时候添加一个代理&#xff08;javaagent&#xff09;&#…

基于阿里云OSS上传图片实战案例

一、案例描述 基于Springboot框架实现一个上传图片到阿里云服务端保存的小案例。 二、准备工作 基于Springboot免费搭载轻量级阿里云OSS数据存储库&#xff08;将本地文本、照片、视频、音频等上传云服务保存&#xff09;-CSDN博客 三、代码 新建这两个类&#xff1a;一个…

Golang函数make介绍和用法

1.介绍 golang分配内存主要有内置函数new和make 相同点: 他们的第一个参数都是一个类型而不是一个值 不同点: new可分配任意类型的数据make只能为slice, map, channel分配内存new返回的是指针make返回类型的是引用而不是指针,并且返回的值也依赖于具体传入的类型, 这种不同点的…

C++原子操作

8.3.5 原子操作 在同一时刻只有唯一的线程对这个资源进行访问。这有点类似互斥对象对共享资源的访问的保护&#xff0c;但是原子操作更加接近底层&#xff0c;因而效率更高。 &#xff08;1&#xff09;pthread #include <stdatomic.h> atomic_int atomicVariable; at…

Python如何从SQL Server存取数据?

在Python中&#xff0c;你可以使用各种库来连接和操作 SQL Server 数据库。一种常用的库是pyodbc&#xff0c;它是一个用于连接到各种数据库的开源 Python 库&#xff0c;包括 SQL Server。以下是连接到 SQL Server 并存取数据的基本步骤&#xff1a; 1、安装 pyodbc 库&#…

LANA: A Language-Capable Navigator for Instruction Following and Generation

摘要 最近&#xff0c;视觉语言导航&#xff08;VLN&#xff09;——要求机器人代理遵循导航指令——已经取得了巨大的进步。然而&#xff0c;现有文献最强调将指令解释为行动&#xff0c;只提供“愚蠢”的寻路代理。在本文中&#xff0c;我们设计了 LANA&#xff0c;一种支持…

【C++ 异常处理】

C 异常处理 ■ C 异常处理简介■ throw (抛出异常)■ catch (捕获异常)■ try&#xff08;&#xff09;■ C 标准的异常 ■ C 异常处理简介 C 异常处理涉及到三个关键字&#xff1a;try、catch、throw。 属性描述throw当问题出现时&#xff0c;程序会抛出一个异常。这是通过使…

【LeetCode-1143】最长公共子序列(动归)

目录 题目描述 解法1&#xff1a;动态规划 代码实现 题目链接 题目描述 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除…