2024.3.1 小项目

news2024/11/14 21:27:39

1、机械臂

#include <myhead.h>
#define SER_IP "192.168.125.32"        //服务器端IP
#define SER_PORT 8888                   //服务器端端口号
 
#define CLI_IP "192.168.68.148"        //客户端IP
#define CLI_PORT 9999                   //客户端端口号
/**********************TCP客户端********************/
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);

	//将端口号快速重用
	int reuse = 1;
	if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1)
	{
		perror("reuse error");
		return -1;
	}
	printf("reuse success\n");

	//2.绑定服务器IP地址和端口号(非必须)
	//2.1填充地址信息结构体
	struct sockaddr_in cin;
	cin.sin_family=AF_INET;
	cin.sin_port=htons(CLI_PORT);
	cin.sin_addr.s_addr=inet_addr(CLI_IP);
 
	//2.2绑定
	if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1){
		perror("bind error");
	}
	printf("bind success\n");
 
	//3.连接服务器
	//3.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);
 
	//3.2连接到服务器
	if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){
		perror("connect error");
		return -1;
	}
 
	//4.进行数据的收发操作
	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);      
		getchar();             //吸收垃圾字符
 
		switch(key)
		{
			case 'w':
				{
					rbuf[3] += 2;        //红色机械臂每次增加3度
					if(rbuf[3]>=90){
						rbuf[3]=90;
					}
					send(cfd,rbuf,sizeof(rbuf),0);   //将键盘控制的结果发送到服务器端
				}
				break;
			case 's':
				{
					rbuf[3] -= 2;        
					if(rbuf[3]<=-90){
						rbuf[3]=-90;
					}
					send(cfd,rbuf,sizeof(rbuf),0);
				}
				break;
			case 'd':
				{
					bbuf[3]+=2;        
					if(bbuf[3]>=180)
					{
						bbuf[3]=180;
					}
					send(cfd,bbuf,sizeof(bbuf),0);
				}
				break;
			case 'a':
				{
					bbuf[3]+=2;        
					if(bbuf[3]<=0)
					{
						bbuf[3]=0;
					}
					send(cfd,bbuf,sizeof(bbuf),0);
				}
				break;
			default:printf("error\n");break;
		}
	}
 
	//5.关闭套接字
	close(cfd);
	return 0;
}

2、基于UDP的tftp通信

#include<myhead.h>
#define SER_IP "192.168.125.32"
#define SER_PORT 69


//定义下载函数
int download(int cfd, struct sockaddr_in sin)
{
	//组件协议包:下载请求
	char pack[516]="";
	short *p1 = (short *)pack;
	*p1 = htons(1);    //设置操作码

	char *p2 = pack+2;
	char file[20] = "";
	printf("请输入要下载的文件名:");
	fgets(file, sizeof(file), stdin);
	file[strlen(file)-1] = 0;
	strcpy(p2, file);   //文件名

	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));
	
	struct sockaddr_in cin;
	socklen_t socklen = sizeof(cin);    //计算客户端地址信息结构体的大小
	//打开文件
	int wfd = -1;
	if((wfd = open(file,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;
			}

		}
		else if(*p1 == ntohs(5))
		{
			printf("error\n");
			break;
		}

	}
	//关闭文件
	close(wfd);
	return 0;

}
int upload(int cfd,struct sockaddr_in sin)
{
	//组件协议包:下载请求
	char pack[516]="";
	short *p1 = (short *)pack;
	*p1 = htons(1);    //设置操作码

	char *p2 = pack+2;
	char file[20] = "";
	printf("请输入要下载的文件名:");
	fgets(file, sizeof(file), stdin);
	file[strlen(file)-1] = 0;
	strcpy(p2, file);   //文件名

	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));
	
	struct sockaddr_in cin;
	socklen_t socklen = sizeof(cin);    //计算客户端地址信息结构体的大小
	
	//以只读的方式打开文件
	int rfd = -1;
	if((rfd = open(file,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;
			}
		}
		//判断是否为错误包
		else if(*p1 == ntohs(5))
		{
			printf("error\n");
			return -1;
		}
	}
	close(rfd);
	return 0;
}
int main(int argc, const char *argv[])
{

	//创建用于通信的套接字
	int cfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(cfd == -1)
	{
		perror("socket error");
		return -1;
	}
	//2、收发数据
	//填充服务器的地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(SER_PORT);
	sin.sin_addr.s_addr = inet_addr(SER_IP);

	int key = 0;
	while(1)
	{
		system("clear");

		printf("\t************1、下载**********\t\n");
		printf("\t************2、上传**********\t\n");
		printf("\t************3、退出**********\t\n");
		printf("请输入要执行的功能:");
		scanf("%d",&key);
		getchar();

		switch(key)
		{
		case 1:
			{
				download(cfd,sin);
			}
			break;
		case 2:
			{
				upload(cfd,sin);
			}
		case 3:
			{
				goto END;
			}
			break;
		
		default:printf("error\n");break;
		}
	}
END:
	//关闭套接字
	close(cfd);

	return 0;
}

思维导图:

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

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

相关文章

Linux:线程的概念

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、线程的概念线程代码的简单示例 总结 前言 本文是对于线程概念的知识总结 一、线程的概念 在课本上&#xff0c;线程是比进程更轻量级的一种指向流 或 线程是在…

数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

