Domanda

C'è un modo per scoprire quanti byte di dati sono disponibili su un TCPSocket in Ruby? Cioè il numero di byte può essere pronto senza bloccare?

È stato utile?

Soluzione

Il io/wait libreria standard potrebbe essere utile qui. L'esigenza che dà basato sul flusso di I / O (prese e tubi) alcuni nuovi metodi, tra i quali è ready?. Secondo il documentazione , pronto? rendimenti non-nil se ci sono byte disponibili senza bloccare. Si dà il caso che il valore non-nil esso restituisce il numero di byte che sono disponibili in MRI .

Ecco un esempio che crea un server po 'presa muto, e poi si collega ad esso con un cliente. Il server invia semplicemente "pippo" e poi chiude la connessione. Il client attende un po 'per dare il tempo di server per inviare, e quindi stampa il numero di byte sono avaiable per la lettura. La roba interessante per voi è nel 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

Non utilizzare quel codice del server in qualcosa di reale. E 'volutamente ritardata al fine di mantenere il semplice esempio.

Nota: Secondo il libro Piccone, io / attesa è disponibile solo se "caratteristica FIONREAD a ioctl (2)". Il che è in Linux. Non so su Windows e gli altri.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top