Ruby IO直接获取一个数据包
我有一个协议,在TCP上工作,它没有行结束符号。相反,应该通过计时来定义协议的结束和开始 因此,Ruby IO直接获取一个数据包,ruby,tcp,timer,io,Ruby,Tcp,Timer,Io,我有一个协议,在TCP上工作,它没有行结束符号。相反,应该通过计时来定义协议的结束和开始 因此,IO#gets和IO#readline不起作用,因为它在数据包的末尾不是\n 是否可以定义数据包的结尾?例如,如果某段时间内不是新数据,这就是数据包结束 UPD: 我找到了这样的解决方案,不知道性能如何,但它是有效的: class IO include Timeout #time - time in seconds to wait from last byte to understand p
IO#gets
和IO#readline
不起作用,因为它在数据包的末尾不是\n
是否可以定义数据包的结尾?例如,如果某段时间内不是新数据,这就是数据包结束
UPD:
我找到了这样的解决方案,不知道性能如何,但它是有效的:
class IO
include Timeout
#time - time in seconds to wait from last byte to understand packet end
def gett(time)
raw = getc
loop {
begin
timeout(time){raw << getc}
rescue Timeout::Error
break
end
}
raw
end
end
类IO
包括超时
#time—从最后一个字节到理解数据包结束的等待时间(秒)
def gett(时间)
原始=getc
环路{
开始
超时(时间){raw您需要使套接字非阻塞,然后使用非阻塞读取。如果没有可用的数据,这些将立即返回,从而允许您执行基于超时的操作。Ruby具有允许在操作花费的时间大于设置的时间时引发异常的功能。可能我应该使用此功能?这可能会起作用,但我读过很多关于这方面的不好的东西关于性能的模块。应该有一个正确的方法来使用IO或套接字方法。不幸的是,我不太熟悉Ruby的套接字。