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

一个简单的UDP服务端与客户端

服务端: 

 1 from socket import *
 2 #创建套接字
 3 udp_server = socket(AF_INET,SOCK_DGRAM)
 4
 5 msg_server = ("",8877)
 6 #绑定ip地址和端口
 7 udp_server.bind(msg_server)
 8
 9 while True:
10     #接受消息,注意此处用的是   recvfrom()
11     msg_client = udp_server.recvfrom(1024)
12
13     print("新客户端已连接--->>>")
14
15     if len(msg_client) != 0:
16         #msg_client中有两个值,第一个表示收到的消息的内容,第二个表示客户端的IP地址和端口的信息
17         print("%s:%s" % (msg_client[1], msg_client[0].decode("utf-8")))
18     else:
19         break
20
21 udp_server.close()

客户端:

from socket import *

sock = socket(AF_INET,SOCK_DGRAM)

addr_msg = ("192.168.1.104",8877)
#连接服务端
sock.connect(addr_msg)

while True:
    msg_send = input("请输入要发送的信息:")
    if msg_send ==‘q‘:
        break
    #注意此处用的是sendto()     其中第一个参数表示要发送的消息的内容,第二个参数表示服务端的IP地址和端口的元组
    sock.sendto(msg_send.encode("utf-8"),addr_msg)

sock.close()

基于UDP的tftp文件传输

客户端:

 1 from socket import *
 2 import struct
 3 import os
 4
 5 def main():
 6     file_name = input("请输入要下载的文件名:")
 7     #建立一个UDP的套接字
 8     udpsocket = socket(AF_INET,SOCK_DGRAM)
 9     #创建一个tftp的下载请求  H表示第一个参数占用两个字节,d表示对应的参数为bite类型
10     #  %ds 表示文件名占用的字符个数,如后面的octet占用了5个字符,所以写成5s
11     #  octet是tftp传输的一种模式,它决定了传输数据的格式,还有其他的几种tftp传输的模式
12     #构造包使用的是struck中的pack   ,其中的 H 表示使参数占用两个字节
13     request_header = struct.pack("!H%dsb5sb"%len(file_name),1,file_name.encode("utf-8"),0,b"octet",0)
14
15     server_msg = ("192.168.1.104",69)
16     #发送一个下载文件的请求
17     udpsocket.sendto(request_header,server_msg)
18
19     f = open(file_name,"w")
20
21     #  num表示的是数据块的编号,这里使得其初始值为0
22     num = 0
23     #此处建立一个标记,以确认传输过程中没发生错误
24     mask = True
25
26     while True:
27         # 接收服务端发来的数据包
28         response_data = udpsocket.recvfrom(1024)
29         recv_data, server_info  = response_data
30
31         # 此处用struct中的unpack来解包  H 表示数据占用两个字节长度
32         # 这里的前两个字节中存储的是操作码
33         operation_num = struct.unpack("!H",recv_data[:2])
34         # 这里的第三个和第四个字节中存储的是数据块的编号
35         package_num = struct.unpack("!H",recv_data[2:4])
36
37         # 操作码为3时表示接收到的信息是服务端收到响应而发给客户端的数据包
38         if operation_num[0] == 3:
39             #这一次收到的值应该是在上一次收到的值的基础上加上一后的结果
40             num += 1
41             #此处表示一旦num的值超过了它2个字节所表示的值的范围,则让它从0开始再来重复一遍(主要是因为操作码只能占2个字节)
42             if num == 65535:
43                 num = 0
44             # 进行块编号的确认
45             if num == package_num[0]:  #此处取下标是因为此时的package_num表示的是一个元组,而块编号是元组中的第一个数据
46                 # 将收到的具体数据写入到文件中
47                 f.write(recv_data[4:])
48                 #块编号的确认每次都要在之前的值上加1
49                 num = package_num[0]
50             #构造一个响应包  操作码为4   发送的数据就是加上1后的块编号
51             ack_data = struct.pack("!HH",4,package_num[0])
52             #发送响应包
53             udpsocket.sendto(ack_data, server_info)
54
55         elif operation_num[0] == 5:
56             print("Error!")
57             #若发生错误信息,则将标记的值改成False , 以便后续操作删除这个文件
58             mask = False
59
60         # 一个数据包的最大长度为 4+512 = 516 位,如果数据包小于这个数值,则表明这已经是最后一次的数据传输了
61         if len(recv_data) < 516:
62             print("Cmplete!")
63             break
64     # mask标记的值为True则表示文件传输的过程中没有发生错误,就将本地接收到的文件关闭保存
65     if mask == True:
66         f.close()
67
68     else:
69         # mask标记的值为False则表示文件传输的过程中出现了错误信息,则将已经接收到的文件删除
70         os.remove(file_name)
71
72 if __name__ == "__main__":
73     main()

