网络编程(TFTP协议实验)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <head.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>#define PORT 69       //端口号:填服务器绑定端口号
#define IP   "192.168.1.101"   //IP地址:windows的IP地址int upload(int cfd,struct sockaddr_in sin)
{char filename[20] = "";printf("请输入要上传的文件名>>> ");scanf("%s", filename);while(getchar()!=10);//判断文件存不存在int fd = open(filename,O_RDONLY);if(fd < 0){ERR_MSG("open");return -1;}//发送数据char buf[516] = "";int size = sprintf(buf, "%c%c%s%c%s%c", 0, 2, filename, 0, "octet", 0);if(sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin)) < 0) {ERR_MSG("sendto");return -1;}printf("sendto success\n");socklen_t addrlen = sizeof(sin);ssize_t res = 0;unsigned short num = 0;      //本地记录的块编号while(1){bzero(buf, sizeof(buf));//接收服务器的应答res = recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, &addrlen);if(res < 0){ERR_MSG("recvfrom");break;}if(4 == buf[1]){if(htons(num) == *(unsigned short*)(buf+2)){//组数据包给服务器num++;*(unsigned short*)buf = htons(3);*(unsigned short*)(buf+2) = htons(num);res = read(fd, buf+4, 512);if(res < 0){break;}else if(0 == res){printf("文件:%s 上传完毕\n", filename);break;}//发送数据包if(sendto(cfd, buf, res+4, 0, (struct sockaddr*)&sin, sizeof(sin)) < 0){ERR_MSG("sendto");return -1;}}}else if(5 == buf[1])//错误包{printf("MSG_ERR: code[%d] msg[%s] __%d__\n", \ntohs(*(unsigned short*)(buf+2)), buf+4, __LINE__);break;}}close(fd);return 0;
}int download(int cfd,struct sockaddr_in sin)
{char buf[516] = "";char filename[20] = "";printf("请输入要下载的文件名>>> ");scanf("%s", filename);while(getchar()!=10);//发送下载请求//组协议包int size = sprintf(buf, "%c%c%s%c%s%c", 0, 1, filename, 0, "octet", 0);//sendto if(sendto(cfd, buf, size, 0, (struct sockaddr*)&sin, sizeof(sin)) < 0){ERR_MSG("sendto");return -1;}//本地创建并打开要下载的文件int fd = -1;     //必须初始化一个无意义的文件描述符,否则下面的closesocklen_t addrlen = sizeof(sin);ssize_t res = 0;unsigned short num = 0;      //本地记录的块编号//循环接收数据包,回复ACkwhile(1){bzero(buf, sizeof(buf));//接收数据包res = recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, &addrlen);if(res < 0){ERR_MSG("recvfrom");break;}if(3 == buf[1])     //数据包{if(htons(num+1) == *(unsigned short*)(buf+2)){num++;if(-1 == fd){fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0664);if(fd < 0){ERR_MSG("open");break;}}//将获取到的数据,写入到文件中if(write(fd, buf+4, res-4) < 0){ERR_MSG("write");break;}buf[1] = 4;if(sendto(cfd, buf, 4, 0, (struct sockaddr*)&sin, sizeof(sin)) < 0){ERR_MSG("sendto");break;}if(res-4 < 512){printf("======= 文件下载完毕 =======\n");break;}}}else if(5 == buf[1])//错误包{printf("MSG_ERR: code[%d] msg[%s] __%d__\n", \ntohs(*(unsigned short*)(buf+2)), buf+4, __LINE__);break;}}close(fd);return 0;
}
int main(int argc, const char *argv[])
{//创建报式套接字int cfd = socket(AF_INET,SOCK_DGRAM,0);if(cfd < 0){ERR_MSG("socket");return -1;}printf("cfd = %d\n",cfd);//绑定客户端的地址信息结构体到套接字上--->非必须绑定//若不绑定,则操作系统会给客户端绑定上客户端所在的主机IP以及随机端口(49151~65535)//填充地址信息结构体,真实的地址信息结构体根据地址族制定//AF_INET:man 7 ip//要连接哪个服务器,就填对应服务器的IP和端口struct sockaddr_in sin;sin.sin_family      = AF_INET;       //必须填AF_INETsin.sin_port        = htons(PORT);   //端口号:填服务器绑定端口号sin.sin_addr.s_addr = inet_addr(IP);  //IP地址:服务器绑定的IP地址char c = 0;while(1){	printf("-------------------------\n");printf("---------1.下载----------\n");printf("---------2.上传----------\n");printf("-------------------------\n");printf("请输入>>> ");c = getchar();while(getchar()!=10);switch(c){case '1' :download(cfd,sin);break;case '2' :upload(cfd,sin);break;default :printf("输入错误,请重新输入\n");break;}while(getchar()!=10);}//关闭所有文件描述符close(cfd);return 0;
}

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

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

