以下是一个简单的TFTP客户端的C语言例子,可以用于向服务器请求下载文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define TFTP_PORT 69typedef struct {unsigned short opcode;union {unsigned short block_num;unsigned short error_code;char data[1];} data;
} tftp_packet;int main(int argc, char *argv[]) {if(argc != 3) {printf("Usage: %s <server_ip> <file_name>\n", argv[0]);exit(1);}int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd < 0) {perror("socket");exit(1);}struct sockaddr_in servaddr;memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(TFTP_PORT);if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {perror("inet_pton");exit(1);}tftp_packet *packet = (tftp_packet *)malloc(sizeof(tftp_packet) + strlen(argv[2]) + 1);packet->opcode = htons(1);strcpy(packet->data.data, argv[2]);sendto(sockfd, packet, sizeof(tftp_packet) + strlen(argv[2]) + 1, 0, (struct sockaddr *)&servaddr, sizeof(servaddr));FILE *fp = fopen(argv[2], "wb");if(fp == NULL) {perror("fopen");exit(1);}int block_num = 1;while(1) {tftp_packet *packet = (tftp_packet *)malloc(sizeof(tftp_packet) + 512);socklen_t addrlen = sizeof(servaddr);int n = recvfrom(sockfd, packet, sizeof(tftp_packet) + 512, 0, (struct sockaddr *)&servaddr, &addrlen);if(n < 0) {perror("recvfrom");exit(1);}if(ntohs(packet->opcode) == 3) {if(ntohs(packet->data.block_num) == block_num) {fwrite(packet->data.data, 1, n - sizeof(tftp_packet), fp);block_num++;}packet->opcode = htons(4);packet->data.block_num = htons(block_num - 1);sendto(sockfd, packet, sizeof(tftp_packet), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));if(n - sizeof(tftp_packet) < 512) {break;}} else if(ntohs(packet->opcode) == 5) {printf("Error: %d\n", ntohs(packet->data.error_code));exit(1);}}fclose(fp);close(sockfd);return 0;
}

该例子中,客户端向服务器发送一个读请求,请求下载指定文件。客户端接收到服务器的数据包后,将数据写入本地文件中。同时,客户端还需要发送确认包给服务器,以确认已经接收到数据包。如果服务器返回错误信息,则客户端需要打印错误信息并退出。
【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~~

实现TFTP协议客户端,并且向服务器下载文件(附代码)相关推荐

  1. python_day08:网络编程02(wireshark,tftpd32,客户端怎样从服务器下载文件,tftpd客户端)

    目录 0x00 wireshark 0x01 Tftpd32 0x02 客户端怎样从服务器下载文件呢? 0x03完整程序: 0x00 wireshark 注意目标ip中 只要是是主机号全部是1的地址 ...

  2. Servlet从服务器下载文件 步骤+代码

    博主最近在学习JSP的相关知识,正好练习了一道关于从服务器上下载文件的题目,博主萌新,颇感困难,在此总结一下操作步骤,方便自己及各位浏览者查阅 静态页面 在静态页面上我们需要放上一个可以相应的超链接, ...

  3. Java Web实现 使用浏览器从服务器下载文件

    Java Web实现 使用浏览器从服务器下载文件. 代码实现: package com.juneyaoair.util;import lombok.SneakyThrows;import javax. ...

  4. 客户端从服务端下载文件的流程分析

    客户端从服务端下载文件的流程分析: 浏览器发送一个请求,请求访问服务器中的某个网页(如:down.php),该网页的代码如下. 服务器接受到该请求以后,马上运行该down.php文件 运行该文件的时候 ...

  5. ftp服务器下载文件

    import java.io.*; import java.net.SocketException;import org.apache.commons.net.ftp.*; /*** ftp服务器下载 ...

  6. python批量下载文件只有1kb_Python 实现批量从不同的Linux服务器下载文件

    基于Python实现批量从不同的Linux服务器下载文件 by:授客 QQ:1033553122 实现功能 批量从不同的Linux服务器下载指定文件 测试环境 Win7 64位 Python 3.3. ...

  7. Python 实现批量从不同的Linux服务器下载文件

    基于Python实现批量从不同的Linux服务器下载文件   by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/file_for_downl ...

  8. python批量下载网页文件夹_Python实现批量从不同的Linux服务器下载文件

    基于Python实现批量从不同的Linux服务器下载文件 by:授客 实现功能 批量从不同的Linux服务器下载指定文件 测试环境 Win7 64位 Python 3.3.2 pscp 64位 下载地 ...

  9. CentOS6中连接ftp服务器下载文件时出现了java.net.SocketException: Connection reset

    问题描述:连接CentOS6中的ftp服务器下载文件时出现了java.net.SocketException: Connection reset 解决办法: 1.查看防火墙状态,发现防火墙已开启 se ...

  10. 如何登陆FTP服务器下载文件

    如何登陆FTP服务器下载文件 在网上我们经常可以看到很多如何搭建FTP服务器的经验,但是却缺少详细的如何登陆FTP服务器的经验,当然对于电脑熟练者来说这可能很简单,但是我想也有相当一部分人不知道如何从 ...

最新文章

  1. 股票自动交易python下单接口_用 Python 写了个简单的股票量化交易框架
  2. 高质量程序程序设计指南摘录
  3. 预加载系列一:DNS Prefetching 的正确使用姿势
  4. link 标签的 rel 属性
  5. java rpm_Java JDK rpm安装与配置
  6. 计算机模拟热处理,计算机模拟在热处理中的应用
  7. 【封装那些事】 缺失封装
  8. Jquery的一些方法
  9. 同源策略——浏览器安全卫士
  10. php安全篇值过滤用户输入的人参数
  11. 《Spring5官方文档》新功能(4,3)
  12. Docker系列教程27-在生产环境中使用Docker Compose
  13. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array(动态规划.递推)
  14. win10配置Android SDK环境变量
  15. STM32+OLED显示屏制作指针式电子钟
  16. mysql server has gone away_mysql server has gone away的解决方法
  17. 【Android实战】----基于Retrofit实现多图片/文件、图文上传
  18. 安装Snipe-IT资产管理系统
  19. 基因家族特征分析 - 染色体定位分析
  20. QT QTableWidget的用法

热门文章

  1. CF1734E Codeforces Round #822 (Div. 2) Rectangular Congruence
  2. PCB走线宽度与铜箔厚度与电流的关系
  3. Google网页如何截取滚动长截图?
  4. springMVC_day01_概念_入门_@RequestMapping注解_参数封装与绑定_编码过滤器
  5. ffmpeg录屏及截图
  6. 了解3dmax 动画控制区按钮
  7. 关于OBS无法获取酷狗音乐窗口问题
  8. 微信小程序 vant 封装DatetimePicker时间选择器
  9. (二)DDD——在我梦里,我还能让你把我给欺负了?
  10. 保险从业人员有RFP理财规划师证的优势有哪些?