网络编程作业day3

news2024/12/29 1:15:49

项目作业1:TCP机械臂测试

客户端操作代码:

/*机械臂客户端控制代码*/
#include <myhead.h>

#define SER_IP   "192.168.125.176" //机械臂服务器IP地址
#define SER_PORT  8888         //机械臂服务器端口号  

#define CLI_IP    "192.168.125.75"  //机械臂客户端ip地址
#define CLI_PORT  1314             //机械臂客户端端口号


/*主函数*/
int main(int argc, const char *argv[])
{
	//创建套接字,获取文件描述符
	int sfd;
	if((sfd = socket(AF_INET, SOCK_STREAM, 0))==-1)
	{
		perror("socket 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(sfd, (struct sockaddr*)&sin, sizeof(sin))==-1)
	{
		perror("connect error");
		return -1;
	}
	//定义发送给机械臂服务器的信息载体数组
	char red[5]={0xff,0x02,0x00,0x00,0xff};//控制红色的机械臂信息载体
	unsigned char blue[5]={0xff,0x02,0x01,0x5A,0xff};//控制红色的机械臂信息载体
	
	//先初始化机械臂位置
	send(sfd,red,sizeof(red),0);
	sleep(1);//防止沾包现象
	send(sfd,blue,sizeof(blue),0);
	puts("开始操作");
	while(1)
	{
		char key;
		scanf("%c",&key);
		getchar();//吸收回车
		switch(key)
		{
		case 'w':case 'W'://控制红色的机械臂每次向右偏移2角度
			{
				red[3]+=2;
				if(red[3]>=90)//防止超出最大角度
				{
					red[3]=90;
				}
				send(sfd,red,sizeof(red),0);
			}
			break;
		case 's':case 'S': //控制红色的机械臂每次向左偏移2角度
			{
				red[3]-=2;
				if(red[3]<=-90)//防止超出最大角度
				{
					red[3]=-90;
				}
				send(sfd,red,sizeof(red),0);
			}
		case 'd':case 'D'://控制蓝色的机械臂每次向右偏移2角度
			{
				blue[3]+=2;
				if(blue[3]>=180)//防止超出最大角度
				{
					blue[3]=180;
				}
				send(sfd,blue,sizeof(blue),0);
			}
			break;
		case 'a':case 'A': //控制蓝色的机械臂每次向左偏移2角度
			{
				blue[3]-=2;
				if(blue[3]<=0)//防止超出最大角度
				{
					blue[3]=0;
				}
				send(sfd,blue,sizeof(blue),0);
			}
			break;
		case 'o':case 'O':
			{
				puts("操作结束");
				goto END;
			}
			break;
		}
	}
END:
	//关闭套接字
	close(sfd);
	return 0;
}

作业1演示视频

项目作业2:基于UDP的TFTP文件传输

客户端代码:

#include <myhead.h>
#define SER_IP "192.168.125.176"        //服务器ip地址
#define SER_PORT 69                //服务器端口号
void down(int cfd,struct sockaddr_in sin,int size);
void uplo(int cfd,struct sockaddr_in sin,int size);
int main(int argc, const char *argv[])
{
	//创建套接字
	int cfd=socket(AF_INET,SOCK_DGRAM,0);
	if(cfd==-1)
	{
		perror("socket 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);
	int size=sizeof(sin);

	int nember;
	while(1)
	{
		system("clear");    //执行终端指令

		printf("\t\t======XXX登录界面============\n");
		printf("\t\t======1、下载============\n");
		printf("\t\t======2、上传============\n");
		printf("\t\t======0、退出============\n");
		printf("请输入选项:");
		scanf("%d", &nember);
		getchar();
		//对菜单多分支选择
		switch(nember)
		{
		case 1:
			{
				/*下载功能*/
				down(cfd,sin,size);
			}
			break;
		case 2:
			{
				/*上传功能*/
			uplo(cfd,sin,size);
			}
			break;

		case 0:
			{
				puts("退出客户端");
				goto END;
			}

		default:printf("您输入的功能有误,请重新输入\n");
		}
		//提示输入任意键按回车结束
		printf("请输入任意键按回车结束!!!\n");
		while(getchar() != '\n');
	}
END:
	//关闭套接字
	close(cfd);
	return 0;
}

//下载功能函数
void down(int cfd,struct sockaddr_in sin,int size)
{
	//下载请求:
	//组建协议包
	char pack[516];
	char filename[100];
	printf("请输入要下载的文件名:");
	fgets(filename,sizeof(filename),stdin);
	filename[strlen(filename)-1]='\0';
	short *p1=(short *)pack;
	*p1=htons(1);
	char *p2=pack+2;
	strcpy(p2,filename);
	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));
	int fd = -1;
	if((fd = open(filename,O_RDWR|O_CREAT|O_TRUNC, 0664)) == -1)
	{
		perror("op en error");
	}

	//收发数据
	while(1)
	{
		//收取服务器发来的数据包
		//判断操作码,以及数据包数据内容是否达到512字节
		//如果是512,则回复应答包,接续接收下一个
		//如果小于512,则回复应答包,结束接收数据

		bzero(pack,sizeof(pack));//清空数据包信息载体
		int res=recvfrom(cfd,pack,sizeof(pack),0,(struct sockaddr*)&sin,&size);//接收数据包
		//判断操作码
		if(*p1==ntohs(3))//收到数据包
		{
			write(fd,pack+4,res-4);
			if(res<516)
			{
				printf("下载完毕\n");
				break;
			}

			*p1=htons(4);
			strcpy(p2,pack+2);
			bzero(pack+4,res-4);
			sendto(cfd,pack,sizeof(pack),0,(struct sockaddr*)&sin,sizeof(sin));//发送ACK包
		}
		else if(*p1==ntohs(5))
		{
			write(1,pack+4,res-5);
			break;
		}					
	}
	close(fd);
}

//上传功能
void uplo(int cfd,struct sockaddr_in sin,int size)
{
	//上传请求:
	//组建协议包
	char pack[516];
	char filename[100];
	printf("请输入要上传的文件名:");
	fgets(filename,sizeof(filename),stdin);
	filename[strlen(filename)-1]='\0';
	short *p1=(short *)pack;
	*p1=htons(2);
	char *p2=pack+2;
	strcpy(p2,filename);
	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));
	int fd;
	if((fd = open(filename,O_RDONLY)) == -1)
	{
		perror("open error");
	}
	int count=512;
	int i=0;
	//收发数据
	while(1)					
	{
		bzero(pack,sizeof(pack));//清空数据包信息载体
		int n=recvfrom(cfd,pack,sizeof(pack),0,(struct sockaddr*)&sin,&size);//接收ACK包
		//判断操作码
		if(*p1==ntohs(4))//收到的包是ACK包
		{
			bzero(pack+4,n-4);
			//发送数据包到服务器
			int res=read(fd,pack+4,count);
			*p1=htons(3);
			i++;
			*(unsigned short*)p2=htons(i);
			sendto(cfd,pack,sizeof(pack),0,(struct sockaddr*)&sin,sizeof(sin));//发送数据包到服务器
			if(res<=0)
			{
				printf("上传完毕\n");
				break;
			}
		}
		else if(*p1==ntohs(5))
		{
			write(1,pack+2,2);
			write(1,pack+4,n-5);
			break;
		}				
	}
	close(fd);
}

