华清远见作业第二十八天——网络编程(第三天)

news2024/12/23 21:57:44

思维导图:

 向服务器发送数据实现下载

代码:

#include <a.h>
void menu();
int download(int cfd, struct sockaddr_in sin);
#define SER_PORT 69
#define SER_IP "192.168.125.4"
int main(int argc, const char *argv[])
{
	//1创建用于通信的套接字文件描述符
	int cfd=socket(AF_INET,SOCK_DGRAM,0);
	if(cfd==-1)
	{
		perror("111socket error:");
		return -1;
	}
	//2绑定
	//3填充服务器的地址信息结构体
	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 choose;
	while(1)
	{
		menu();
		printf("请输入相关操作:");
		scanf("%d",&choose);
		switch(choose)
		{
			case 1:
      			  {
				//下载功能
				download(cfd,sin);
				break;
			  }
			case 2:
      			  {
				//上传功能
				//download(cfd,sin);
				break;
			  }
			case 3:
      			  {
				//退出功能
				//download(cfd,sin);
				goto END;
				break;
			  }
		}
	}
END:
	return 0;
	
}
//下载
int download(int cfd, struct sockaddr_in sin)
{
	char downloadname[128]="";
	printf("请输入你要下载的文件:");
	scanf("%s",downloadname);
	getchar(); //防止垃圾字符
	//向服务器发送下载请求
	char buf[512+2+2]=""; //数据包
	//组装请求数据
	short *p1=(short *)buf;
	*p1=htons(1);
	
	char *p2=buf+2;
	strcpy(p2,downloadname);  // 文件名字
	
	char *p3=p2+strlen(p2)+1;
	strcpy(p3,"octet");  //文件传输模式

	int len=4+strlen(p2)+strlen(p3); //要发送的长度
	//向服务器发送请求
	sendto(cfd,buf,len,0,(struct sockaddr*)&sin,sizeof(sin));
	//循环接收发送应答包
	ssize_t recvlen; //存放客户端发来消息函数的返回值(读取数据的个数)
	int fd=-1;//文件描述符号
	unsigned short num=1; //每一块的数据编号,初始值为1 //为啥是无符号型的我也不知道,有符号的就是错的那个机械臂也是必须要无符号的,好像是取值范围的问题,原来的short的取值范围太小了,unsigned short的取值范围大一点
	socklen_t addrlen = sizeof(sin);
	int flag=0;  //防止被写入的文件重复打开
	while(1)
	{	
		//清空数据包
		bzero(buf,sizeof(buf));
		//读取服务器发回来的信息(读取数据的个数)
		recvlen=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&addrlen);
		if(recvlen==-1)
		{
			printf("发送失败\n");
			perror("发送error:");
			return -1;
		}
		if(3==buf[1])   //前两位是3为数据包
		{	
			if(0 == flag)     //防止文件重复打开
			{
				//创建并打开文件,准备存储
				fd = open(downloadname, O_WRONLY|O_CREAT|O_TRUNC, 0664);  //文件名字
				if(fd==-1)
				{
					perror("open error");
					return -1;
				}
				flag=1;
			}
			//判断数据包编号是否是自己想要的
			if(htons(num)==*(unsigned short*)(buf+2))  //强转为short并取值与num的网络字节序比
			{
				//判断成功后开始从数据包中提取数据写入到刚刚创建的文件中
				int geshu=write(fd,buf+4,recvlen-4);//减去前面的操作码和块编号
				if(geshu==-1)
				{
					printf("写入错误\n");
					perror("写入错误:");
					return -1;
				}
				//回复ack包
				//ack的全部内容和数据包的前四位内容一样
				//修改操作码
				buf[1]=4;
				//向服务器发送ack
				geshu=sendto(cfd,buf,4,0,(struct sockaddr*)&sin,sizeof(sin));
				if(geshu==-1)
				{
					printf("ack发送错误\n");
					return -1;
				}
				//判断是否传输结束
				if(recvlen<512+2+2) //数据包要加上操作位和标志位
				{
					printf("文件传输完成了\n");
					break;
				}
				num++;  //每一个块编号加1
			}
		}
		else if(5==buf[1]) // 前两位是5表示内容错误,错误包
		{
			//错误
			printf("错误信息为:%s\n",buf+4);
			break;
		}
		
			
	}
	//关闭套接字
	close(cfd);
	return 0;
}
//目录
void menu()
{
        printf("******************\n");
        printf("*     1.下载     *\n");
        printf("*     2.上传     *\n");
        printf("*     3.退出     *\n");
        printf("******************\n");	
}

运行效果:

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

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

相关文章

基于ssm的线上旅游体验系统+vue论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

生意参谋指数转换异常,有什么可替代的天猫数据查询工具?

近期&#xff0c;越来越多天猫平台的商家反映生意参谋的指数转换功能无法正常使用。 原本用指数替代真实数据的功能就已经把参考的意义和价值减半&#xff0c;而如今如果连指数转换功能都无法使用&#xff0c;必然会大大影响品牌商家在电商运营过程中严谨的数据分析和测算结果&…

短视频IP运营流程架构SOP模板PPT

【干货资料持续更新&#xff0c;以防走丢】 短视频IP运营流程架构SOP模板PPT 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 抖音运营资料合集&#xff08;完整资料包含以下内容&#xff09; 目录 抖音15秒短视频剧本创作公式 在抖音这个短视频平台上&#…

ssm基于Java的药店药品信息管理系统的设计与实现论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;药品信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广大…

一步直达 - CDPATH的妙用

