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多线程学习资料
Dec 19 Python
在Python中处理XML的教程
Apr 29 Python
机器学习10大经典算法详解
Dec 07 Python
基于python list对象中嵌套元组使用sort时的排序方法
Apr 18 Python
Python脚本修改阿里云的访问控制列表的方法
Mar 08 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
Mar 22 Python
Django ORM 查询管理器源码解析
Aug 05 Python
Python实现直方图均衡基本原理解析
Aug 08 Python
python实现机器人卡牌
Oct 06 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
Feb 10 Python
python使用matplotlib:subplot绘制多个子图的示例
Sep 24 Python
Python 实现二叉查找树的示例代码
Dec 21 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程序中的常见漏洞进行攻击(上)
2006/10/09 PHP
php 调试利器debug_print_backtrace()
2012/07/23 PHP
zend framework文件上传功能实例代码
2013/12/25 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
JQueryiframe页面操作父页面中的元素与方法(实例讲解)
2013/11/19 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
原生JS实现的轮播图功能详解
2018/08/06 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
python简单猜数游戏实例
2015/07/09 Python
Python探索之pLSA实现代码
2017/10/25 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
Python 日期与时间转换的方法
2020/08/01 Python
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
环境科学专业个人求职信
2013/09/26 职场文书
经典演讲稿范文
2013/12/30 职场文书
白酒市场开发计划书
2014/01/09 职场文书
辩护词格式
2015/05/22 职场文书
收入证明范本
2015/06/12 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python