作业2演示视频

思维导图

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

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

相关文章

代码随想录算法训练营第35天 | 435. 无重叠区间 ,763.划分字母区间 , 56. 合并区间

贪心算法章节理论基础&#xff1a; https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 435. 无重叠区间 题目链接&#xff1a;https://leetcode.cn/problems/non-overlapping-intervals/ 思路&#xff1a; 相信…

理疗美容按摩小程序有哪些功能

医疗、美容和按摩等行业是一个快速发展的领域&#xff0c;很多美容院和理疗中心都希望通过小程序来提升服务质量和用户体验。下面我们来看看一个理疗美容小程序可以具备哪些功能&#xff0c;并介绍如何使用这些功能。 1. **在线预约服务**&#xff1a;用户可以通过小程序预约理…

第8章:Nginx与Web应用《Nginx实战:从入门到精通》

Nginx不仅仅是一个高效的静态内容服务器和反向代理服务器&#xff0c;它还能与各种流行的Web应用框架和语言环境无缝集成&#xff0c;从而提供强大的动态内容处理能力。在本章中&#xff0c;我们将深入探讨Nginx如何与PHP、Python、Ruby和Node.js等常见的Web应用和语言环境协同…

爬虫入门到精通_实战篇10(使用Redis+Flask维护动态代理池)

1 目标 为什么要用代理池 许多网站有专门的反爬虫措施&#xff0c;可能遇到封IP等问题。互联网上公开了大量免费代理&#xff0c;利用好资源。通过定时的检测维护同样可以得到多个可用代理。 代理池的要求 多站抓取&#xff0c;异步检测定时筛选&#xff0c;持续更新提供接…

【大厂AI课学习笔记NO.56】(9)模型评测

作者简介&#xff1a;giszz&#xff0c;腾讯云人工智能从业者TCA认证&#xff0c;信息系统项目管理师。 博客地址&#xff1a;https://giszz.blog.csdn.net 声明&#xff1a;本学习笔记来自腾讯云人工智能课程&#xff0c;叠加作者查阅的背景资料、延伸阅读信息&#xff0c;及学…

数字化转型导师坚鹏:BLM金融机构数字化转型战略工作坊

