Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby IO直接获取一个数据包_Ruby_Tcp_Timer_Io - Fatal编程技术网

Ruby IO直接获取一个数据包

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

我有一个协议,在TCP上工作,它没有行结束符号。相反,应该通过计时来定义协议的结束和开始

因此,
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的套接字。