Frage

Gibt es eine Möglichkeit, um herauszufinden, wie viele Bytes von Daten auf einem TCPSocket in Ruby verfügbar ist? D. h wie viele Bytes kann, ohne blockieren fertig sein?

War es hilfreich?

Lösung

Die Standardbibliothek io/wait könnte nützlich hier sein. Requring es gibt Strom-basierte I / O (Steckdosen und Leitungen) einige neue Methoden, unter denen ready? ist. Nach der Dokumentation , bereit? kehrt nicht-Null, wenn Bytes zur Verfügung stehen, ohne zu blockieren. Es passiert einfach so, dass der Nicht-Null-Wert, den es ihm die Anzahl der Bytes zurück, die verfügbar sind in MRI .

Hier ist ein Beispiel, das einen dummen kleine Socket-Server erstellt, und eine Verbindung zu ihm mit einem Kunden. Der Server sendet nur „foo“ und schließt dann die Verbindung. Der Client wartet ein wenig den Server Zeit zu geben, zu senden und dann druckt, wie viele Bytes verfügbar sind für das Lesen. Die interessanten Dinge für Sie im Client:

require 'socket'
require 'io/wait'

# Server

server_socket = TCPServer.new('localhost', 0)
port = server_socket.addr[1]
Thread.new do
  session = server_socket.accept
  sleep 0.5
  session.puts "foo"
  session.close
end

# Client

client_socket = TCPSocket.new('localhost', port)
puts client_socket.ready?    # => nil
sleep 1
puts client_socket.ready?    # => 4

Verwenden Sie den Server-Code in etwas Reales nicht. Es ist absichtlich verzögert, um das Beispiel einfach zu halten.

Hinweis: Nach dem Pickaxe Buch, io / wait ist nur verfügbar, wenn "FIONREAD Funktion in ioctl (2)". Was ist in Linux. Ich weiß nicht, über Windows & andere.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top