BLM金融机构数字化转型战略工作坊 ——以BLM模型为核心&#xff0c;实现知行果合一 课程背景&#xff1a; 很多金融机构存在以下问题&#xff1a; 不知道如何系统地制定金融机构数字化转型战略&#xff1f; 不清楚其它金融机构数字化转型战略是如何制定的&#xff1f; …

动态IP代理技术在网络爬虫中的实际使用

目录 前言 一、什么是动态IP代理技术&#xff1f; 二、动态IP代理技术的实际使用 1. 获取代理IP地址 2. 在网络爬虫中设置代理 3. 周期性更换代理 结论 前言 网络爬虫是一种通过自动化程序从互联网上获取数据的技术。然而&#xff0c;由于某些网站对爬虫进行限制&#…

No matching version found for @babel/traverse@^7.24.0.

问题&#xff1a; npm安装 依赖失败&#xff0c;找不到所需依赖。 原因&#xff1a; npm镜像源中没有该依赖。&#xff08;大概率是因为依赖最近刚更新&#xff0c;当前镜像源没有同步&#xff09; 解决&#xff1a; 查看自己的npm镜像&#xff1a;npm config get registry…

史上最细,企业性能测试步骤详细,测试老鸟带你一篇打通!

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试流程 …

nodejs,JSDOM 补 window环境

window[atob] 是一个在浏览器中使用的 JavaScript 函数&#xff0c;用于将 base64 编码的字符串解码为原始数据。具体来说&#xff0c;atob 函数会将 base64 字符串解码为一个 DOMString&#xff0c;其中包含解码后的二进制数据。这在处理从服务器获取的 base64 编码的数据或在…

[Vulnhub]靶场 Red

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 …

带你从Spark官网啃透Spark Structured Streaming

By 远方时光原创&#xff0c;可转载&#xff0c;open 合作微信公众号&#xff1a;大数据左右手 本文是基于spark官网结构化流解读 Structured Streaming Programming Guide - Spark 3.5.1 Documentation (apache.org) spark官网对结构化流解释 我浓缩了一些关键信息&#xff…

LCR 134. Pow(x, n)

解题思路&#xff1a; 分治 快速幂 Java中向下取整n/2即可 需要结合下图理解&#xff0c;算法就是实现的该过程 class Solution {public double myPow(double x, int n) {if(x 0.0f) return 0.0d;long b n;double res 1.0;//例如:2^-5(1/2)^5if(b < 0) {x 1 / x;b -b…

嵌入式中很多MCU公司,为什么都是仿STM32?

做了单片机开发十多年了&#xff0c;STM32是我用过的单片机里面&#xff0c;最省心的。 用STM32做过的产品&#xff0c;至少10几个以上了。 其实不仅仅是STM32&#xff0c;还有STM8系列&#xff0c;也很稳。 我们无际单片机特训营好几个项目&#xff0c;都用了STM8和STM32系…

挂耳式蓝牙耳机性价比推荐,六大必备选购策略全揭秘!

生活水平的提升往往伴随着个人素质的增长。在公共场合&#xff0c;越来越多的人选择佩戴耳机&#xff0c;以避免打扰他人&#xff0c;同时也追求个人的舒适体验。挂耳式蓝牙耳机因其独特的设计成为了新宠。这类耳机不压迫耳道&#xff0c;提供自然的声音体验&#xff0c;同时确…

【卡尔曼滤波】图文结合带你详细推导卡尔曼滤波(超详解)

大家好&#xff0c;好久不见&#xff0c;我是小政。读研期间&#xff0c;我的研究方向是协作定位&#xff0c;涉及到多机器人分布式融合&#xff0c;主要用到了卡尔曼滤波&#xff0c;CI融合等概念。卡尔曼滤波我也是研究了很久&#xff0c;一直在思考的问题就是&#xff0c;卡…

Chat GPT:AI聊天机器人的革命性突破!

一、引言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的发展日新月异&#xff0c;其中最具代表性的成果之一便是Chat GPT。这款基于自然语言处理&#xff08;NLP&#xff09;技术的聊天机器人&#xff0c;以其高度智能、灵活多变的特点&#xff0c;迅速吸引了全…

Linux 学习笔记(11)

十一、 资源监控 1 、 free 内存监控 语 法&#xff1a; free [-bkmotV][-s < 间隔秒数 >] 补充说明&#xff1a; free 指令会显示内存的使用情况&#xff0c;包括实体内存&#xff0c;虚拟的交换文件内存&#xff0c;共享内存区段&#xff0c;以 及系统核心使用的…

智慧城市建设的新里程碑:公共服务电子支付大屏

随着科技的飞速发展&#xff0c;我们的生活正在经历前所未有的变革。电子支付的出现&#xff0c;无疑是这场变革中的一大亮点&#xff0c;它不仅改变了我们日常的支付方式&#xff0c;更成为智慧城市建设的重要一环&#xff0c;为公众提供了更加便捷、高效的服务体验。 在以前&…

【开源】SpringBoot框架开发民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…