日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python编写tftp服务器

發布時間:2024/8/1 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python编写tftp服务器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • tftp服務起下載文件 from socket import *import struct import osimport sysdef main():if len(sys.argv) != 3:print("請按照規則運行程序:python3 xxx.py ip filename")exit()#服務器iptftp_ip = sys.argv[1]#文件名字file_name = sys.argv[2]#名字大小file_num = len(file_name)#下載請求cmd_buf = struct.pack("!H%dsb5sb"%file_num,1,file_name.encode("utf-8"),0,"octet".encode("utf-8"),0)#創建套接字socket_udp = socket(AF_INET,SOCK_DGRAM)#給服務器發送我需要的東西socket_udp.sendto(cmd_buf,(tftp_ip,69))#打開一個文件f = open(file_name,"bw")flag = Truenum = 0while True:result = socket_udp.recvfrom(1024)#數據 新ip端口tftp_data,tftp_ip_port = result#操作號cmd_tuple = struct.unpack("!H",tftp_data[:2])#塊編號cmd_tuple2 = struct.unpack("!H",tftp_data[2:4]) #操作碼tftp_opcode = cmd_tuple[0]#塊編號tftp_serial_number = cmd_tuple2[0]#打印當前快編號print(tftp_serial_number)if tftp_opcode == 3: #是否為數據#計算出這次應該接收到的文件的序號值,應該是上一次接收到的值的基礎上+1num = num + 1# 如果一個下載的文件特別大,即接收到的數據包編號超過了2個字節的大小# 那么會從0繼續開始,所以這里需要判斷,如果超過了65535 那么就改為0if num == 65536: num = 0if num == tftp_serial_number: # 用塊編號測試是否有重復數據f.write(tftp_data[4:])#測試Ackcmd_buf2 = struct.pack("!HH",4,tftp_serial_number)#把當前接收到的 快編號發送個服務器 隨機端口和ipsocket_udp.sendto(cmd_buf2,tftp_ip_port)#測試數據長度if len(tftp_data) < 516:print("傳輸完畢.....")breakelif tftp_opcode == 5:print("沒有這個文件夾......")flag = Falshif flag == True:f.close() #關閉文件else:os.unlink(file_name)#沒有這個文件 把創建的文件刪除socket_udp.close() #關閉套接字if __name__ == "__main__":main()
  • tftp服務器上傳文件 from socket import *import structimport sysimport os#上傳的主要核心你要知道你是發送方#服務器是接收方 服務器反回確認信息,或者報錯信息def main():if len(sys.argv) != 3:print("python3 xxx.py ip filename")exit()tftpd_ip = sys.argv[1]tftpd_file_name = sys.argv[2]#打包cmd_buf = struct.pack("!H%dsb5sb"%len(tftpd_file_name),2,tftpd_file_name.encode("utf-8"),0,"octet".encode("utf-8"),0)socket_udp = socket(AF_INET,SOCK_DGRAM)socket_udp.sendto(cmd_buf,(tftpd_ip,69))f = open(tftpd_file_name,"br")num = 1 #這里寫1是因為 我上面發送了一次的flag = Truewhile True:result = socket_udp.recvfrom(1024)#服務起反回的確認信息 和 ip porttftpd_data,tftpd_ip_port = result#操作號 服務的確認的操作好op_num = struct.unpack("!H",tftpd_data[:2])#塊編號 服務起反回的快編號pack_num = struct.unpack("!H",tftpd_data[2:4])print(pack_num[0])if op_num[0] == 4:if num-1 == pack_num[0]: # 這里寫num-1 是因為 pack_num[0] 是反回的我上次發的快編號send_data = f.read(512)if len(send_data) < 512:print("傳輸完成........")break#num是快編號 因為我是發送方 我要自做個快比那好cmd_bug = struct.pack("!HH%ds"%len(send_data),3,num,send_data) #send_data是讀取的文件信息socket_udp.sendto(cmd_bug,tftpd_ip_port) #發給服務器num = num + 1 #我的快編號加1elif op_num[0] == 5:print("沒有這個文件......")flag = Falshbreakif flag == True:f.close()else:os.unlink(tftpd_file_name) #刪除這個文件if __name__ == "__main__":main()
  • 總結

    以上是生活随笔為你收集整理的python编写tftp服务器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。