[轉載] Python中TFTP的理解

參考鏈接: Python中的打包pack和拆包unpack參數

Num01–>TFTP協議介紹?

?

?TFTP(Trivial File Transfer Protocol,簡單文件傳輸協議)?

?是TCP/IP協議族中的一個用來在客戶端與服務器之間進行簡單文件傳輸的協議?

?特點:?

?1,簡單? 2,占用資源小? 3,適合傳遞小文件? 4,適合在局域網進行傳遞? 5,端口號為69? 6,基于UDP實現?

?

Num02–>TFTP下載過程?

?

?TFTP服務器默認監聽69號端口?

?當客戶端發送“下載”請求(即讀請求)時,需要向服務器的69端口發送?

?服務器若批準此請求,則使用一個新的、臨時的 端口進行數據傳輸?

?

?

?

?當服務器找到需要現在的文件后,會立刻打開文件,把文件中的數據通過TFTP協議發送給客戶端?

?如果文件的總大小較大(比如3M),那么服務器分多次發送,每次會從文件中讀取512個字節的數據發送過來?

?因為發送的次數有可能會很多,所以為了讓客戶端對接收到的數據進行排序,所以在服務器發送那512個字節數據的時候,會多發2個字節的數據,用來存放序號,并且放在512個字節數據的前面,序號是從1開始的?

?因為需要從服務器上下載文件時,文件可能不存在,那么此時服務器就會發送一個錯誤的信息過來,為了區分服務發送的是文件內容還是錯誤的提示信息,所以又用了2個字節 來表示這個數據包的功能(稱為操作碼),并且在序號的前面?

?

操作碼? ? ?功能

?1? ? ? 讀請求,即下載

?2? ? ? 寫請求,即上傳

?3? ? ? 表示數據包,即DATA

?4? ? ? 確認碼,即ACK

?5? ? ? 錯誤?

?

?因為udp的數據包不安全,即發送方發送是否成功不能確定,所以TFTP協議中規定,為了讓服務器知道客戶端已經接收到了剛剛發送的那個數據包,所以當客戶端接收到一個數據包的時候需要向服務器進行發送確認信息,即發送收到了,這樣的包成為ACK(應答包)?

?為了標記數據已經發送完畢,所以規定,當客戶端接收到的數據小于516(2字節操作碼+2個字節的序號+512字節數據)時,就意味著服務器發送完畢了?

?

Num03–>TFTP數據包的格式?

?

Num04–>TFTP客戶端案例編寫?

#! /usr/bin/env python3

# -*- coding:utf-8 -*-?

?

from socket import *

import struct #為了實現打包struct.pack()和拆包struct.unpack()數據

import sys

?

# python3 05-xx.py 192.168.105.125 bb.jpg

def main():

?

? ? if len(sys.argv) < 3:

? ? ? ? sys.exit('usage : python3? %s ip filename' % sys.argv[0])

?

? ? #server_ip = '192.168.105.125'

? ? #file_name = 'bb.jpg'

?

? ? server_ip = sys.argv[1]

? ? file_name = sys.argv[2]

?

? ? udp_socket = socket(AF_INET, SOCK_DGRAM)

? ? server_addr = (server_ip,69)

?

? ? #? 打包數據

? ? # !表示網絡字節序,H表示2bytes無符號整數,

? ? #? 5s表示長度為5字符串

? ? #? B表示1byte的無符號整數

? ? fmt = '!H%dsB5sB' % len(file_name)

? ? send_data = struct.pack(fmt,1,file_name.encode() ,0,b'octet',0)

? ? #send_data = struct.pack(fmt,1,file_name ,0,b'octet',0)

?

? ? udp_socket.sendto(send_data,server_addr)

?

? ? f =? None # 文件對象

? ? #上一次blockNum

? ? lastBlockNum = 0

?

? ? # 循環接收和應答

? ? while True:

? ? ? ? recv_data,peer_addr = udp_socket.recvfrom(1024)

? ? ? ? # 拆包數據

? ? ? ? opcode,blockNum = struct.unpack('!HH',recv_data[:4])

?

? ? ? ? if opcode == 3: # 表示數據包

? ? ? ? ? ? # 寫入文件

? ? ? ? ? ? # 1打開文件

? ? ? ? ? ? # 第一次收到服務器發送數據包

? ? ? ? ? ? if blockNum == 1:?

? ? ? ? ? ? ? ? f = open(file_name,'wb')

?

? ? ? ? ? ? # 拆出數據

? ? ? ? ? ? data_fmt = '!%ds' % (len(recv_data) - 4)

