• 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实现简单tftp(基于udp)的更多相关文章

  1. Python中的端口协议之基于UDP协议的通信传输

    UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较)        3.利用socketserver模块实现udp传输协议的并 ...

  2. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  3. UNIX网络编程——分析一帧基于UDP的TFTP协议帧

    下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...

  4. python 全栈开发,Day34(基于UDP协议的socket)

    昨日内容回顾 网络的基础概念arp协议 :通过ip地址找到mac地址五层模型 : 应用层 传输层 网络层 数据链路层 物理层tcp协议 : 可靠的 面向连接 全双工 三次握手 四次挥手udp协议 : ...

  5. 分析一帧基于UDP的TFTP协议帧

    下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...

  6. Tftp文件传输服务器(基于UDP协议)

    一个简单的UDP服务端与客户端 服务端: from socket import * #创建套接字 udp_server = socket(AF_INET,SOCK_DGRAM) msg_server ...

  7. 基于udp简单聊天的系统

    老师博客:http://www.cnblogs.com/Eva-J/articles/8244551.html#_label4 基于udp的简单的聊天代码 说明:这段代码,显示有client向serv ...

  8. Websocket - Websocket原理(握手、解密、加密)、基于Python实现简单示例

    一.Websocket原理(握手.解密.加密) WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实 ...

  9. linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)

    单客户端和服务端的通信(基于UDP)   代码 服务端代码socket3.c #include<sys/types.h> #include<sys/socket.h> #inc ...

随机推荐

  1. [NOI2006]神奇口袋

    题面在这里 题意 开始时袋中有\(t\)种小球,第\(i\)种小球有\(t_i\)个,之后每次等概率取出一个球,第\(i\)次取球时观察这个球的颜色\(c_i\)放回并向袋中加入\(d\)个颜色为\( ...

  2. Vue-小demo、小效果 合集(更新中...)

    (腾讯课堂学习小demo:https://ke.qq.com/course/256052) 一.简单的指令应用 --打击灭火器 图片素材点击腾讯课堂的链接获取       html: <!DOC ...

  3. angular 按下回车键触发事件

    angularJs  按下回车键触发事件这个功能很简单,但是今天的却让我掉坑很久.... 由于我的页面上有两个不同方法都传$event事件,如search($event)和create($event) ...

  4. Oracle定时任务小案例

    需求简述 一个数据表中包含此数据的录入时间,此数据的初始状态是有效,五天后系统自动置该数据的状态为无效. 方案 写一个存储过程,用于更新字段(改状态): 写一个job,用于定时执行存储过程: 方案逻辑 ...

  5. 绘制静态地图API-高德地图

    1 高德静态地图链接 http://lbs.amap.com/api/webservice/guide/api/staticmaps 2 /** * User: [一秋] * Date: 2017/9 ...

  6. ImageButton 图像按钮

    ImageButton 类主要成员有: setINMask 属性: 数据类型:Bool, {get ,set}. 用于确定是否接受用户输入操作,它的值是传给一个指针.这个指针指向的当前图像按钮所在的窗 ...

  7. python文件基本操作(读,写,追加)

    一:只读(r) f=('d:\ python的联系文件'')   绝对路径和相对路径(绝对路径:能找到文件开始到结束路径,真实存在的路径,相对路径:在绝对路径一致的情况下新建一个文件) f=open( ...

  8. DIY福音:Firefox菜单及右键菜单ID大全

    每一个折腾Firefox的Diyer都是上辈子折翼的天使,致自己! 打磨Firefox界面的时候最多的就隐藏一些平常根本用不上的一些菜单,常规的做法就是安装DOM Inspector扩展右键查找大法寻 ...

  9. Redis分布式锁的正确实现方式

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  10. 【Unity与23种设计模式】抽象工厂模式(Abstract Factory)

    GoF中定义: "提供一个能够建立整个类群组或有关联的对象,而不必指明它们的具体类." 意思就是 根据不同的执行环境产生不同的抽象类子类 抽象工厂模式经常在面试中会涉及到 下面的例 ...