185 - 186.编写TFTP下载器

TFTP下载器

1.环境搭建

使用tftpd32搭建本地Tftp服务器,将文件路径选择到指定位置(当前位置为桌面)
将文件1.png放在桌面位置。
在这里插入图片描述

2.实现代码
from socket import *
import struct
filename = '1.png'#存放即将下载的文件名
server_ip = '192.168.1.101'#存放服务器所在ip地址
send_data = struct.pack('!H%dsb5sb' % len(filename),1,filename.encode(),0,'octet'.encode(),0)#由于filename长度不固定,用% len(filename)  %d
s = socket(AF_INET,SOCK_DGRAM)
s.sendto(send_data,(server_ip,69))
f = open(filename,'ab')#创建空文件
while True:
    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("操作码:%d,ACK: %d,服务器随机端口:%d,数据长度:%d"%(caozuoma,ack_num,rand_port,len(recv_data[0][4:])))
    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确认包

send_data = struct.pack(‘!H%dsb5sb’ % len(filename),1,filename.encode(),0,‘octet’.encode(),0)
由于filename长度不固定,表示% len(filename) 个字节数
这里构建读写请求

caozuoma,ack_num = struct.unpack(‘!HH’,recv_data[0][:4])
用recv_data[0]的前两个字节表示操作码,第三第四字节表示块编号

ack_data = struct.pack(“!HH”, 4, ack_num)
s.sendto(ack_data,(server_ip,rand_port))
发送ACK确认码

3.运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oo0day

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值