IO网络4.0

思维导图

tftp上传

#include <myhead.h>#define ERR_LOG(msg) do{\perror(msg);\printf("%d %s %s\n", __LINE__, __func__, __FILE__);\
}while(0)#define PORT   	 69 
#define N         516int do_upload(int sfd, struct sockaddr_in sin);int main(int argc, const char *argv[])
{if(argc < 2){printf("请输入IP\n");return -1;}//1.创建报式套接字int sfd = socket(AF_INET, SOCK_DGRAM, 0);if(sfd < 0){perror("socket");return -1;}//2.填充服务器ip和端口号struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(PORT);sin.sin_addr.s_addr = inet_addr(argv[1]);char choose;while(1){printf("######1.上传######\n");printf("######2.退出######\n");scanf("%c", &choose);while(getchar()!=10);switch(choose){case '1'://上传功能,tododo_upload(sfd, sin);break;case '2':goto END;break;default:printf("输入错误\n");}printf("请输入任意字符清屏:");while(getchar()!=10);        }//关闭文件描述符
END:close(sfd);return 0;
}//上传功能
int do_upload(int sfd, struct sockaddr_in sin)
{char filename[20] = "";printf("请输入要上传的文件名:");fgets(filename, 20, stdin);filename[strlen(filename)-1] = 0;//判断该文件是否存在int fd = open(filename, O_RDONLY);if(fd < 0){if(errno == ENOENT){printf(">>>文件不存在,请重新输入<<<\n");return -2;}else{ERR_LOG("open");return -1;}}//发送上传请求//上传协议char buf[N] = "";int size = sprintf(buf, "%c%c%s%c%s%c", 0, 2, filename, 0, "octet", 0);if(sendto(sfd, buf, size, 0, (struct sockaddr*)&sin, sizeof(sin))<0){ERR_LOG("sendto");return -1;}//循环接收发送数据包int recv_len;unsigned short num = 0;socklen_t addrlen = sizeof(sin);while(1){bzero(buf, N);recv_len = recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, &addrlen);if(recv_len < 0){ERR_LOG("recvfrom");return -1;}//操作码的范围是1-5,因为是网络字节序//所以有效操作吗存储在高位,即buf[1]的位置.//服务器返回应答包if(4 == buf[1]){//判断当前数据包的编号是否等于应答包的编号//防止数据包在传送过程丢包或重复收包if(num == ntohs(*(unsigned short*)(buf+2))){//修改操作码为数据包buf[1] = 3;//填充块编号num++;*(unsigned short*)(buf+2) = htons(num);//读取数据//发送数据int res = read(fd, buf+4, N-4);if(res < 0){ERR_LOG("read");return -1;}else if(0 == res){printf("-----文件上传完毕-----\n");break;}//发送数据包//发送的数据包大小为,读取到的字节数(res)+操作码(2byte)+快编号(2byte)if(sendto(sfd, buf, res+4, 0, (struct sockaddr*)&sin, sizeof(sin)) <0){ERR_LOG("sendto");return -1;}}else{printf("-----文件上传失败,请检查网络环境-----\n");break;}}else if(5 == buf[1]){printf("-----ERROR:%s-----\n", buf+4);break;}}return 0;
}

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

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

相关文章

vue学习,使用provide/inject通信

提示&#xff1a;组件的provide&#xff0c;可以被其内所有层级的组件&#xff0c;通过inject引用 文章目录 前言一、通信组件二、效果三、参考文档总结 前言 需求&#xff1a;使用provide/inject通信 一、通信组件 1、AA.vue <template><div class"test"…

Redis实现全局唯一Id

一、全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显 受单表数据量的限制 场景分析&#xff1a;如果我们的…

iOS开发进阶(六):Xcode14 使用信号量造成线程优先级反转问题修复

