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
原创粉丝点击