文章目录 一步直达 - CDPATH的妙用更多信息 一步直达 - CDPATH的妙用 适用于贼长的目录路径 如果你的目录路径贼长&#xff0c;一定要用一下这个命令。 变量CDPATH定义了目录的搜索路径&#xff0c;这个设置特别适合经常需要进入到某个目录&#xff0c;此时这个设置就及其有用…

软件测试|Git:fatal: refusing to merge unrelated histories错误分析与解决

问题介绍 在使用Git时&#xff0c;有时我们可能会遇到以下错误消息&#xff1a; fatal: refusing to merge unrelated histories这个错误通常发生在尝试合并两个不相关的Git仓库历史时。在本文中&#xff0c;我们将详细解释为什么会出现这个错误以及如何解决它。 问题分析 …

使用Sqoop的并行处理:扩展数据传输

使用Sqoop的并行处理是在大数据环境中高效传输数据的关键。它可以显著减少数据传输的时间&#xff0c;并充分利用集群资源。本文将深入探讨Sqoop的并行处理能力&#xff0c;提供详细的示例代码&#xff0c;以帮助大家更全面地了解和应用这一技术。 Sqoop的并行处理 在开始介绍…

java获取已经发送谷歌邮件的打开状态

1.前言 现在网上的方案都是在邮件里面插入一张图片的地址&#xff0c;当收件人打开之后&#xff0c;就会发送请求到指定路径的服务器上&#xff0c;然后在请求的controller里面处理邮件的状态&#xff0c;这个方案确实是行得通的&#xff0c;本文章只是给大家避个坑&#xff0…

UE4使用技巧

打开蓝图编辑器时不是打开一个新窗口&#xff0c;而是作为主窗口 适用于全部的打开新窗口的操作 蓝图编译时自动保存 开始游戏后立即捕获鼠标

服务器感染了.DevicData-P-XXXXXXXX勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 在当今数字化时代&#xff0c;勒索病毒已成为网络安全威胁的一个严峻问题。其中&#xff0c;.DevicData-P-XXXXXXXX 勒索病毒以其恶意加密文件的手段引起了广泛关注。本文将介绍该病毒的特点、数据恢复方法以及如何预防遭受其攻击。 如不幸感染这个勒索病毒&…

OpenHarmony—Linux之系统调用

Linux之系统调用 这里我们只讨论&#xff1a; 硬件&#xff1a; Arm64系统&#xff1a; Linux系统 (Kernel-5.15-rc1)高级语言&#xff1a; C &#xff08;glibc-2.34&#xff09;模式&#xff1a; 64位 &#xff08;即未定义CONFIG_COMPAT&#xff09; 2、什么是系统调用 …

怎么安装es、kibana(单点安装)

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像&#xff0c;这个镜像体积非常大&#xff0c…

新版网易滑块

突然发现脸皮厚根本没用&#xff0c;大冬天的&#xff0c;风吹过来还是会冷。 大哥们多整件衣裳&#xff0c;好冷&#xff01;&#xff01;&#xff01;&#xff01; 网易更新了&#xff0c;这俩 dt跟f值。 dt为 这里返回的&#xff0c;忽略掉他。 data参数中的d值&#xff…

如何提高匹配的精确度(多次学习)

我们工业自动化中&#xff0c;视觉软件匹配&#xff0c;都是学习一次&#xff0c;比如找到轮廓&#xff0c;旋转360度&#xff0c;也就是有360个轮廓&#xff0c;然后到图像中去找任意角度的目标。 这样的学习并不能一而概括全。 所以&#xff0c;我借鉴ai的方法&#xff0c;…

深度学习-标注文件处理(txt批量转换为json文件)

接上篇&#xff0c;根据脚本可将coco128的128张图片&#xff0c;按照比例划分成训练集、测试集、验证集&#xff0c;同时生成相应的标注的labels文件夹&#xff0c;最近再看实例分离比较火的mask rcnn模型&#xff0c;准备进行调试但由于实验室算力不足&#xff0c;网上自己租的…

机器人持续学习基准LIBERO系列7——计算并可视化点云

0.前置 机器人持续学习基准LIBERO系列1——基本介绍与安装测试机器人持续学习基准LIBERO系列2——路径与基准基本信息机器人持续学习基准LIBERO系列3——相机画面可视化及单步移动更新机器人持续学习基准LIBERO系列4——robosuite最基本demo机器人持续学习基准LIBERO系列5——…

vscode打开c_cpp_properties.json文件的一种方式

步骤一 点击win32 步骤二 点击json 自动生成了

自动化神器 Playwright 的 Web 自动化测试解决方案

1. 主流框架的认识 总结&#xff1a; 由于Selenium在3.x和4.x两个版本的迭代中并没有发生多大的变化&#xff0c;因此Selenium一统天下的地位可能因新框架的出现而变得不那么稳固。后续的Cypress、TestCafe、Puppeteer被誉为后Selenium时代Web UI自动化的三驾马车。但是由于这三…

Docker从入门到精通

系列文章目录 docker常见用法之镜像构建1 docker 系列文章目录一、镜像的分层结构二、容器的用法三、镜像的构建3.1docker commit 构建新镜像三部曲3.1.1运行容器并且修改容器3.1.2提交容器3.1.2删除docker镜像 3.2Dockerfile构建镜像 系列文章目录一、 Dockerfile写法详解1.1…

test-03-test case generate 测试用例生成 Randoop 介绍

拓展阅读 junit5 系列 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) 拓展阅读 自动生成测试用例 Rand…