Linux網絡編程 深入解析TFTP協議:基于UDP的文件傳輸實戰

知識點1【TFTP的概述】

學習通信的基本:通信協議(具體發送上面樣的報文)、通信流程(按照什么步驟發送)

1、TFTP的概述

tftp:簡單文件傳輸協議,**基于UDP,**不進行用戶有效性驗證

基于UDP:編程架構是UDP的

必須創建UDP套接字

套接字分類:UDP套接字,TCP套接字,原始套接字

數據傳輸格式(模式選擇):

octet:二進制模式

netascii:文本模式

2、TFTP的通信過程

決定了 編程流程

我們主要寫客戶端

注意:

服務器中,在69號端口后,是臨時端口,臨時端口是只要socket,不bind。因此需要創建一個新的線程,線程中執行socket()

TFTP通信過程總結

3、TFTP協議分析

讀寫請求是用戶自己發送的,我們現在不考慮選項部分。

數據包516個字節,當小于516個字節的時候,表示下載 結束(最后一個報文),塊編號中存儲的是該數據包的編號。這里注意一定要對操作碼進行判斷,是3才可以確認是數據包。

收到數據包 我們需要回復一個ACK,ACK中的塊編號需要和數據包的ACK相同

這里有一個技巧,客戶端直接把收到的內容的前4個字節發送給服務器,只需要修改操作碼的第二個字節即可

錯誤碼操作碼是5,差錯碼是不同的錯誤有不同的編號,差錯信息說明錯誤。

OACK是比如我們設置了選項部分,需要設置的,相對復雜,我們下面介紹。

想一想

傳輸的數據的大小一定是 512Byte 嗎?

由于網絡的原因,一方收不到另一方的數據怎么辦?

1、不一定需要512,選項修改

2、這里服務器發送數據包后,如果沒有收到ACK,它會等待,并從發送數據包處開始計時,超出 超時時間后,才會發出錯誤碼,提示重發。

而這里的數據包長度修改,超時時間的修改,都需要借助選項來完成

4、TFTP帶選項的讀寫報文

選項和值成對出現。

OACK是在修改了選項后,服務器向客戶端發送的一個報文,是起一個確認作用的。

我們結合上圖,客戶端一旦修改了選項部分,客戶端不再是立即發送數據,而是發送OACK,讓客戶端確認是否要這樣修改(通過ACK,塊編號中:0表示同意,這也是為什么數據編號是從1開始的),客戶端給予回應后,服務器才會執行發送數據的操作。

選項的種類

tsize 選項

當讀操作時,tsize 選項的參數必須為“0”,服務器會返回待讀取的文件的大小

當寫操作時,tsize 選項參數應為待寫入文件的大小,服務器會回顯該選項

blksize 選項

修改傳輸文件時使用的數據塊的大小(范圍:8~65464)

timeout 選項

修改默認的數據傳輸超時時間(單位:秒)

注意:

1、選項沒有順序

2、在使用tsize 讀操作的時候,tsize的默認參數是0(因為讀時不知道文件的大小),收到OACK的時候,會返回實際文件的大小(nB說明是字符串需要轉換)

總結

1、可以通過發送帶選項的讀/寫請求發送給 server 2、如果 server 允許修改選項則發送選項修改確認包 3、server 發送的數據、選項修改確認包都是臨時 port 4、server 通過 timeout 來對丟失數據包的重新發送

知識點2【TFTP案例】

需求:編寫TFTP客戶端(不帶選項),從客戶端下載文件

流程:

1、創建UDP套接字

2、構建讀請求報文,并發送到服務器69號端口

3、while 循環接收,buf是516個字節,recvform的返回值是獲取到數據的長度

這里需要創建一個文件描述符取接收

4、關閉文件描述符 和 套接字

構建 讀寫請求報文 的方式

使用sprintf組包,當sendto時,有一個內容長度,使用sprintf的返回值:組包的總長度,目的端口寫69