文章目录 一、前言二、关于线程优先级反转三、优先级反转会造成什么后果四、怎么避免线程优先级反转五、使用信号量可能会造成线程优先级反转&#xff0c;且无法避免六、延伸阅读&#xff1a;iOS | Xcode中快速打开终端6.1 .sh绑定6.2 执行 pod install 脚本 七、延伸阅读&…

统计学-R语言-5.1

文章目录 前言随机性和规律性概率变量的分布离散型--二项、泊松、几何二项分布几何分布泊松分布 连续型--均匀、正态均匀分布正态分布 其它统计分布--χ2分布、t分布、F分布χ2分布t分布F分布 练习 前言 从本篇文章开始介绍有关概率与分布的介绍。 随机性和规律性 当不能预测…

NLP深入学习(二):nltk 工具包介绍

文章目录 0. 引言1. 什么是 NLTK1.1 主要特点1.2 NLTK 使用示例 2. 句子和单词标记化&#xff08;tokenization&#xff09;3. 移除停用词&#xff08;Stopwords&#xff09;4. 词干提取5. 词性标注6. 命名实体识别7. 理解同义词集8. 频率分布9. 情绪分析10. 参考 0. 引言 前情…

阳光保险选择OceanBase稳定运行超700天

阳光保险集团成立于 2005 年 7 月&#xff0c;旗下拥有财产保险、人寿保险、信用保证保险、资产管理等多家专业子公司&#xff0c;是全球市场化企业中成长最快的集团公司之一&#xff0c;目前位列中国保险行业前八。随着数字化升级趋势的不断加速&#xff0c;很多企业产生将软硬…

【发票识别】支持pdf、ofd、图片格式(orc、信息提取)的发票

背景 为了能够满足识别各种发票的功能&#xff0c;特地开发了当前发票识别的功能&#xff0c;当前的功能支持pdf、ofd、图片格式的发票识别&#xff0c;使用到的技术包括文本提取匹配、ocr识别和信息提取等相关的技术&#xff0c;用到机器学习和深度学习的相关技术。 体验 体…

uniapp 使用canvas制作柱状图

效果图&#xff1a; 实现思路&#xff1a; 1、通过展示数据计算需要画几根柱子&#xff1b; 2、通过组件宽度、高度计算出每根柱子的宽度及高度&#xff1b; 3、for循环依次绘制每根柱子&#xff1b; 4、绘制柱子时&#xff0c;先绘制顶部百分比、value值&#xff0c;再绘制柱子…

office办公技能|word中的常见通配符使用

一、删除Word中含有指定内容的整行 操作方法&#xff1a; 1、快捷键 CtrlH&#xff0c;打开Word的查找替换窗口&#xff0c;单击【更多】按钮&#xff0c;勾选“使用通配符”。 2、在查找内容处&#xff0c;输入“替换内容*^13”&#xff0c;替换为处什么都不填。 3、单击【…

【国内访问github不稳定】可以尝试fastgithub解决这个问题

1、下载 https://github.com/dotnetcore/FastGithub https://github.com/dotnetcore/FastGithub/releases 官网下载即可&#xff0c;比如&#xff0c;我用的是这个&#xff1a;fastgithub_osx-x64.zip&#xff08;点这里下载&#xff09; 2、安装 如下图双击启动即可 3、…

微信小程序canvas画布图片保存到相册官方授权、自定义授权、保存

关键步骤介绍 wx.getSetting可以获取授权信息。 wx.authorize首次授权时会打开弹框让用户授权&#xff0c;若用户已选择同意或拒绝&#xff0c;后续不会再显示授权弹框。 如果授权信息显示未进行相册授权&#xff0c;则打开自定义弹框&#xff08;show_auth: true&#xff0…

记redis5.x在windows上搭建集群(六主六从)

六个运行端口 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 1、安装redis,文章太多不多BB 2、复制六份redis文件夹出来改名 3、修改每一份的配置文件 redis.windows.conf 修改为以下格式&#xff1a; #运行端口 port…