TFTP协议的实现
来源:互联网 发布:网络教育有哪些大学 编辑:程序博客网 时间:2024/04/20 05:45
一、 TFTP基础知识这里没什么可以说的了。
主要是分析下TFTP协议如何传输文件,以及如何在UBOOT中实现TFTP协议。
关于如何在UBOOT中实现TFTP协议将在另外一篇文章中给出。
TFTP客户端是实现:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <pthread.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>
/************************************************************************函数名称:<span style="white-space:pre"></span>int main(int argc, char *argv[])函数功能:<span style="white-space:pre"></span>tftp客户端程序,可以从tftp服务器下载程序函数参数:<span style="white-space:pre"></span>无函数返回:<span style="white-space:pre"></span>无
************************************************************************/int main(int argc, char** argv){if(argc < 3){printf("error cmd!\n");printf("cmd example:./tftpc 192.168.1.10 hello.txt\n");exit(-1);}unsigned short port = 69; //tftp服务器端口号char* tftp_server_ip = argv[1]; //tftp服务器ip地址char* file_name = argv[2]; //要下载的文件名int sockfd; sockfd = socket(AF_INET, SOCK_DGRAM, 0); //创建UDP套接字if(sockfd < 0){perror("socket");exit(-1);}/* 填充tftp服务器的信息 */struct sockaddr_in tftp_server_addr;bzero(&tftp_server_addr, sizeof(tftp_server_addr));tftp_server_addr.sin_family = AF_INET;tftp_server_addr.sin_port = htons(port);inet_pton(AF_INET, tftp_server_ip, &tftp_server_addr.sin_addr);char send_buf[200];int buf_len;buf_len = sprintf(send_buf, "%c%c%s%c%s%c", 0, 1, file_name, 0, "octet", 0); /* 构造读请求数据包并发送到69端口 , "<span style="font-family: Arial, Helvetica, sans-serif;">octet" 为对于二进制文件,“netascii” 对应于ASCII文件</span><span style="font-family: Arial, Helvetica, sans-serif;">*/</span>sendto(sockfd, send_buf, buf_len, 0, (struct sockaddr*)&tftp_server_addr, sizeof(tftp_server_addr));/* 创建下载文件 */int fd;fd = open(file_name, O_CREAT | O_RDWR, 0755);if(fd < 0){perror("open");exit(-1);}int recv_size;socklen_t seraddr_len = sizeof(tftp_server_addr);char recv_buf[516] = "";do{/* 接受数据 */recv_size = recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&tftp_server_addr, &seraddr_len);/* 数据包 */if((recv_buf[0] == 0) && (recv_buf[1] == 3)){/* 保存数据到文件 */write(fd, recv_buf+4, recv_size-4);char ack_buf[4];sprintf(ack_buf, "%c%c%c%c", 0, 4, recv_buf[2], recv_buf[3]);unsigned short block;block = recv_buf[2]<<8 | recv_buf[3];printf("%d\n", block);/* 构造ACK包并发送到对方的临时端口 */sendto(sockfd, ack_buf, 4, 0, (struct sockaddr*)&tftp_server_addr, sizeof(tftp_server_addr));}}while(recv_size == 516); // 判断数据长度,如果小于512则退出循环close(fd);close(sockfd);return 0;}
0 0
- tftp协议的实现
- tftp协议的实现
- tftp协议的实现
- TFTP协议的实现
- tftp协议的实现
- TFTP协议的实现
- TFTP协议实现
- linux实现TFTP协议
- tftp网络协议实现
- TFTP协议在嵌入式系统中的实现
- TFTP协议
- TFTP协议
- TFTP协议
- TFTP协议
- TFTP协议
- 基于TCP的TFTP(Trivial File Transfer Protocol,简单文件传输协议) 的c编程实现
- 基于TFTP传输协议的客户端编程
- 基于TFTP协议的远程升级设计
- iOS的UITableView的基础数据使用
- CodeForces 318D Ants
- 虚拟化技术
- Linux进程间通信——使用共享内存
- MTK 编译错误,perl 找不到 WIN32/OLE.pm
- TFTP协议的实现
- Linux进程间通信——使用消息队列
- CSU1204 Rectangles(二分)
- Acticity的启动模式
- OpenGL ES 矩阵旋转
- arcengine在代码中连接MXD中配置好的要素类
- HDU 2068 RPG的错排
- OC菜鸟成长记-数据封装
- Link 2001 error 常见解决方法