代碼演示

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(int argc, char const *argv[])
{if(argc != 3){printf("error\\n");printf("modo:./a.out 196.168.9.28 a.txt\\n");_exit(-1);}//創建套接字,目的:向服務器發送數據int fd_sock = socket(AF_INET,SOCK_DGRAM,0);if(fd_sock < 0){perror("socket");return 0;}//sprintf組包,返回值使用len_sprintf接收。格式: 0 1 文件名 0 模式 0 char arr_sprintf[64] = "";int len_sprintf = sprintf(arr_sprintf,"%c%c%s%c%s%c",0,1,argv[2],0,"octet",0);//發送sprintf組包(讀寫報文)struct sockaddr_in addr_rw;memset(&addr_rw,0,sizeof(addr_rw));addr_rw.sin_family = AF_INET;addr_rw.sin_port = htons(69);addr_rw.sin_addr.s_addr = inet_addr(argv[1]);sendto(fd_sock,arr_sprintf,len_sprintf,0,(struct sockaddr *)&addr_rw,sizeof(addr_rw));/*  接收服務器發出的 數據報文,報文的前四個字節:操作碼(2),端口碼(2),數據(512),存儲在arr_recv中數據段操作碼判斷,下面是3的操作重復性判斷,定義一個unsigned short num = 0,num+1與端口碼比較數據寫入文件,并將端口碼賦值給numACK 回應服務器 arr_recv前四個字節進行處理即可*///操作碼為5操作//關閉套接字 及 文件描述符 //輸出錯誤原因unsigned short num = 0;int fd_w = open(argv[2],O_WRONLY | O_CREAT,0664);if(fd_w < 0){close(fd_sock);perror("open");return 0;}int len = 0;unsigned char arr_recv[516] = "";struct sockaddr_in addr_recv;int len_recv = sizeof(addr_recv);do{len = recvfrom(fd_sock,arr_recv,sizeof(arr_recv),0,(struct sockaddr *)&addr_recv,&len_recv);if(arr_recv[1] == 3){if((unsigned short)(num + 1) == ntohs(*(unsigned short *)(arr_recv +2))){write(fd_w,arr_recv + 4,len - 4);//ack應答num = ntohs(*(unsigned short *)(arr_recv +2));printf("%d\\n",num);}arr_recv[1] = 4;sendto(fd_sock,arr_recv,4,0,(struct sockaddr *)&addr_recv,sizeof(addr_recv));}else if(arr_recv[1] == 5){close(fd_sock);close(fd_w);unlink(argv[2]);printf("%s\\n",arr_recv+4);_exit(-1);}} while (len == 516);//關閉文件描述符,套接字,關閉文件close(fd_w);close(fd_sock);return 0;
}

代碼運行結果

結束

代碼重在練習!

代碼重在練習!

代碼重在練習!

今天的分享就到此結束了,希望對你有所幫助,如果你喜歡我的分享,請點贊收藏夾關注,謝謝大家!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79436.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79436.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79436.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

「數據可視化 D3系列」入門第十一章:力導向圖深度解析與實現

D3.js 力導向圖深度解析與實現 力導向圖核心概念 力導向圖是一種通過物理模擬來展示復雜關系網絡的圖表類型&#xff0c;特別適合表現社交網絡、知識圖譜、系統拓撲等關系型數據。其核心原理是通過模擬粒子間的物理作用力&#xff08;電荷斥力、彈簧引力等&#xff09;自動計…

音頻格式轉換

