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高并发异步服务器核心库forkcore使用方法
Nov 26 Python
python使用xlrd模块读写Excel文件的方法
May 06 Python
Python浅拷贝与深拷贝用法实例
May 09 Python
python编码总结(编码类型、格式、转码)
Jul 01 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
Feb 21 Python
python 把文件中的每一行以数组的元素放入数组中的方法
Apr 29 Python
Django csrf 验证问题的实现
Oct 09 Python
Python从数据库读取大量数据批量写入文件的方法
Dec 10 Python
python多任务之协程的使用详解
Aug 26 Python
Python读写文件模式和文件对象方法实例详解
Sep 17 Python
Python selenium的基本使用方法分析
Dec 21 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
Apr 24 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 清除网页病毒的方法
2008/12/05 PHP
php 错误处理经验分享
2011/10/11 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
CI框架简单邮件发送类实例
2016/05/18 PHP
jquery ajax post提交数据乱码
2013/11/05 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
原生JavaScript生成GUID的实现示例
2014/09/05 Javascript
bootstrap改变按钮加载状态
2014/12/01 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
node.js操作mongodb学习小结
2015/04/25 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
在JavaScript中操作时间之setYear()方法的使用
2015/06/12 Javascript
JavaScript学习笔记之ES6数组方法
2016/03/25 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
用Golang运行JavaScript的实现示例
2019/11/25 Javascript
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
Python3.x中自定义比较函数
2015/04/24 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
2016/05/24 Python
Python选课系统开发程序
2016/09/02 Python
python flask 多对多表查询功能
2017/06/25 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
通过Pandas读取大文件的实例
2018/06/07 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
物业电工岗位职责
2013/11/20 职场文书
环境卫生标语
2014/06/09 职场文书
保护水资源的标语
2014/06/17 职场文书
2015年教师教学工作总结
2015/04/28 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技