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 with statement 进行文件操作指南
Aug 22 Python
python基础教程之缩进介绍
Aug 29 Python
Linux下Python获取IP地址的代码
Nov 30 Python
分析Python的Django框架的运行方式及处理流程
Apr 08 Python
Python实现的简单dns查询功能示例
May 24 Python
基于python的Tkinter编写登陆注册界面
Jun 30 Python
python进程管理工具supervisor的安装与使用教程
Sep 05 Python
TensorFlow:将ckpt文件固化成pb文件教程
Feb 11 Python
解决c++调用python中文乱码问题
Jul 29 Python
详解python实现可视化的MD5、sha256哈希加密小工具
Sep 14 Python
Python实现随机爬山算法
Jan 29 Python
python numpy中multiply与*及matul 的区别说明
May 26 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 利用AJAX获取网页并输出的实现代码(Zjmainstay)
2012/08/31 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
2015/03/19 PHP
PHP递归实现快速排序的方法示例
2017/12/18 PHP
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
jQuery的css()方法用法实例
2014/12/24 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
JS实现网页标题随机显示名人名言的方法
2015/11/03 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
老生常谈javascript中逻辑运算符&amp;&amp;和||的返回值问题
2017/04/13 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
2019/11/20 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
js验证账户名是否重复
2020/05/26 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
Python实现字典的key和values的交换
2015/08/04 Python
Python编程中对文件和存储器的读写示例
2016/01/25 Python
人工智能最火编程语言 Python大战Java!
2017/11/13 Python
pip 安装库比较慢的解决方法(国内镜像)
2019/10/06 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
大学生党课思想汇报
2013/12/29 职场文书
八年级语文教学反思
2014/02/11 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
创建青年文明号材料
2014/05/09 职场文书
教师节活动总结
2014/08/29 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
《全神贯注》教学反思
2016/02/22 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python