相关文章

网络安全威胁与防御策略

第一章&#xff1a;引言 随着数字化时代的快速发展&#xff0c;网络已经成为人们生活和工作中不可或缺的一部分。然而&#xff0c;网络的广泛应用也引发了一系列严峻的网络安全威胁。恶意软件、网络攻击、数据泄露等问题层出不穷&#xff0c;给个人和企业带来了巨大的风险。本文…

mysql基础之触发器的简单使用

1.建立学生信息表 -- 触发器 -- 建立学生信息表 create table s1(id int unsigned auto_increment,name varchar(30),score tinyint unsigned,dept varchar(50),primary key(id) );2.建立学生补考信息表 -- 建立学生补考信息表 create table s2 like s1;3.建立触发器&#xf…

java 自定义xss校验注解实现

自定义一个注解Xss。名字随意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…

C字符串练习题(6.3.1)

编写一个程序&#xff0c;从键盘上读入一个小于1000的正整数&#xff0c;然后创建并输出一个字符串&#xff0c;说明该整数的值。例如&#xff0c;输入941&#xff0c;程序产生的字符串是“Nine hundred and forty one”。 #include<stdlib.h> #include<string.h>…

Maven基础总结

前言 Maven 是一个项目管理工具&#xff0c;可以对 Java 项目进行构建、依赖管理。 基本要求掌握 配置Maven环境直接查。 得会在IDEA创建Maven的java项目吧、会创建Maven的web项目吧、会创建多模块项目吧。 得会配置插件pligin、依赖dependency吧 一、Maven四大特性 1、…

CSS:服务器字体 与 响应式布局(用法 + 例子 + 效果)

文章目录 服务器字体定义 服务器字体使用例子 响应式布局设备类型设备特性例子 服务器字体 解决字体不一致而产生的。 首先&#xff0c;在网上把字体下载好。 定义 服务器字体 font-face{font-family:字体名称;src:url(字体资源路径); }使用 在需要使用的选择器里加上 font…

数学建模(一)前继概念

课程推荐&#xff1a;数学建模老哥_哔哩哔哩_bilibili 目录 一、什么是数学建模&#xff1f; 二、数学建模的一般步骤 三、数学建模赛题类型 1.预测型 2. 评价类 3.机理分析类 4. 优化类 一、什么是数学建模&#xff1f; 数学建模是利用数学方法解决实际问题的一种实践。…

什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?

文章目录 前言我们为什么要使用线程而不是进程来实现并发编程什么是线程进程和线程的区别如何使用Java实现多线程创建线程1.创建一个继承 Thread 类的线程类2.实现 Runnable 接口匿名内部类方式实现 Runnable 接口lambda 表达式实现 Runnable 接口 Thread 类的常见构造方法Thre…

T113-S3-RTL8211网口phy芯片调试

目录 前言 一、RTL8211介绍 二、硬件连接 三、设备树配置 四、内核配置 五、phy芯片配置 六、调试问题 总结 前言 在嵌入式系统开发中&#xff0c;网络连接是至关重要的一部分。T113-S3开发板搭载了RTL8211系列的网口PHY芯片&#xff0c;用于实现以太网连接。在开发过程…

C++ QT(二)

目录 Qt 控件按钮QPushButton控件简介用法示例运行效果 QToolButton控件简介用法示例运行效果 QRadioButton控件简介用法示例运行效果 QCheckBox控件简介用法示例运行效果 QCommandLinkButton控件简介用法示例运行效果 QDialogButtonBox控件简介用法示例运行效果 输入窗口部件Q…

