Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

python简单实现tftp客户端(基于udp)

nike_9527 2019-02-16 18:25:00 阅读数:226 评论数:0 点赞数:0 收藏数:0

TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69。

接下来了解下TFTP协议内容,

               

1:客户发送和服务端每次通信,都要携带2个字节操作码(包的类型),

2:模式有三种类型,除了文件名其他基本上固定  

(1)netascii,这是8位的ASCII码形式

(2)octet,8位源数据类型

(3)mail这种不在支

3:TFTP支持五种类型的包,根据不同操作不同解析                                

     

4:服务端把数据包发送到客户端,包括这次发送块数据的编号和数据一起发送到:客户端

5:客户端接收到数据,要向服务服务

看代码

 1 from socket import *
 2 import struct
 3 import time
 4 udp_sock = socket(AF_INET,SOCK_DGRAM) #创建一个socket
 5 #send_data = 0x01612E706E67006f6374657400
 6 ip = ("192.168.1.10",69)
 7 send_data = struct.pack("!H5sb5sb",1,b"a.png",0,b"octet",0)#将数据打包成二进制字符串
 8 udp_sock.sendto(send_data,ip)#向服务器发送请求下载
 9 while True:
10 data,addr = udp_sock.recvfrom(1024)#接收服务端的数据
11 data_len = len(data)
12 send_data = struct.unpack("!HH",data[:4])#把二进制转换成数据
13 if send_data[0] == 3:#3表示服务端发送过来的数据包
14 if send_data[1] == 1:
15 f = open("b.png","wb+")
16 f.write(data[4:])#数据包前4个字节是操作码和块编号,之后的就是实际数据
17 ack_data = struct.pack("!HH",4,send_data[1])#这里的4确认码 send_data[1]是服务端发过来的块编号
18 udp_sock.sendto(ack_data,addr)#向服务发送数据表示确认收到数据
19 if data_len<516:
20  f.close()
21 print("下载完成")
22 break
23 elif send_data[0] == 5:
24 print("下载失败")
25 break
26 udp_sock.close()

 

版权声明
本文为[nike_9527]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/zz-952/p/10388686.html

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领