关于TFTP协议

TFTP协议是一种基于UDP的小型文件传输协议,它不具备FTP的许多功能

TFTP的端口号为69

一个数据包在接受的过程中最大长度为512+2+2=516字节,所以当它的长度小于516字节时便可以判断出这是最后一次的数据传输

上面构造数据包时使用的H的意思是,让它所代表的参数占用两个字节的长度,从而使数据包符合TFTP协议的要求

原文地址:https://www.cnblogs.com/hgzero/p/8965079.html

时间: 2024-11-08 19:52:54

Tftp文件传输服务器(基于UDP协议)的相关文章

Java中基于UDP协议的的网络编程(基础篇)

---恢复内容开始--- 一:什么是网络编程? 通俗的来说, 网络编程就是编写程序,让联网的两个或多个设备(例如计算机)之间进行数据传输.Java语言也支持网络编程,JDK提供的 java.net包提供了很多于网络编程相关的类,来支持网络编程方面的学习. 二:java网络编程所使用的协议? 有了计算机网络的基础,我们不难理解,在java中,网络编程是基于网络传输协议的. java网络编程,可以是基于TCP协议的,也可以基于UDP协议的.那么首先我们得知道tcp协议和udp两种协议的区别. 区别:

tsunami:一种基于UDP协议的快速传输

一. 需求 最近在做数据库迁移,经常需要打包实例传输,传统scp感觉很慢. 二. 软件信息 1. 软件主页:http://tsunami-udp.sf.net/ 2. 软件安装:直接源码make && make install 三. 简单使用 以下介绍简明步骤: 在源机子开启tsunami进程:tsunamid * 在目标机子 connect ip  &&  get 四. 测试 在几台待迁移服务器上(机子比较老)传输时发现在70Mb/s左右 五. 使用经验 如果做tar包,

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

UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较) ------------------------------------------------------------------------------------------------------------------------------------- 一.UDP协议:OSI七层协议中的传输协议的一种(另外一种tcp协议),他们都是一种端口协议 与TCP协

STM32物联网之TFTP文件传输

感言:专注物联网应用开发,分享物联网技术经验. 软件平台:IAR6.5 TCP/IP协议栈:LWIP1.4.1 硬件平台:STM32F103C8T6有线通信板(点击这里可以购买) 1.TCP/IP协议栈LWIP 1.1.LWIP认识 LWIP是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈,是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行.LWIP提供三种API,分别是RAW API.LWIP API .BSD API.其

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

基于UDP协议的网络程序

下图是基于UDP协议的客户端/服务器程序的一般流程: 图1.1 UDP协议通信流程 UDP套接口是无连接的.不可靠的数据报协议: 既然他不可靠为什么还要用呢?其一:当应用程序使用广播或多播时只能使用UDP协议:其二:由于他是无连接的,所以速度快.因为UDP套接口是无连接的,如果一方的数据报丢失,那另一方将无限等待,解决办法是设置一个超时. 建立UDP套接口时socket函数的第二个参数应该是SOCK_DGRAM,说明是建立一个UDP套接口:由于UDP是无连接的,所以服务器端并不需要listen或

FTP文件传输服务器(详解)

  FTP文件传输服务器 一实验目标 安装配置VSFTP 实战匿名访问VSFTP 实战用户名密码方式访问VSFTP 实战ftp虚拟帐号方式访问VSFTP   二实验环境 FTP服务端xuegod63.cn   IP192.168.1.63 FTP客户端xuegod64.cn   IP192.168.1.64   三FTP服务概述     FTP服务器File Transfer Protocol Server是在互联网上提供文件存储和访问服务的计算机它们依照FTP协议提供服务.VSFTP是一个基于

Android基础入门教程——7.6.4 基于UDP协议的Socket通信

Android基础入门教程--7.6.4 基于UDP协议的Socket通信 标签(空格分隔): Android基础入门教程 本节引言: 本节给大家带来Socket的最后一节:基于UDP协议的Socket通信,在第一节中我们已经详细地 比较了两者的区别,TCP和UDP最大的区别在于是否需要客户端与服务端建立连接后才能进行 数据传输,如果你学了前两节TCP的,传输前先开服务端,accept,等客户端接入,然后获得 客户端socket然后进行IO操作,而UDP则不用,UDP以数据报作为数据的传输载体,

Linux内核--网络栈实现分析(五)--传输层之UDP协议(上)

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明出处http://blog.csdn.net/yming0221/article/details/7532512 更多请看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 这里看看数据包从IP层是如何