2024.3.1 小项目

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;
}

思维导图:

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

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

相关文章

Mybatis plus扩展功能-Db静态工具

目录 1 前言 2 使用方法 2.1 Db静态工具拥有的部分方法 2.2 举例 1 前言 在我们的服务层中&#xff0c;有时为了实现一个方法需要引入其它的Mapper层方法&#xff0c;但是&#xff0c;这样可能出现循环依赖。虽然Spring已经给我们解决了简单的循环依赖问题&#xff0c;但是…

【书生·浦语大模型实战营】第4节 课后作业

XTuner 大模型单卡低成本微调实战 0. 课程链接1. 课后作业1.2 进阶作业 0. 课程链接 课程链接&#xff1a;https://github.com/InternLM/tutorial/blob/main/xtuner/README.md 1. 课后作业 构建数据集&#xff0c;使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你…

数字化转型导师坚鹏:证券公司数字化思维升级之道

证券公司数字化思维升级之道 ——数字化思维之六脉神剑 课程背景&#xff1a; 很多证券公司存在以下问题&#xff1a; 不知道数字化转型如何改变思维模式&#xff1f; 不清楚需要建立什么样的数字化思维&#xff1f; 不知道如何开展数字化思维提升工作&#xff1f; 课…

Redis小白入门教程

Redis入门教程 1. Redis入门1.1 Redis简介1.2 Redis服务启动与停止1.2.1 Redis下载1.2.2 服务启动命令1.2.3 客户端连接命令1.2.4 修改Redis配置文件 2. Redis数据类型2.1 五种常用数据类型介绍2.1.1 字符串操作命令2.1.2 哈希操作命令2.1.3 列表操作命令2.1.4 集合操作命令2.1…

JWT的原理与隐患

什么是JWT JWT通常由三部分组成&#xff1a;头信息&#xff08;header&#xff09;, 消息体&#xff08;payload&#xff09;和签名&#xff08;signature&#xff09;。 头信息指定了该JWT使用的签名算法 header {"alg":"HS256","typ":"…

9.8分割等和子集(LC416-M)

算法&#xff1a; 可以转换为背包问题&#xff1a; 一个商品如果可以重复多次放入是完全背包&#xff0c;而只能放入一次是01背包&#xff0c;写法还是不一样的。 要明确本题中我们要使用的是01背包&#xff0c;因为元素我们只能用一次。 只有确定了如下四点&#xff0c;才能…

C++_程序流程结构_循环结构_while

while循环结构 作用 满足循环条件&#xff0c;执行循环语句 语法 while (循环条件&#xff09;{循环语句}解释 只要循环条件的结果为真&#xff0c;就执行循环语句 流程图 示例 注意 在执行循环语句时候&#xff0c;程序必须提供跳出循环的出口&#xff0c;否则出现死循…

B083-SpringCloud-eureka ribbon feign hystrix

目录 eureka基础项目准备注册中心的搭建生产者注册到eureka消费者注册到eureka并通过eureka调用生产者eureka集群 服务提供者集群集群以后消费者调用服务的问题ribbon消费者使用ribbon负载均衡赋值负载均衡策略负载均衡优化 feignHystrixHystrix概述Ribbon搭配Hystrix降级处理F…

springboot+vue学生信息管理系统学籍 成绩 选课 奖惩,奖学金缴费idea maven mysql

技术栈 ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7 框架&#xff1a;ssmspringboot都有 前端&#xff1a;vue.jsElementUI 详细技术&#xff1a;springbootSSMvueMYSQLMAVEN 数据库工具&#xff1a;Navicat/SQLyog都可以学生信息管理系统主要实现角…

★【递归】【链表】Leetcode 21. 合并两个有序链表

★【递归】【链表】Leetcode 21. 合并两个有序链表 解法1 &#xff1a;递归链表 简直是好题啊好题多做做 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- 解法1 &#xff1a;递归链表 简直是好题啊好题多做做 >>>…

解决Excel客户端中的Copilot灰色不可用

很多小伙伴已经用上了office套件中的copilot功能 Copilot for Microsoft 365账号介绍与相关问题的解答 Copilot for Microsoft 365账号登录指南 Copilot for Microsoft 365功能使用指南 问题发现 大部分人使用的都是Word和PowerPoint功能&#xff0c;但是也有部分小伙伴使…

(学习日记)2024.03.03:UCOSIII第五节:常用汇编指令+OS初始化+启动任务+任务切换

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

力扣hot5---双指针

题目&#xff1a; 解决方案&#xff1a;双指针 指针 i 指向最左侧&#xff0c;指针 j 指向最右侧。此时在宽度上达到了最大值&#xff0c;那么哪个柱子更矮&#xff0c;哪个柱子向内部移动&#xff0c;知道 i 与 j 相遇。为什么呢&#xff1f; 如果哪个哪个柱子更矮&#xff0c…

Python实现DMI工具判断信号:股票技术分析的工具系列(3)

Python实现DMI工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;3&#xff09; 介绍算法解释 代码rolling函数介绍完整代码 介绍 先看看官方介绍&#xff1a; DMI (趋向指标&#xff09; 用法 1.PDI线从下向上突破MDI线&#xff0c;显示有新多头进场&#xff0c;为…

SketchUp Pro 2023:颠覆传统,重塑设计世界mac/win版

SketchUp Pro 2023是一款强大的三维建模软件&#xff0c;专为设计师、建筑师和创意专业人士打造。这款软件以其直观易用的界面和强大的功能而著称&#xff0c;为用户提供了无限的创意空间。 SketchUp Pro 2023软件获取 SketchUp Pro 2023在用户体验方面进行了全面的优化&#…

SMBGhost漏洞技术分析与防御方案

事件分析 最近国内外各安全厂商都发布了SMBGhost(CVE-2020-0796)漏洞的预警报告和分析报告&#xff0c;笔者利用周末休息时间也研究了一下&#xff0c;就算是做一个笔记了&#xff0c;分享给大家一起学习下&#xff0c;目前外面研究的POC大部分是通过SMB压缩数据包长度整数溢出…

YOLOv9改进|使用CARAFE轻量级通用上采样算子

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 CARAFE 发表于ICCV2019。上采样操作可以表示为每个位置的上采样核和输入特征图中对应邻域的像素做点积&#xff0c;我们称之为特征重…

笔记74:在SLAM建图过程中,为什么要使用【障碍物点云配准算法】和【里程计估算算法】结合的方法

仅使用【障碍物点云配准算法】&#xff0c;很容易导致在一条长通道中&#xff0c;因为前后两帧的雷达点云图过于相似&#xff0c;导致特征匹配一直完全重合&#xff0c;使得机器人建图一直停留在原地&#xff0c;但实体机器人早就沿着通道跑向远端了&#xff1b; 使用Hector_ma…

【JavaEE进阶】CSS选择器的常见用法

CSS选择器的主要功能就是选中页面指定的标签元素&#xff0c;选中了元素&#xff0c;才可以设置元素的属性。 CSS选择器主要有以下几种: 标签选择器类选择器id选择器复合选择器通配符选择器 接下来用代码来学习这几个选择器的使用。 <!DOCTYPE html> <html lang&q…

springboot2入门到实战-整合QQ邮箱

springboot整合QQ邮箱 配置邮箱 登录邮箱服务器&#xff1a; 登录QQ邮箱 springboot整合email 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency>配…