首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby TFTP服务器

Ruby TFTP服务器
EN

Stack Overflow用户
提问于 2011-05-18 07:23:36
回答 2查看 1.4K关注 0票数 5

我为一个简单的Ruby TFTP服务器编写了以下代码。它工作得很好,因为它侦听端口69,我的TFTP客户端连接到它,并且我能够将数据包写入test.txt,但我希望能够通过TFTP将文件从我的客户端发送到/temp目录,而不仅仅是写入数据包。

提前感谢您的帮助!

代码语言:javascript
复制
require 'socket.so'

class TFTPServer
  def initialize(port)
    @port = port
  end

  def start
    @socket = UDPSocket.new
    @socket.bind('', @port)
    while true
      packet = @socket.recvfrom(1024)
      puts packet

      File.open('/temp/test.txt', 'w') do |p|
            p.puts packet   
        end 
    end
  end
end

server = TFTPServer.new(69)
server.start
EN

回答 2

Stack Overflow用户

发布于 2011-05-21 01:21:53

您可以使用ruby的Tempfile类,而不是写入/temp/test.txt

因此,在您的示例中:

代码语言:javascript
复制
require 'socket.so'
require 'tempfile'

class TFTPServer
  def initialize(port)
   @port = port
  end

  def start
    @socket = UDPSocket.new
    @socket.bind('', @port)
    while true
      packet = @socket.recvfrom(1024)
      puts packet

      Tempfile.new('tftpserver') do |p|
        p.puts process_packet( packet )
      end 
    end
  end
end

server = TFTPServer.new(69)
server.start

这将在您的/tmp目录中创建一个保证唯一的临时文件,其名称基于'tftpserver‘。

编辑:我注意到你想要写到/temp (而不是/tmp)。为此,你可以通过Tempfile.new('tftpserver', '/temp')来指定一个特定的临时目录。

编辑2:对于任何感兴趣的人,有一个库可以做这个https://github.com/spiceworks/net-tftp

票数 7
EN

Stack Overflow用户

发布于 2011-05-22 12:19:24

您不会那么容易获得它,tftp协议相对简单,但put/get不是无状态的,或者至少如果文件不能放在一个包中,那就像512,但一些扩展允许更大的包

网络上的文件被拆分,您将得到一系列包,每个包都有一个序列号,因此另一端可以针对特定包发送错误

你应该看看维基百科的页面:

http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol

这是我在2005年写的示例代码,但id做的是镜面反射的事情(它发送一个文件)它是python,但与ruby :D很相似

代码语言:javascript
复制
def send_file(self, addr, filesend, filesize, blocksize):
    print '[send_file] Sending %s (size: %d - blksize: %d) to %s:%d' % (filesend, filesize, blocksize, addr[0], addr[1])
    fd = open(filesend, 'rb')

    for c in range(1, (filesize / blocksize) + 2):
        hdr = pack('!H', DATA) + pack('!H', c)
        indata = fd.read(blocksize)
        if debug > 5: print '[send_file] [%s] Sending block %d size %d' % (filesend, c, len(indata))
        self.s.sendto(hdr + indata, addr)
        data, addr = self.s.recvfrom(1024)
        res = unpack('!H', data[:2])[0]
        data = data[2:]
        if res != ACK:
            print '[send_file] Transfer aborted: %s' % errors[res]
            break
        if debug > 5:
            print '[send_file] [%s] Received ack for block %d' % (filesend, unpack('>H', data[:2])[0] + 1)
    fd.close()

    ## End Transfer
    pkt = pack('!H', DATA) + pack('>H', c) + NULL
    self.s.sendto(pkt, addr)
    if debug: print '[send_file] File send Done (%d)' % c

你可以在arpa/tftp.h中找到常量(你需要一个unix或者在线搜索)

序列号是一个大端(网络顺序)短!H格式的struct pack ruby在String类中有一些类似python的struct

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6038283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档