用 React+ts 实现无缝滚动的走马灯

一、走马灯的作用 走马灯是一种常见的网页交互组件&#xff0c;可以展示多张图片或者内容&#xff0c;通过自动播放或者手动切换的方式&#xff0c;让用户能够方便地浏览多张图片或者内容。 本次实现的不是轮播图而是像传送带一样的无限滚动的形式。 二、需求梳理 走马灯可设…

Go Gin 中使用 JWT

一、JWT JWT全称JSON Web Token是一种跨域认证解决方案&#xff0c;属于一个开放的标准&#xff0c;它规定了一种Token实现方式&#xff0c;目前多用于前后端分离项目和OAuth2.0业务场景下。 二、为什么要用在你的Gin中使用JWT 传统的Cookie-Sesson模式占用服务器内存, 拓展性…

uniapp实现自定义导航内容高度居中(兼容APP端以及小程序端与胶囊对齐)

①效果图如下 1.小程序端与胶囊对齐 2.APP端内容区域居中 注意&#xff1a;上面使用的是colorui里面的自定义导航样式。 ②思路&#xff1a; 1.APP端和小程序端走不同的方法&#xff0c;因为小程序端要计算不同屏幕下右侧胶囊的高度。 2.其次最重要的要清晰App端和小程序端…

【数学建模】清风数模更新5 灰色关联分析

灰色关联分析综述 诸如经济系统、生态系统、社会系统等抽象系统都包含许多因素&#xff0c;系统整体的发展受各个因素共同影响。 为了更好地推动系统发展&#xff0c;我们需要清楚哪些因素是主要的&#xff0c;哪些是次要的&#xff0c;哪些是积极的&#xff0c;哪些是消极的…

网络基础——网络的由来与发展史

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、网络的由来 二、计算机网络的发展史 1、第一阶段 2、第二阶段 3、第三阶段 前言 每天都是使用网络&#xff0c;那么你知道网络…

FPGA----Vivado SDK创建并使用静态链接库(C/C++代码移植)

1、在进行SoC开发时&#xff0c;PS端的C/C代码可能涉及到核心算法需要移植操作&#xff0c;为此&#xff0c;本文讲述了如何将C/C代码打包为.a文件供程序调用 2、文章以我的程序为例&#xff0c;逐步讲述代码生成静态链接库并调用的方法。 下面是我程序的目录结构&#xff0c…

RocketMQ 延迟消息

RocketMQ 延迟消息 RocketMQ 消费者启动流程 什么是延迟消息 RocketMQ 延迟消息是指&#xff0c;生产者发送消息给消费者消息&#xff0c;消费者需要等待一段时间后才能消费到。 使用场景 用户下单之后&#xff0c;15分钟未支付&#xff0c;对支付账单进行提醒或者关单处理…

PostgreSQL查询慢sql原因和优化方案

PostgreSQL sql查询慢优化方案有一下几种解决方案&#xff1a; 1.关闭会话 查询慢sql的执行会话&#xff0c;关闭进程。 查看数据库后台连接进程 SELECT count(*) FROM pg_stat_activity;SELECT * FROM pg_stat_activity; 查看数据库后台连接进程&#xff0c;但是此条SQL不…

用HARU-Net增强核分割:一种基于混合注意的残差u块网络

文章目录 Enhancing Nucleus Segmentation with HARU-Net: A Hybrid Attention Based Residual U-Blocks Network摘要本文方法损失函数后处理消融实验 Enhancing Nucleus Segmentation with HARU-Net: A Hybrid Attention Based Residual U-Blocks Network 摘要 核图像分割是…

W6100-EVB-PICO 做TCP Server进行回环测试(六)

前言 上一章我们用W6100-EVB-PICO开发板做TCP 客户端连接服务器进行数据回环测试&#xff0c;那么本章将用开发板做TCP服务器来进行数据回环测试。 TCP是什么&#xff1f;什么是TCP Server&#xff1f;能干什么&#xff1f; TCP (Transmission Control Protocol) 是一种面向连…