python實現簡單tftp 基於udp

2022-04-11 12:09:14 字數 4291 閱讀 7379

from threading import thread

from socket import *

import struct

def upload(filename,user_ip,user_port):

num = 0

f = open(filename,'ab')

s_up = socket(af_inet,sock_dgram)

send_data_1 = struct.pack("!hh",4,num)

s_up.sendto(send_data_1,(user_ip,user_port)) #第一次用隨機埠傳送

while true:

recv_data,user_info = s_up.recvfrom(1024) #第二次客戶連線我隨機埠

caozuohao_up,ack_num = struct.unpack('!hh',recv_data[:4])

print(caozuohao_up,ack_num,num)

if int(caozuohao_up) == 3 and ack_num == num :

f.write(recv_data[4:])

send_data = struct.pack("!hh",4,num)

s_up.sendto(send_data,(user_ip,user_port)) #第二次我用隨機埠發

num = num + 1

if len(recv_data) < 516:

print(user_ip+'上傳檔案'+filename+':完成')

f.close()

exit()

def download(filename,user_ip,user_port):

s_down = socket(af_inet, sock_dgram)

num = 0

try:

f = open(filename,'rb')

except:

error_data = struct.pack('!hhhb',5,5,5,num)

s_down.sendto(error_data, (user_ip,user_port)) #檔案不存在時傳送

exit() #只會退出此執行緒

while true:

read_data = f.read(512)

send_data = struct.pack('!hh',3,num) + read_data

s_down.sendto(send_data, (user_ip,user_port)) #資料第一次傳送

if len(read_data) < 512:

exit()

recv_ack = s_down.recv(1024) #第二次接收

caozuoma,ack_num = struct.unpack("!hh", recv_ack)

# print(caozuoma,ack_num,len(read_data))

num += 1

if int(caozuoma) != 4 or int(ack_num) != num-1 :

exit()

f.close()

s = socket(af_inet,sock_dgram)

s.bind(('',69))

def main():

while 1:

recv_data,(user_ip,user_port) = s.recvfrom(1024) #第一次客戶連線69埠

print(recv_data, user_ip, user_port)

if struct.unpack('!b5sb',recv_data[-7:]) == (0, b'octet', 0):

caozuoma = struct.unpack('!h',recv_data[:2])

filename = recv_data[2:-7].decode('gb2312')

if caozuoma[0] == 1:

t = thread(target = download, args = (filename,user_ip,user_port))

t.start()

elif caozuoma[0] == 2:

print('對方想上傳資料',filename)

t = thread(target = upload, args = (filename,user_ip,user_port))

t.start()

if __name__ == '__main__':

main()

#!/usr/bin/env python3

#coding=utf-8

import struct

from socket import *

server_ip = '192.168.119.157'

send_data_1 = struct.pack('!h8sb5sb',2,'王輝.jpg'.encode('gb2312'),0,b'octet',0)

s = socket(af_inet,sock_dgram)

s.sendto(send_data_1,(server_ip,69)) #第一次發給伺服器69埠

f = open('王輝.jpg','rb')

recv_data = s.recvfrom(1024) #第一次接收資料

rand_port = recv_data[1][1]

print()

ack_num = struct.unpack("!hh",recv_data[0][:4])

num = 0

while true:

read_data = f.read(512)

send_data = struct.pack('!hh',3,num) + read_data

s.sendto(send_data,(server_ip,rand_port)) #第二次發給伺服器的隨機埠

s.sendto(send_data,(server_ip,69)) #第一次傳送, 連線伺服器69埠

f = open(filename,'ab')

while 1:

recv_data = s.recvfrom(1024) #接收資料

caozuoma,ack_num = struct.unpack('!hh',recv_data[0][:4]) #獲取資料塊編號

rand_port = recv_data[1][1] #獲取伺服器的隨機埠

if int(caozuoma) == 5:

print('伺服器返回: 檔案不存在...')

break

print(caozuoma,ack_num,rand_port,len(recv_data[0]))

f.write(recv_data[0][4:])

if len(recv_data[0]) < 516:

break

ack_data = struct.pack("!hh",4,ack_num)

s.sendto(ack_data,(server_ip,rand_port)) #回覆ack確認包

TFTP 簡單檔案傳送協議

tftp 簡單檔案傳送協議 1.tftp是乙個簡單的協議,適合唯讀儲存器,僅用於無盤系統進行系統引導。是一種停止等待協議 停止等待 就是每傳送完乙個分組就停止傳送,等待對方的確認。在收到確認後再傳送下乙個分組。2.tftp使用五種報文格式,本身不提供安全特性 3.一般基於udp tftp讀取過程 假...

tftp 簡單文字傳輸協議

tftp trival file transfer protocal 簡單檔案傳輸協議,該協議在熟知埠69上使用udp服務。tftp協議常用於無盤工作站或路由器從別的主機上獲取引導配置檔案,由於tftp報文比較小,能個迅速複製這些檔案。notice 1 tftp協議 所占用的記憶體小,其對應的軟體也...

tftp簡單文字傳輸協議

tftp trivial file transfer protocol,簡單檔案傳輸協議 是tcp ip協議族中的乙個用來在客戶機與伺服器之間進行簡單檔案傳輸的協議,基於udp實現。提供不複雜 開銷不大的檔案傳輸服務。埠號為69。2.tftp的報文格式,如圖所示 圖中顯示了5種tftp報文格式 操作...