自动化测试介绍、selenium用法(自动化测试框架+爬虫可用)

文章目录 一、自动化测试1、什么是自动化测试&#xff1f;2、手工测试 vs 自动化测试3、自动化测试常见误区4、自动化测试的优劣5、自动化测试分层6、什么项目适合自动化测试 二、Selenuim1、小例子2、用法3、页面操作获取输入内容模拟点击清空文本元素拖拽frame切换窗口切换/标…

SpringCloud-Docker安装与详解

Docker 是一款强大的容器化平台&#xff0c;通过其轻量级的容器技术&#xff0c;使应用程序的开发、部署和管理变得更加便捷和高效。本文将深入探讨 Docker 的安装过程&#xff0c;并详细解析其基本概念、组件及常用命令&#xff0c;以帮助读者充分理解和熟练使用 Docker。企业…

基于springboot+vue的工厂车间管理系统

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

Spring Boot与Netty打造TCP服务端(解决粘包问题)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Spring Boot与Netty打造TCP服务端 前言功能目标项目实现maven坐标构建自定义HandlerChannelInitializer实现server实现 前言 在物联网时代&#xff0c;设备之间的通信变得愈发重要。本文将带你踏上一…

微信小程序云开发教程——墨刀原型工具入门(添加批注+其他操作)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

程序员的金三银四求职宝典:如何在关键时期脱颖而出

程序员的金三银四求职宝典&#xff1a;如何在关键时期脱颖而出 程序员的金三银四求职宝典&#xff1a;如何在关键时期脱颖而出摘要 面试技巧分享 &#x1f60a;1. 自我介绍 Tips简洁明了 ✨重点突出 &#x1f50d;结合实例 &#x1f310; 2. 技术问题回答 Tips冷静应对 &#x…

重学SpringBoot3-自动配置机制

重学SpringBoot3-自动配置机制 引言Spring Boot 自动配置原理示例&#xff1a;Spring Boot Web 自动配置深入理解总结相关阅读 引言 Spring Boot 的自动配置是其最强大的特性之一&#xff0c;它允许开发者通过最少的配置实现应用程序的快速开发和部署。这一切都得益于 Spring …

扑克牌翻牌记忆小游戏源码

源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 效果预览 下载地址 https://www.qqmu.com/2296.html

LeetCode每日一题之 移动0

前言&#xff1a; 我的每日一题专栏正式开始更新&#xff0c;我会分享关于我在LeetCode上刷题时的经验&#xff0c;将经典题型拿出来详细讲解&#xff0c;来提升自己及大家的算法能力&#xff0c;希望这篇博客对大家有帮助。 题目介绍&#xff1a; 题目链接&#xff1a;. - …

HTML5+CSS3+移动web——列表、表格、表单

系列文章 HTML5CSS3移动web——HTML 基础-CSDN博客https://blog.csdn.net/ymxk2876721452/article/details/136070953?spm1001.2014.3001.5501 目录 一、列表 无序列表 有序列表 定义列表 二、表格 表格结构标签 基本使用 合并单元格 三、表单 input 标签 input 标签占位文…

模版进阶C++

非类型模版 之前我们写的模版都是在不知道模版&#xff08;类&#xff09;中有的变量的类型是什么的时候&#xff0c;我们先用模版参数定义&#xff0c;当类实例化的时候在传参确认 非类型模版&#xff1a;模版参数定义的时候也可以定义整型类型&#xff08;c20之后才支持其…

Topaz DeNoise AI:一键让照片重获清晰 mac/win版

Topaz DeNoise AI是一款革命性的图片降噪软件&#xff0c;它利用先进的人工智能算法&#xff0c;帮助用户轻松去除照片中的噪点&#xff0c;恢复图像的清晰度和细节。无论是专业摄影师还是摄影爱好者&#xff0c;Topaz DeNoise AI都能成为他们处理图片时的得力助手。 Topaz De…

【Matlab】Matlab电话拨号音合成与识别(代码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

springboot240基于Spring boot的名城小区物业管理系统

基于Spring boot的名城小区物业管理系统的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于物业信息的管理和控制&#xff0c;采用人工登记的方式保存相关数…

第三百八十回

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 013pickers2.gif 我们在上一章回中介绍了"如何实现Numberpicker"相关的内容&#xff0c;本章回中将介绍wheelChoose组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念…

文件操作命令touch、cat、more、cp、mv

touch 创建文件 1&#xff09;可以通过touch命令创建文件。 2&#xff09;语法&#xff1a; touch Linux路径 3&#xff09;touch命令无选项&#xff0c;参数必填&#xff0c;表示要创建的文件路径&#xff0c;相对、绝对、特殊路径符均可以使用。 注&#xff1a;以 d 开头的…

Apache POI的简单介绍与应用

介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。PS&#xff1a; 一般情况下&#xff0c;POI 都是用于操作 Excel 文件&#xff0c;如图&#xff1a; Apache POI 的应用场景&…

韦东山嵌入式Liunx入门驱动开发五

文章目录 一、驱动程序基石1-1 休眠与唤醒1-2 POLL机制1-3 异步通知(1) 异步通知程序解析(2) 异步通知机制内核代码详解 1-4 阻塞与非阻塞1-5 定时器(1) 内核函数(2) 定时器时间单位 1-6 中断下半部 tasklet 本人学习完韦老师的视频&#xff0c;因此来复习巩固&#xff0c;写以…