python实现简单tftp(基于udp协议)


Posted in Python onJuly 30, 2018

本文实例为大家分享了python实现简单tftp的具体代码,供大家参考,具体内容如下

python实现简单tftp(基于udp协议)

  • tftp是基于udp的协议
  • 实现简单的tftp,首先要有tftp的协议图。
  • tftp默认接收端口为69,但每次有连接过来后,tftp会随机分配一个端口来专门为这个连接来服务。
  • 操作码:1.上传 2.下载 3.传数据 4.接收确认 5.错误码

tftp服务器简单实现:

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:
   print('传输完成, 对方下载成功')
   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:
    print('对方想下载数据',filename)
    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)) #第二次发给服务器的随机端口
 recv_data_2,userinfo = s.recvfrom(1024)
 print(recv_data_2)
 ack_num = struct.unpack('!H',recv_data_2[2:4])
 print(len(read_data),num,ack_num[0],rand_port)
 if len(read_data) < 512 or ack_num[0] != num :
  break
 num = num + 1

下载数据简单实现:

#!/usr/bin/env python3
#coding=utf-8

import struct
from socket import *

filename = 'test.jpg'
server_ip = '192.168.1.113'

send_data = struct.pack('!H%dsb5sb'%len(filename),1,filename.encode('gb2312'),0,'octet'.encode('gb2312'),0)
s = socket(AF_INET,SOCK_DGRAM)
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确认包

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python生成随机数组的方法小结
Apr 15 Python
tensorflow获取变量维度信息
Mar 10 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
Jun 01 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
Jul 09 Python
python reverse反转部分数组的实例
Dec 13 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
django 微信网页授权登陆的实现
Jul 30 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
Python QTimer实现多线程及QSS应用过程解析
Jul 11 Python
详解torch.Tensor的4种乘法
Sep 03 Python
Pycharm学生免费专业版安装教程的方法步骤
Sep 24 Python
Django中和时区相关的安全问题详解
Oct 12 Python
Python实现处理逆波兰表达式示例
Jul 30 #Python
python实现自动网页截图并裁剪图片
Jul 30 #Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
Jul 30 #Python
对PyTorch torch.stack的实例讲解
Jul 30 #Python
Python 中字符串拼接的多种方法
Jul 30 #Python
TensorFlow Session会话控制&amp;Variable变量详解
Jul 30 #Python
TensorFlow Session使用的两种方法小结
Jul 30 #Python
You might like
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
php相当简单的分页类
2008/10/02 PHP
PHP的博客ping服务代码
2012/02/04 PHP
简单谈谈php浮点数精确运算
2016/03/10 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
javascript制作loading动画效果 loading效果
2014/01/14 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
微信小程序实现左右联动的实战记录
2018/07/05 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
scrapyd schedule.json setting 传入多个值问题
2019/08/07 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
Python的Django框架下管理站点的基本方法
2015/07/17 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
德国柯吉澳趣味家居:Koziol
2017/08/24 全球购物
自荐信结尾
2013/10/27 职场文书
服务员自我评价
2014/01/25 职场文书
人事部经理岗位职责
2014/03/07 职场文书
个人委托书格式
2014/04/04 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
2015年保送生自荐信
2015/03/24 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书