? ? ? ? ? ? data_content = struct.unpack(data_fmt, recv_data[4:])

?

? ? ? ? ? ? # 寫入文件之前判斷寫過沒有

? ? ? ? ? ? # if 這一次blockNum == 上一次blockNum + 1

? ? ? ? ? ? if lastBlockNum + 1 == blockNum:

? ? ? ? ? ? ? ? #print(data_content[0])

? ? ? ? ? ? ? ? f.write(data_content[0]) # 拆出來是元組,bytes對象,write時候需要str字符串

?

? ? ? ? ? ? # 打包應答數據

? ? ? ? ? ? ack_data = struct.pack('!HH',4,blockNum)

? ? ? ? ? ? udp_socket.sendto(ack_data,peer_addr) # 不能再給server_addr,因為端口號變了

?

? ? ? ? ? ? # 當應答完畢,更新lastBlockNum

? ? ? ? ? ? lastBlockNum = blockNum

?

? ? ? ? ? ? # 如果數據長度小于 2 + 2 + 512 傳輸結束

? ? ? ? ? ? if len(recv_data) < 516:

? ? ? ? ? ? ? ? print('over')

? ? ? ? ? ? ? ? f.close()

? ? ? ? ? ? ? ? break

? ? ? ? elif opcode == 5:# 出錯

? ? ? ? ? ? err_num = blockNum

? ? ? ? ? ? # 拆出錯誤信息

? ? ? ? ? ? fmt = "!%ds" % (len(recv_data) - 5)

? ? ? ? ? ? err_msg = struct.unpack(fmt,recv_data[4:-1])

? ? ? ? ? ? print('出錯信息:%s' % err_msg)

? ? ? ? ? ? break

?

if __name__ == "__main__":

? ? main()

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

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

相關文章

gn fast-gn_GN的完整形式是什么?

gn fast-gnGN&#xff1a;晚安 (GN: Good Night) GN is an abbreviation of "Good Night". GN是“ Good Night”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Facebook, Yahoo Messenge…

從零開始編寫自己的C#框架(27)——什么是開發框架

前言 做為一個程序員&#xff0c;在開發的過程中會發現&#xff0c;有框架同無框架&#xff0c;做起事來是完全不同的概念&#xff0c;關系到開發的效率、程序的健壯、性能、團隊協作、后續功能維護、擴展......等方方面面的事情。很多朋友在學習搭建自己的框架&#xff0c;很多…

[轉載] Python 遞歸 深入理解遞歸 Python遞歸剖析,絕對讓你看懂!

參考鏈接&#xff1a; Python | print()中的結束參數 目錄 遞歸剖析 遞歸的兩個過程 return 返回值 詳解 遞歸思路二分法和遞歸尾遞歸遞歸練習題 遞歸剖析 遞歸真的很重要&#xff0c;之前學的時候&#xff0c;學的一知半解&#xff0c;以為真正了解&#xff0c;每次想到遞歸…

laravel 項目遷移_在Laravel遷移

laravel 項目遷移Before moving forward we need to know some facts about it, 在繼續前進之前&#xff0c;我們需要了解一些事實&#xff0c; Resources: In these directories, we have already a js, lang, sass and view page. Where, sass and js file holf their uncom…

Python之list對應元素求和

本次分享將講述如何在Python中對多個list的對應元素求和&#xff0c;前提是每個list的長度一樣。比如&#xff1a;a[1,2,3], b[2,3,4], c[3,4,5], 對a,b,c的對應元素求和&#xff0c;輸出應為[6,9,12].    方法一&#xff1a;   直接求解&#xff0c;按照對應元素相加的…

[轉載] Python中str跟int的轉換

參考鏈接&#xff1a; Python中的類型轉換 字符串str轉換成int: int_value int(str_value) int轉換成字符串str: str_value str(int_value) a100 b666 #int轉str類型 print(int轉str類型) print(int轉str&#xff1a; str(a)) #str轉int類型 print(str轉int類型…

ot協議是什么_OT的完整形式是什么?

ot協議是什么OT&#xff1a;主題外 (OT: Off Topic) OT is an abbreviation of "Off Topic". OT是“ Off Topic”的縮寫 。 It is an expression, which is commonly used in Gmail or messaging platform. It shows that the email that has been sent is irrelev…

[轉載] python中字符串編碼形式及其所占字節