1. 下載ffmpeg https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-7.1.1-full_build.7z 2. 配置ffmpeg環境變量 3.安裝pydub pip install pydub 4.編寫轉化工具代碼 from pydub import AudioSegment def convertM4aToWav(m4a,wav):sound AudioSegment.from_file(m4a, f…

基于spring boot 集成 deepseek 流式輸出 的vue3使用指南

本文使用deepseek API接口流式輸出的文章。 環境要求 jdk17 spring boot 3.4 代碼如下: package com.example.controller;import jakarta.annotation.PostConstruct; import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.mes…

微博輻射源和干擾機

微波輻射源和干擾機是電子戰和通信領域中的兩個重要概念&#xff0c;它們在軍事、民用及科研中具有廣泛應用。以下是兩者的詳細解析及其相互關系&#xff1a; ?1. 微波輻射源? ?定義?&#xff1a; 微波輻射源是指能夠主動發射微波&#xff08;頻率范圍通常為 ?300 MHz&…

2025年4月16日華為留學生筆試第三題300分

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍OJ 03. 智慧城市網絡優化 問題描述 K小姐是一家智慧城市服務提供商的網絡架構師。她負責規劃城市邊緣計算節點的布局,以提供更快速、穩定的網絡服務。 城市內有 n n

多線程編程的簡單案例——單例模式[多線程編程篇(3)]

目錄 前言 1.wati() 和 notify() wait() 和 notify() 的產生原因 如何使用wait()和notify()? 案例一:單例模式 餓漢式寫法: 懶漢式寫法 對于它的優化 再次優化 結尾 前言 如何簡單的去使用jconsloe 查看線程 (多線程編程篇1)_eclipse查看線程-CSDN博客 淺談Thread類…

pytorch基本操作2

torch.clamp 主要用于對張量中的元素進行截斷&#xff08;clamping&#xff09;&#xff0c;將其限制在一個指定的區間范圍內。 函數定義 torch.clamp(input, minNone, maxNone) → Tensor 參數說明 input 類型&#xff1a;Tensor 需要進行截斷操作的輸入張…

一次制作參考網雜志的閱讀書源的實操經驗總結(附書源)

文章目錄 一、背景介紹二、書源文件三、詳解制作書源&#xff08;一&#xff09;打開Web服務&#xff08;二&#xff09;參考網結構解釋&#xff08;三&#xff09;閱讀書源 基礎&#xff08;四&#xff09;閱讀書源 發現&#xff08;五&#xff09;閱讀書源 詳細&#xff08;六…

并發設計模式實戰系列(2):領導者/追隨者模式

&#x1f31f; ?大家好&#xff0c;我是摘星&#xff01;? &#x1f31f; 今天為大家帶來的是并發設計模式實戰系列&#xff0c;第二章領導者/追隨者&#xff08;Leader/Followers&#xff09;模式&#xff0c;廢話不多說直接開始~ 目錄 領導者/追隨者&#xff08;Leader/…

自求導實現線性回歸與PyTorch張量詳解

目錄 前言一、自求導的方法實現線性回歸1.1自求導的方法實現線性回歸的理論講解1.1.1 線性回歸是什么&#xff1f;1.1.2線性回歸方程是什么&#xff1f;1.1.3散點輸入1.2參數初始化1.2.1 參數與超參數1.2.1.1 參數定義1.2.1.2 參數內容1.2.1.3 超參數定義1.2.1.4 超參數內容1.…

2025年機電一體化、機器人與人工智能國際學術會議(MRAI 2025)

重要信息 時間&#xff1a;2025年4月25日-27日 地點&#xff1a;中國濟南 官網&#xff1a;http://www.icmrai.org 征稿主題 機電一體化機器人人工智能 傳感器和執行器 3D打印技術 智能控制 運動控制 光電系統 光機電一體化 類人機器人 人機界面 先進的運動控制 集成制造系…

線性代數 | 知識點整理 Ref 3

注&#xff1a;本文為 “線性代數 | 知識點整理” 相關文章合輯。 因 csdn 篇幅合并超限分篇連載&#xff0c;本篇為 Ref 3。 略作重排&#xff0c;未整理去重。 圖片清晰度限于引文原狀。 如有內容異常&#xff0c;請看原文。 《線性代數》總復習要點、公式、重要結論與重點釋…

CFD中的動量方程非守恒形式詳解

在計算流體力學&#xff08;CFD&#xff09;中&#xff0c;動量方程可以寫成守恒形式和非守恒形式&#xff0c;兩者在數學上等價&#xff0c;但推導方式和應用場景不同。以下是對非守恒形式的詳細解釋&#xff1a; 1. 動量方程的守恒形式 首先回顧守恒形式的動量方程&#xff…

Leetcode 1504. 統計全 1 子矩形

1.題目基本信息 1.1.題目描述 給你一個 m x n 的二進制矩陣 mat &#xff0c;請你返回有多少個 子矩形 的元素全部都是 1 。 1.2.題目地址 https://leetcode.cn/problems/count-submatrices-with-all-ones/description/ 2.解題方法 2.1.解題思路 單調棧 時間復雜度&…

【Docker】運行錯誤提示 unknown shorthand flag: ‘d‘ in -d ----詳細解決方法

使用docker拉取Dify的時候遇到錯誤 錯誤提示 unknown shorthand flag: d in -dUsage: docker [OPTIONS] COMMAND [ARG...]錯誤原因解析 出現 unknown shorthand flag: d in -d 的根本原因是 Docker 命令格式與當前版本不兼容&#xff0c;具體分為以下兩種情況&#xff1a; 新…

華為OD機試真題——攀登者2(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析&#xff1b; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式&#xff01; 2025華為OD真題目錄全流程解析/備考攻略/經驗分享 華為OD機試真題《攀登者2…

qt硬件與軟件通信中 16進制與十進制轉化

1. 首先上代碼, 這是在qt語言上的操作 截取 01 03 0C 00 00 00 00 00 00 00 0C 00 0C 00 0C 93 70 這串16進制數值進行處理&#xff0c;截取這樣一段內容 00 0C 00 0C 00 0C 字節數組轉字符串。從bytearray數組轉換為string. QString CustomTcpSocket::recieveInfo() {QByteArr…

圖形變換算法

一、學習目的 &#xff08;1&#xff09;掌握多面體的存儲方法。 &#xff08;2&#xff09;掌握圖形的幾何變換及投影變換。 &#xff08;3&#xff09;掌握三維形體不同投影方法的投影圖的生成原理。 &#xff08;4&#xff09;掌握多面體投影圖繪制的編程方法。 二、學…

【JAVAFX】自定義FXML 文件存放的位置以及使用

情況 1&#xff1a;FXML 文件與調用類在同一個包中&#xff08;推薦&#xff09; 假設類 MainApp 的包是 com.example&#xff0c;且 FXML 文件放在 resources/com/example 下&#xff1a; 項目根目錄 ├── src │ └── sample │ └── Main.java ├── src/s…

Ubuntu20.04安裝企業微信

建議先去企業微信官網看一下有沒有linux版本&#xff0c;沒有的話在按如下方式安裝&#xff0c;不過現在是沒有的。 方案 1、使用docker容器 2、使用deepin-wine 3、使用星火應用商店 4. 使用星火包deepin-wine 5、使用ukylin-wine 本人對docker不太熟悉&#xff0c;現…