首页 > 其他分享 >【TFTP】客户端下载文件代码

【TFTP】客户端下载文件代码

时间:2023-12-13 23:00:29浏览次数:36  
标签:recvbuf tmp addr 代码 server TFTP include buflen 客户端

 1 // 客户端下载文件
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <unistd.h>
 5 #include <arpa/inet.h>
 6 #include <netinet/in.h>
 7 #include <sys/types.h>
 8 #include <sys/stat.h>
 9 #include <fcntl.h>
10 int main(int argc, char const *argv[])
11 {
12     // 1.创建套接字
13     int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
14     if (sockfd < 0)
15     {
16         perror("socket");
17         return -1;
18     }
19     // 2.创建文件用来保存下载文件的内容
20     int fd = open("a.txt", O_RDWR | O_CREAT, 0777);
21     // 3.指定服务器地址
22     struct sockaddr_in tftp_server_addr;
23     tftp_server_addr.sin_family = AF_INET;
24     tftp_server_addr.sin_port = htons(69);
25     tftp_server_addr.sin_addr.s_addr = inet_addr("10.9.42.228");
26     // 4.组请求+发送请求
27     char buf[128] = "";
28     int buflen = 0;
29     short id = 0;
30     buflen = sprintf(buf, "%c%c%s%c%s%c", 0, 1, "a.txt", 0, "netascii", 0);
31     sendto(sockfd, buf, buflen, 0, (struct sockaddr *)&tftp_server_addr, sizeof(tftp_server_addr));
32     // 5.循环收取数据
33     char recvbuf[1024] = "";
34     struct sockaddr_in tmp_server_addr;
35     socklen_t tmp_len = sizeof(tmp_server_addr);
36     while (1)
37     {
38         // 5.1清空数据内容以及地址结构
39         bzero(recvbuf, sizeof(recvbuf));
40         bzero(&tmp_server_addr, tmp_len);
41         // 5.2接收数据
42         buflen = recvfrom(sockfd, recvbuf, sizeof(recvbuf), 0, (struct sockaddr *)&tmp_server_addr, &tmp_len);
43         // 5.3判断
44         if (recvbuf[1] == 5)
45         {
46             printf("差错消息:%s\n", recvbuf + 4);
47             break;
48         }
49         else
50         {
51             recvbuf[1] = 4;
52             sendto(sockfd, recvbuf, 4, 0, (struct sockaddr *)&tmp_server_addr, tmp_len);
53             // 将内容保存文件
54             write(fd, recvbuf + 4, buflen - 4);
55             // 提取数据包的编号
56             id = ntohs(*((unsigned short *)(recvbuf + 2)));
57             printf("收到%d数据包 数据长度%d\n", id, buflen - 4);
58             // 如果数据小于512,数据包长度小于516,传输结束
59             if (buflen < 516)
60                 break;
61         }
62     }
63     // 6.关闭套接字
64     close(sockfd);
65     close(fd);
66     return 0;
67 }

 

标签:recvbuf,tmp,addr,代码,server,TFTP,include,buflen,客户端
From: https://www.cnblogs.com/mengyaoli/p/17900142.html

相关文章

  • 【多播】编写UDP代码,可以接受224.0.0.2组内消息
    #include<stdio.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<netinet/in.h>intmain(intargc,charconst*argv[]){//1.创建套接字intsockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd......
  • 广播代码(C语言)
    #include<stdio.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<netinet/in.h>intmain(intargc,charconst*argv[]){//1.创建套接字intsockfd=socket(AF_INET,SOCK_DGRAM,0);if(sockfd......
  • TCP简单的服务端代码(C语言)
    1#include<stdio.h>2#include<strings.h>//bzero3#include<unistd.h>//close4#include<sys/socket.h>//socket5#include<netinet/in.h>//structsockaddr_in6#include<arpa/inet.h>//inet_addr7i......
  • 求其最大公约数和最小公倍数,一行代码完成
    题目:输入两个正整数m和n,求其最大公约数和最小公倍数。求出最大公约数就行,最小公倍数用m*n除以最大公约数就行packagemyself;importjava.util.Scanner;/***@AutherQY*@Date2023/12/11*/publicclassSix{publicstaticvoidmain(String[]args){......
  • 代码随想录算法训练营第一天|704.二分查找、27.移除元素
    LeetCode704二分查找题目链接704.二分查找二分法确定区间(循环不变量):对于有序数组,定义循环区间二分查找元素 LeetCode27.移除元素题目链接:27.移除元素快慢指针,快指针查,慢指针存 ......
  • 嵌入式代码优化技巧
    内存管理技巧1.C/C++工程应尽量避免深拷贝,尽量用浅拷贝(指针或者引用),如果指针需要频繁拷贝,用智能指针是一种不错的选择2.启用内存池管理线程的内存开销,事先在堆里边分配好,然后快速使用避免复杂的浮点运算1.复杂的浮点运算尽量避免,有些芯片是不支持硬件双精度浮点数的,比如全志T3,......
  • 代码随想录算法训练营第一天 | 数组理论基础,704. 二分查找,27. 移除元素
    一、数组理论基础学习前:1.数组定义一些在内存上连续存储的相同数据类型的数据的集合2.数组特征便于查询数组元素,不便于增删数据元素学习后:对于Java,二维数组不一定在内存上连续。如int[i][j],唯一确定的是int[i][]在内存上连续二、704.二分查找LeetCode704.二分查找......
  • TCP简单的客户端代码(C语言)
    1#include<stdio.h>2#include<unistd.h>3#include<sys/socket.h>4#include<netinet/in.h>5#include<arpa/inet.h>6intmain(intargc,charconst*argv[])7{8//1.创建套接字(TCP)9intsockfd=socket(AF_......
  • 代码随想录算法训练营第一天| LeetCode704 二分查找、27移除元素
     Leetcode704:二分查找今日学习的文章链接:代码随想录(programmercarl.com) 题目链接:704.二分查找-力扣(LeetCode)●  自己看到题目的第一想法这题我会,但是还没明白卡尔说的循环不变量是什么意思。我的固定思路就是,target比中间值大,左指针右移到mid+1;target比中间值......
  • 随机森林代码实现(奥拓数据分类)
    importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltdata=pd.read_csv("./data/train.csv")data.head()importseabornassnssns.countplot(data.target)plt.show()#采用随机欠采样之前需要确定数据的特征值和标签值y=data["target"]x=data......