基于UDP传输的客户端从服务器下载与上传

代码:

服务器使用Tftp软件代替,客户端由自己编写;

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define ERR_MSG(msg) {\
	fprintf(stderr,"line:%d\n",__LINE__);\
	perror(msg);\
}while(0);

#define IP "192.168.8.208"
#define PORT 69


int download(int sfd,struct sockaddr_in sin)
{
	//发送下载请求
	char filename[30] = "";
	printf("请输入下载文件>>");
	fgets(filename,sizeof(filename),stdin);
	filename[strlen(filename)-1] = 0;

	char app[50] = "";
	//定义下载请求
	int size = sprintf(app,"%c%c%s%c%s%c",0,1,filename,0,"octet",0);
	//发送
	if(sendto(sfd,app,size,0,(struct sockaddr*)&sin,sizeof(sin)) < 0)
	{
		ERR_MSG("sendto");
		return -1;
	}
	printf("sendto application success\n");

	char rcv[516] = "";//存放接收的包
	ssize_t res = 0;//接收函数的返回值
	int flag = 0;//文件创建/打开的标志位
	socklen_t size_sin = sizeof(sin);//存放发送方地址信息结构体大小
	unsigned short num = 0;//存放上一次的块编码,防止重复写入
    int fd = -1;//文件描述符,防止错关描述符置-1

	while(1)
	{
		bzero(rcv,sizeof(rcv));//防止最后一次写入带有倒数第二次的部分内容
		//接收数据包
    	res = recvfrom(sfd,rcv,sizeof(rcv),0,(struct sockaddr*)&sin,&size_sin);
    	if(res < 0)
    	{
	    	ERR_MSG("recvfrom");
	    	return -1;
    	}
		if(5 == rcv[1])//接收的是错误包
		{
			printf("line:[%d] %d : %s\n",__LINE__,ntohs(*(short *)(rcv+2)),rcv+4);//打印错误信息
			return -1;
		}
		else if(3 == rcv[1])//接收到的是数据包
		{
			if(0 == flag)//打开文件描述符,循环内打开为了防止创建服务器内不存在文件的接收文件
			{
				fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0664);
				if(fd < 0)
				{
					ERR_MSG("open");
					return -1;
				}
				flag = 1;//标志位置1,本次下载不再打开新的文件描述符
			}

            if(num != ntohs(*(unsigned short *)(rcv+2)))//如果接收的数据包块编码与上次接收的相同,说明数据包重复发送
            {
     			if(write(fd,rcv+4,res-4) < 0)//将读取的内容写入文件中
	    		{
		     		ERR_MSG("write");
			    	return -1;
     			}
     			if(res < 516)//诺数据包没有读满说明本次是最后一次接收内容
	    		{
		    		printf("下载完成\n");
			    	break;
	     		}
            }
			num = ntohs(*(unsigned short *)(rcv+2));//记录本次的块编码
     		//发送ACK
            rcv[1] = 4;//将数据包块编码打包发送回去

		   if(sendto(sfd,rcv,4,0,(struct sockaddr*)&sin,size_sin) < 0)
     		{
	    		ERR_MSG("sendto");
		    	return -1;
	    	} 
		}
		
	}
	close(fd);
	return 0;
}

int upload(int sfd,struct sockaddr_in sin)
{
	char filename[30] = "";
	printf("请输入上传文件>>");
	fgets(filename,sizeof(filename),stdin);
	filename[strlen(filename)-1] = 0;

	int fd = open(filename,O_RDONLY);
	if(fd < 0)
	{
		ERR_MSG("open");
		return -1;
	}
	//发送请求
	char app[30] = "";
	int size = sprintf(app,"%c%c%s%c%s%c",0,2,filename,0,"octet",0);
	if(sendto(sfd,app,size,0,(struct sockaddr*)&sin,sizeof(sin)) < 0)
	{
		ERR_MSG("sendto");
		return -1;
	}

	char snd[516] = "";
	char buf[516] = "";
    ssize_t res = 0;
    socklen_t size_sin = sizeof(sin);
	unsigned short num = 0;
	while(1)
	{
		bzero(snd,sizeof(snd));
	
		//接收ack
        if(recvfrom(sfd,snd,4,0,(struct sockaddr*)&sin,&size_sin) < 0)
		{
			ERR_MSG("recvfrom");
			return -1;
		}

		//发送数据包
		res = read(fd,snd+4,sizeof(snd)-4);
		if(res < 0)
		{
			ERR_MSG("read");
			return -1;
    	}
		
		
        num =ntohs(*(unsigned short*)(snd+2));
		num++;
		snd[1] = 3;
		*(unsigned short *)(snd+2) = htons(num);

		if(sendto(sfd,snd,sizeof(snd),0,(struct sockaddr*)&sin,size_sin) < 0)
		{
			ERR_MSG("sendto");
			return -1;
		}
		//当读取内容少于512字节,说明最后一次读取,上传完成
		if(res < 512)
		{
			printf("上传完成\n");
			break;
		}
	}
	close(fd);
	return 0;
}