參考鏈接&#xff1a; Python中的字節對象與字符串 1.常見字符串編碼錯誤 在使用Python讀文件時經常遇到編碼問題引起的錯誤&#xff0c;比如&#xff1a; UnicodeDecodeError: gbk codec cant decode byte 0x80 in position 30: illegal multibyte sequence 遇到這種異…

[AtCoder-ARC073F]Many Moves

題目大意&#xff1a;   有一排n個格子和2枚硬幣。   現在有q次任務&#xff0c;每一次要你把其中一枚硬幣移到x的位置上&#xff0c;移動1格的代價是1。   兩枚硬幣不能同時移動&#xff0c;任務必須按次序完成。   現在告訴你兩枚硬幣初始狀態所在的位置a和b&#xf…

ScalavsKotlin

Is Scala better that Kotlin? No..., Is Kotlin better than Scala? No... Scala比Kotlin更好嗎&#xff1f; 不...&#xff0c;Kotlin勝過Scala嗎&#xff1f; 沒有... Both programming languages have their own profits and are for a specific set of development. It…

工業智能相機與基于PC的機器視覺的區別比較

隨著科技的日漸成熟&#xff0c;機器視覺得到了飛速發展。由于嵌入式技術的發展,近幾年智能相機性能顯著提高&#xff0c;越來越多必須依賴于PC處理的應用開始向智能相機平臺傾斜。低成本、高可靠性及易于安裝維護等優勢&#xff0c;使得機器視覺在制造業上的規模性應用越來越普…

[轉載] python skimage在圖像處理中的用法

參考鏈接&#xff1a; 在Python中打印單變量和多變量 基于python腳本語言開發的數字圖片處理包&#xff0c;比如PIL,Pillow, opencv, scikit-image等。 PIL和Pillow只提供最基礎的數字圖像處理&#xff0c;功能有限&#xff1b;opencv實際上是一個c庫&#xff0c;只是提供了py…

scala元組 數組_Scala中的數組

scala元組 數組Scala中的數組 (Arrays in Scala) An array is a linear data structure with a fixed number of elements. It is a collection that stores a fixed number Arrays in Scalf elements of the same datatype. In Scala, an array is 0 indexed, i.e. the first …

OpenStack —— DevStack一鍵自動化安裝

一、DevStack介紹Devstack目前是支持Ubuntu16.04和CentOS 7&#xff0c;而且Devstack官方建議使用Ubuntu16.04&#xff0c;所以我們使用Ubuntu 16.04進行安裝。默認無論是Devstack和OpenStack&#xff0c;都是采用Master的代碼進行安裝&#xff0c;這樣經常會出現&#xff0c;今…

[轉載] Python學習筆記——運維和Shell

參考鏈接&#xff1a; 在C / C&#xff0c;Python&#xff0c;PHP和Java中交換兩個變量 目錄 什么是運維 運維第一工具-shell編程 shell歷史 執行腳本 基本語法 Shell腳本語法 條件測試&#xff1a;test [ if/then/elif/else/fi case/esac for/do/done …

scala java混合_Scala特性混合

scala java混合Scala | 特性混合 (Scala | Trait Mixins ) In Scala, the number of traits can be extended using a class or an abstract class. This is known as Trait Mixins. For extending, only traits, the blend of traits, class or abstract class are valid. If …

Scala鑄造

Scala中的類型 (Types in Scala) Type also know as data type tells the compiler about the type of data that is used by the programmer. For example, if we initialize a value or variable as an integer the compiler will free up 4 bytes of memory space and it wi…

/ 卡路里_最大卡路里

/ 卡路里Problem statement: 問題陳述&#xff1a; Shivang is very foodie but he has a diet plan. He has an array of elements indicating the calorie of food he can consume on that day. In his diet plan, he can’t eat on for three consecutive days. But since …

[轉載] Python類中的私有變量和公有變量

參考鏈接&#xff1a; Python中的私有變量 我們這里就直奔主題&#xff0c;不做基礎鋪墊&#xff0c;默認你有一些Python類的基礎&#xff0c;大家在看這篇博客的時候&#xff0c;如果基礎知識忘了&#xff0c;可以去菜鳥教程 從一個簡單的類開始 class A(): #定義一…

OpenCV探索之路(二十五):制作簡易的圖像標注小工具

搞圖像深度學習的童鞋一定碰過圖像數據標注的東西&#xff0c;當我們訓練網絡時需要訓練集數據&#xff0c;但在網上又沒有找到自己想要的數據集&#xff0c;這時候就考慮自己制作自己的數據集了&#xff0c;這時就需要對圖像進行標注。圖像標注是件很枯燥又很費人力物力的一件…