我为一个简单的Ruby TFTP服务器编写了以下代码。它工作得很好,因为它侦听端口69,我的TFTP客户端连接到它,并且我能够将数据包写入test.txt,但我希望能够通过TFTP将文件从我的客户端发送到/temp目录,而不仅仅是写入数据包。
提前感谢您的帮助!
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发布于 2011-05-21 01:21:53
您可以使用ruby的Tempfile类,而不是写入/temp/test.txt
因此,在您的示例中:
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
发布于 2011-05-22 12:19:24
您不会那么容易获得它,tftp协议相对简单,但put/get不是无状态的,或者至少如果文件不能放在一个包中,那就像512,但一些扩展允许更大的包
网络上的文件被拆分,您将得到一系列包,每个包都有一个序列号,因此另一端可以针对特定包发送错误
你应该看看维基百科的页面:
http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol
这是我在2005年写的示例代码,但id做的是镜面反射的事情(它发送一个文件)它是python,但与ruby :D很相似
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
https://stackoverflow.com/questions/6038283
复制相似问题