【嵌入式学习】网络编程day03.02

一、项目

1、TCP机械臂测试

#include <myhead.h>
#define SER_IP "192.168.126.32"
#define SER_PORT 8888
#define CER_IP "192.168.126.42"
#define CER_PORT 9891
int main(int argc, const char *argv[])
{
	int wfd=-1;
	//创建套接字
	if((wfd=socket(AF_INET,SOCK_STREAM,0))==-1)
	{
		perror("error");
		return -1;
	}
	/*
	struct sockaddr_in cin;
	cin.sin_family=AF_INET;
	cin.sin_port=htons(CER_PORT);
	cin.sin_addr.s_addr=inet_addr(CER_IP);

	if(bind(wfd,(struct sockaddr *)&cin,sizeof(cin))==-1)
	{
		perror("error");
		return -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);

	if(connect(wfd,(struct sockaddr *)&sin,sizeof(sin))==-1)
	{
		perror("error3");
		return -1;
	}

	char red[5]={0xff,0x02,0x00,0x00,0xff};
	unsigned char blue[5]={0xff,0x02,0x01,0x00,0xff};
	send(wfd,red,sizeof(red),0);
	sleep(1);
	send(wfd,blue,sizeof(blue),0);
	char c=0;
	while(1)
	{
		//写入操作
		system("stty -icanon");
		c=getchar();
		switch(c)
		{
		case 'w':
			{
				red[3]-=5;
				if(red[3]<=-90)
				{
					red[3]=-90;
				}
				send(wfd,red,sizeof(red),0);
				break;
			}
		case 's':
			{
				red[3]+=5;
				if(red[3]>=90)
				{
					red[3]=90;
				}
				send(wfd,red,sizeof(red),0);
				break;
			}
		case 'a':
			{
				blue[3]-=5;
				if(blue[3]>=180)
				{
					blue[3]=0;
				}
				send(wfd,blue,sizeof(blue),0);	
				break;
			}
		case 'd':
			{
				blue[3]+=5;
				if(blue[3]>=180)
				{
					blue[3]=180;
				}
				send(wfd,blue,sizeof(blue),0);	
				break;
			}
fault:{
		  printf("error\n");
		  break;
	  }
		}
	}
		close(wfd);
		return 0;
	}

 

2、基于UDP的TFTP的文件传输

#include <myhead.h>
#define SER_IP "192.168.126.32"
#define SER_PORT 69
int Recv(char *name,int cfd,struct sockaddr_in sin)
{
	//下载请求
	char pack[516]={0};
	short *p1 =(short *)pack;
	*p1 = htons(1);          //设置操作码
	strcpy(pack+2, name);         //文件名
	strcpy(pack+2+strlen(name)+1, "octet");            //模式位
	int packlen = 2+strlen(name)+1 + strlen("octet")+1;    //请求包的大小

	//向服务器发送请求
	sendto(cfd,pack,packlen,0,(struct sockaddr *)&sin,sizeof(sin));

	//打开一个只写文件
	int wrt_fd=-1;
	if((wrt_fd=open(name,O_WRONLY|O_CREAT,0664))==-1)
	{
		perror("wrt_fd error");
		return -1;
	}
	char wbuf[516]="";
	socklen_t socklen=sizeof(sin);
	while(1)
	{
		int recvkeys=recvfrom(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr *)&sin,&socklen);
		if(recvkeys==-1)
		{
			perror("recv reeor");
			close(wrt_fd);
			return -1;
		}
		//printf("接收服务器数据包\n");
		short pw=ntohs(*(short *)wbuf);
		short pw1=ntohs(*(short *)(wbuf+2));
		//		printf("错误码%d\n",pw1);
		//		printf("%d\n",pw);
		//		
		if(pw==3)
		{
			//printf("正在下载数据\n");
			//printf("size%d\n",recvkeys);
			if(recvkeys==516)
			{
				//printf("正在接收数据\n");
				write(wrt_fd,wbuf+4,recvkeys-4);
				char ACK[4];
				*(short *)ACK=htons(4);
				*(short *)(ACK+2)=htons(pw1);
				sendto(cfd,ACK,4,0,(struct sockaddr *)&sin,sizeof(sin));
			}
			else if(recvkeys<516)
			{
				write(wrt_fd,wbuf+4,recvkeys-4);
				char ACK[4];
				*(short *)ACK=htons(4);
				*(short *)(ACK+2)=htons(pw1);	
				sendto(cfd,ACK,4,0,(struct sockaddr *)&sin,sizeof(sin));
				printf("下载完毕\n");
				break;
			}
		}	
		else if(pw==5)
		{
			printf("ERRROR:%d",pw1);
		}
	}
	close(wrt_fd);
}
int Send(char *name,int cfd,struct sockaddr_in sin)
{
	char pack[516];
	short *p1 =(short *)pack;
	*p1 = htons(2);          //设置操作码
	strcpy(pack+2, name);         //文件名
	strcpy(pack+2+strlen(name)+1, "octet");            //模式位
	int packlen = 2+strlen(name)+1 + strlen("octet")+1;    //请求包的大小

	//向服务器发送请求
	sendto(cfd,pack,packlen,0,(struct sockaddr *)&sin,sizeof(sin));

	//打开一个只读文件
	int rd_fd=-1;
	if((rd_fd=open(name,O_RDONLY))==-1)
	{
		perror("rd_fd error");
		return -1;
	}
	char rbuf[512]="";
	socklen_t socklen=sizeof(sin);
	//接收服务器发送的应答包,确认是否可以发送数据
	int keys=recvfrom(cfd,rbuf,sizeof(rbuf),0,(struct sockaddr *)&sin,&socklen);
	//提取ACK的操作码
	short pr=ntohs(*(short *)rbuf);
	//提取ACK的块编号
	short pr1=ntohs(*(short *)(rbuf+2));
	//设置发送数据包的块编号
	short n=1;
	//判断操作码是否为4
	if(pr==4)
	{
		while(1)
		{
			//清空数组
			bzero(rbuf,sizeof(rbuf));
			int num=read(rd_fd,rbuf,sizeof(rbuf));
			if(num==0)
			{
				printf("上传完毕\n");
				break;
			}
			//整合读取数据为数据包并且发送至服务器

			char data[516];
			short *p1 =(short *)data;
			*p1 = htons(3);          //加入操作码
			*(p1+1)=htons(n);
			memcpy(data+4,rbuf,num);		//将读取数据整合
			//向服务器发送数据
			sendto(cfd,data,sizeof(data),0,(struct sockaddr *)&sin,sizeof(sin));
			//等待服务器返回应达包
			char ACK[4];
			int recvkeys=recvfrom(cfd,ACK,sizeof(ACK),0,(struct sockaddr *)&sin,&socklen);
			n=ntohs(*(short *)(ACK+2))+1;
			//printf("%d\n",n);
			int oc=ntohs(*(short *)(ACK));
			//printf("%d\n",oc);
			if(recvkeys==-1)
			{
				perror("recv reeor");
				close(rd_fd);
				return -1;
			}
			if(oc==5)
			{
				printf("error:%d",oc);
				return -1;
			}

			else if(pr==5)
			{
				printf("ERROR:%d\n",pr1);
			}
		}
		close(rd_fd);
	}
}
int main(int argc, const char *argv[])
{
	int wfd=-1;
	//创建套接字
	if((wfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
	{
		perror("error");
		return -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);	
while(1)
{
	sleep(1);
	system("clear");
	//设置选择界面
	printf("\t\t***********1、下载**************\t\n");
	printf("\t\t***********2、上传**************\t\n");
	printf("\t\t***********3、退出**************\t\n");
	int key;
	printf("请选择:");
	scanf("%d",&key);
	switch(key)
	{
	case 1:
		{
			char name[128]="";
			printf("输入下载的文件:");
			scanf("%s",name);
			Recv(name,wfd,sin);
		
		}
			break;
	case 2:
		{
			char name[128]="";
			printf("输入上传的文件:");
			scanf("%s",name);
			Send(name,wfd,sin);
	
		}
			break;
	case 3:
		{
			printf("已退出程序\n");
			return 0;
		
		}
			break;
	default :
			{
				printf("错误输入\n");
				break;
			}
	}
}

	close(wfd);
	return 0;
}

现象 

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

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

相关文章

【PyTorch】成功解决AttributeError: ‘Tuple‘ object has no attribute ‘cuda‘

【PyTorch】成功解决AttributeError: ‘Tuple‘ object has no attribute ‘cuda‘ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&…

Vue.js大师: 构建动态Web应用的全面指南

VUE ECMAScript介绍什么是ECMAScriptECMAScript 和 JavaScript 的关系ECMAScript 6 简介 ES6新特性let基本使用const不定参数箭头函数对象简写模块化导出导入a.jsb.jsmain.js Vue简介MVVM 模式的实现者——双向数据绑定模式 Vue环境搭建在页面引入vue的js文件即可。创建div元素…

分享Selenium测试工具用来模拟用户浏览器的操作

执行JS的类库&#xff1a;execjs&#xff0c;PyV8&#xff0c;selenium&#xff0c;node pip list pip install selenium pip install xlrd pip install xlwt pip install PyExecJS pip install xlutils selenium测试工具可以用来模拟用户浏览器的操作&#xff0c;其支持的浏览…

ssm172旅行社管理系统的设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一 、设计说明 1.1 研究…

【InternLM 笔记】使用InternStudio 体验书生·浦语2-chat-1.8b随记

书生浦语2-chat-1.8b 介绍 书生浦语-1.8B (InternLM2-1.8B) 是第二代浦语模型系列的18亿参数版本。为了方便用户使用和研究&#xff0c;书生浦语-1.8B (InternLM2-1.8B) 共有三个版本的开源模型&#xff0c;他们分别是&#xff1a; InternLM2-1.8B: 具有高质量和高适应灵活性…

CSP-201712-2-游戏

CSP-201712-2-游戏 解题思路 初始化变量&#xff1a;定义整数变量n和k&#xff0c;分别用来存储小朋友的总数和淘汰的特定数字。然后定义了num&#xff08;用来记录当前报的数&#xff09;和peopleIndex&#xff08;用来记录当前报数的小朋友的索引&#xff09;。 初始化小朋…

什么是VR虚拟社区|VR元宇宙平台|VR主题馆加盟

VR虚拟社区是指一种基于虚拟现实技术构建的在线社交平台或环境&#xff0c;用户可以在其中创建虚拟化的个人形象&#xff08;也称为avatars&#xff09;并与其他用户进行交流、互动和合作。在VR虚拟社区中&#xff0c;用户可以选择不同的虚拟场景和环境&#xff0c;如虚拟公园、…

autocrlf和safecrlf

git远程拉取及提交代码&#xff0c;windows和linux平台换行符转换问题&#xff0c;用以下两行命令进行配置&#xff1a; git config --global core.autocrlf false git config --global core.safecrlf true CRLF是windows平台下的换行符&#xff0c;LF是linux平台下的换行符。…

揭示 Wasserstein 生成对抗网络的潜力:生成建模的新范式

导 读 Wasserstein 生成对抗网络 (WGAN) 作为一项关键创新而出现&#xff0c;解决了经常困扰传统生成对抗网络 (GAN) 的稳定性和收敛性的基本挑战。 由 Arjovsky 等人于2017 年提出&#xff0c;WGAN 通过利用 Wasserstein 距离彻底改变了生成模型的训练&#xff0c;提供了一个…

如何在群晖Docker运行本地聊天机器人并结合内网穿透发布到公网访问

文章目录 1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛&#xff0c;包括聊天机…

Tokenize Anything via Prompting论文解读

文章目录 前言一、摘要二、引言三、模型结构图解读四、相关研究1、Vision Foundation Models2、Open-Vocabulary Segmentation3、Zero-shot Region Understanding 五、模型方法解读1、Promptable TokenizationPre-processingPromptable segmentationConcept predictionZero-sho…

STM32标准库开发—实时时钟(BKP+RTC)

BKP配置结构 注意事项 BKP基本操作 时钟初始化 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);PWR_BackupAccessCmd(ENABLE);//设置PWR_CR的DBP&#xff0c;使能对PWR以及BKP的访问读写寄存器操作 uint16_t ArrayW…

LeetCode--72

72. 编辑距离 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 "horse", word2 …

Mysql与StarRocks语法上的不同

&#x1f413; 序言 StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理&#xff0c;可以用StarRocks 来支持多种数据分析场景的极速分析。 &#x1f413; 语法…

STL容器之string类

文章目录 STL容器之string类1、 什么是STL2、STL的六大组件3、string类3.1、string类介绍3.2、string类的常用接口说明3.2.1、string类对象的常见构造3.2.2、string类对象的容量操作3.2.3、string类对象的访问及遍历操作3.2.4、 string类对象的修改操作3.2.5、 string类非成员函…

springBoot整合Redis(二、RedisTemplate操作Redis)

Spring-data-redis是spring大家族的一部分&#xff0c;提供了在srping应用中通过简单的配置访问redis服务&#xff0c;对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装&#xff0c;RedisTemplate提供了redis各种操作、异常处理及序列化&#xff0c;支持发布订阅&…

支持向量机算法(带你了解原理 实践)

引言 在机器学习和数据科学中&#xff0c;分类问题是一种常见的任务。支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种广泛使用的分类算法&#xff0c;因其出色的性能和高效的计算效率而受到广泛关注。本文将深入探讨支持向量机算法的原理、特点、应用&…

Unity(第二十一部)动画的基础了解(感觉不了解其实也行)

1、动画组件老的是Animations 动画视频Play Automatically 是否自动播放Animate Physics 驱动方式&#xff0c;勾选后是物理驱动Culling Type 剔除方式 默认总是动画化就会一直执行下去&#xff0c;第二个是基于渲染播放&#xff08;离开镜头后不执行&#xff09;&#xff0c; …

蓝桥杯倒计时 43天 - 前缀和,单调栈

最大数组和 算法思路&#xff1a;利用前缀和化简 for 循环将 n^2 简化成 nn&#xff0c;以空间换时间。枚举每个 m&#xff0c;m是删除最小两个数&#xff0c;那k-m就是删除最大数&#xff0c;m<k&#xff0c;求和最大的值。暴力就是枚举 m-O(n)&#xff0c;计算前 n-(k-m)的…

Revit-二开之创建TextNote-(1)

Revit二开之创建TextNote TextNode在Revit注释模块中&#xff0c;具体位置如图所示 图中是Revit2018版本 【Revit中的使用】 Revit 中的操作是点击上图中的按钮在平面视图中点击任意放置放置就行&#xff0c; 在属性中可以修改文字 代码实现 创建TextNode ExternalComm…