int main(int argc, const char *argv[])
{
	//创建报式套接字
	int sfd = socket(AF_INET,SOCK_DGRAM,0);
	if(sfd < 0)
	{
		ERR_MSG("socket");
		return -1;
	}

	//完善通用地址信息结构体,用于向服务器提出申请
	struct sockaddr_in sin;
    sin.sin_family  =  AF_INET;
	sin.sin_port    =  htons(PORT);
	sin.sin_addr.s_addr  =  inet_addr(IP);

	int choose = 0;
	while(1)
	{
		system("clear");
		printf("***********************\n");
		printf("*******1.download******\n");
		printf("*******2.upload********\n");
		printf("*******3.exit**********\n");
		printf("***********************\n");
		printf("请输入>>");
		scanf("%d",&choose);
		while(getchar()!=10);
        switch(choose)
		{
		case 1:
            download(sfd,sin);
			break;
		case 2:
			upload(sfd,sin);
			break;
		case 3:
            close(sfd);
			return 0;
		printf("按任意字符清屏>>");
		while(getchar()!=10);
		}
	}
	return 0;
}

实现效果:

下载:

 

 

上传:

 

 

Huge_Whale
关注 关注
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于UDP协议设计的大文件传输软件:服务器端与客户端
走向CTO的路上...
07-10 511
本项目介绍如何基于UDP协议设计大文件传输软件,实现服务器端和客户端之间的大文件传输。**简单易用:**易于理解和使用,无需复杂的配置。**高效可靠:**采用UDP协议传输数据,传输速度快,可靠性高。**可扩展性强:**支持大文件传输,并可根据需要扩展其他功能。该项目介绍了一种基于UDP协议的大文件传输方案,并提供了服务器端和客户端的代码实现。该方案具有简单易用、高效可靠、可扩展性强等优点,可以应用于各种需要大文件传输的场景。
Ne Plus Ultra:基于UDP的文件传输客户端/服务器应用程序(基于lib UDT)-开源
04-17
基于客户端+服务器UDP组合文件传输应用程序。 基于UDT协议-通过libudt-http://udt.sourceforge.net/ UDT是一种可靠的基于UDP的应用程序级数据传输协议。 UDT是为超高速网络设计的,已用于支持TB级数据集的全局数据...
udp文件下载系统
08-20
可以下载文件到嵌入式板子,多文件发送,发送状态和进度条处理
一个UDP下载服务器的实现(模拟下载文件)
weixin_58016534的博客
05-27 860
本期分享的主要是使用UDP实现文件下载功能,需要自己编写服务器客户端,实现的功能主要有以下几个: (1)服务器可以为请求的用户下发文件数据(前提是服务器得有这个数据文件) (2)客户端请求下载数据文件
UDP服务端客户端
06-25
UDP服务端和客户端,实现了从客户端发送命令到服务端
UDP客户端
qq_36708941的博客
08-05 221
#include #include #include #include #include #include #include #define SERV_PORT      9877 #define BUF_MAX_SIZE   1024 int main(int argc, char *argv[]) {     socklen_t cli_ad
作业12.30---编写UDP客户端,使用TFTP协议实现文件上传下载的功能
ccssyy_的博客
12-30 321
upd 下载上传
基于TCP或UDP客户端服务器编程网络聊天-课程设计(含课程报告和代码).rar
12-28
课程设计中包含的"基于TCP或UDP客户端服务器编程-网络聊天.doc"文档很可能详细阐述了如何实现这两个模型的网络聊天系统。这份报告可能涵盖了以下几个关键知识点: 1. **网络模型**:讲解OSI七层模型或TCP/IP四...
HPSocket--UDP传输客户端应用实例
11-28
通过上述步骤,我们可以构建一个基于HPSocket的UDP传输客户端,高效地接收和处理矿用产量数据。这样的系统对于实时监控、数据分析和决策支持具有重要价值。在实际应用中,还需考虑安全性、负载均衡、容错机制等多...
udp.zip_UDP_udp client_udp服务器客户端
09-24
总的来说,理解UDP客户端服务器的实现有助于深入学习网络编程,特别是当你需要处理实时数据传输或者对网络性能有较高要求的场景时。这个压缩包提供了一个很好的起点,让你能亲手实践和探索UDP协议的工作原理。
udp通信客户端
08-15
udp通信的客户端程序,封装报文,伪装源ip发送udp报文。
简单UDP服务器
11-03
简单UDP服务器
UDP客户端服务器
01-10
简单的UDP客户端服务器程序,十分有用的东西。
TCP、UDP协议客户端
11-29
这是计算机网络课程设计,TCP文件传输UDPQQ聊天的客户端程序源代码。
UDP协议服务器客户端
12-25
UDP协议服务器客户端UDP协议服务器客户端UDP协议服务器客户端
udp客户端
ypjsdtd的博客
01-03 212
#include &lt;stdio.h&gt; #include &lt;sys/types.h&gt; /* See NOTES */ #include &lt;sys/socket.h&gt; #include &lt;arpa/inet.h&gt; #include &lt;string.h&gt; #include &lt;unistd.h&gt; #include &am
UDP项目-下载功能
liu319293960_的博客
04-11 134
【代码】UDP项目-下载功能。
UDP下载网络资源
m0_52599076的博客
03-11 624
package lessonIP; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class URLDemo01 { public static void .
使用udp实现文件的传输下载
最新发布
weixin_58016534的博客
05-27 1476
本期主要分享的是使用udp实现文件的传输下载,主要运用到的主要有UDP的相关函数接口,可以锻炼使用网络通信的思维;那么各位小伙伴一定要自己动手做一下,整个过程也是锻炼自己的一个过程,我也是在这样的过程中不断进步!
Android TCP与UDP传输实战:服务器端与客户端代码示例
"本文将详细介绍如何在Android环境中实现TCP和UDP传输,包括服务器端和客户端的代码示例。" 在Android开发中,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种常见的网络传输协议,...
写文章

热门文章

  • 定义一个学生结构体,包含姓名,学号,语数英成绩,定义结构体数组存放不同学生的信息,可以实现对学生成绩的排序,排序可以按照语数英之间的任一个。 2016
  • qt的简单登录界面设计 971
  • 电子词典流程图 961
  • 1、递归实现斐波那契数列,1,1,2,3,5,8,13,21,34,55,89,144…… 941
  • 基于A7核开发板的串口实现控制LED亮灭 773

最新评论

  • 多态,纯虚函数与父子类继承

    你爱喝鸡蛋汤嘛: 读了好多博客,还是博主表述的通俗易懂表情包

  • 基于UDP的网络聊天室

    原来的潘潘呀: 考虑的很全面,非常好。但是项目中有用到链表L这个全局变量,在登录或者下线的时候会添加、删除结点,包括发送系统信息的时候又需要遍历这个结点。所以L是一个临界资源。在操作临界资源的时候需要上锁,否则可能会出现我在遍历链表的时候,某一个结点被删除,或者新增的情况

  • 1、定义一个一维数组 int a= [1,2,3,4,5,6,7,8] (1) 求一维数组的长度 (2) 并将所有奇数下标元素自乘 3,偶数下标元素自增 2. 输出变化后的数组

    CSDN-Ada助手: 推荐 算法 技能树:https://edu.csdn.net/skill/algorithm?utm_source=AI_act_algorithm

大家在看

  • 刘润《关键跃升》读书笔记9 247
  • 2024年研赛-华为杯数模竞赛C题论文首发+论文讲解+代码分享
  • Postman cURL命令导入导出 135
  • ECharts水球图-水球11,附视频讲解与代码下载 24
  • 使用Postman测试MQTT协议接口 907

最新文章

  • 利用platform总线驱动实现在不影响流水灯运行时,按键使风扇启动关闭。
  • 编写驱动与应用层程序,在应用层利用ioctl控制LED灯流水,当按键KEY1按下时,风扇转动,流水灯不受影响。
  • gpio子系统的调用
2023年35篇
2022年36篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家赣州玻璃钢门头雕塑街头景观玻璃钢雕塑小品黄山玻璃钢雕塑哪家好深圳欧式玻璃钢雕塑公司圣诞美陈ip商场商场玻璃钢动物雕塑手工制作江门玻璃钢雕塑摆件玻璃钢房地产鹿雕塑价格浙江超市商场美陈研发公司安宁玻璃钢吉祥卡通雕塑石家庄玻璃钢雕塑公司方案鹤壁标识标牌玻璃钢仿铜雕塑安徽创意玻璃钢雕塑哪家便宜水生植物白玻璃钢花盆娄底玻璃钢抽象雕塑佳木斯景区玻璃钢雕塑价格武威广场玻璃钢雕塑定制珠海玻璃钢卡通雕塑源头好货淮安玻璃钢动漫卡通雕塑设计玻璃钢户外景观雕塑芒市玻璃钢雕塑设计价格云南定做玻璃钢雕塑厂家多少钱玻璃钢座椅摆件雕塑玻璃钢雕塑卡通牛宿迁玻璃钢仿真水果雕塑价格武威仿真人物玻璃钢雕塑安装溧水商场美陈策划崇左玻璃钢雕塑玻璃钢荷包蛋雕塑海门玻璃钢景区雕塑厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化