Question

Y at-il un moyen de savoir combien d'octets de données sont disponibles sur un TCPSocket en Ruby? C'est à dire. combien d'octets peut être prêt sans bloquer?

Était-ce utile?

La solution

Le io/wait de bibliothèque standard pourrait être utile ici. Requring donne des E / S de courant (prises et conduites) de nouvelles méthodes, parmi lesquelles ready?. Selon la documentation , prêt? rendements non nulle s'il y a des octets disponibles sans bloquer. Il se trouve que la valeur non nulle, il retourne le nombre d'octets qui sont disponibles en IRM .

Voici un exemple qui crée un petit serveur socket muet, et se connecte alors avec un client. Le serveur envoie juste « foo » et ferme la connexion. Le client attend un peu pour donner le temps de serveur pour envoyer, puis imprime le nombre d'octets sont disponibles pour la lecture. Les choses intéressantes pour vous est dans le 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

Ne pas utiliser ce code serveur en temps réel de quoi que ce soit. Il est délibérément retardé afin de garder le simple exemple.

Note: Selon le livre Pioche, io / attente est disponible uniquement si "fonction FIONREAD dans ioctl (2)". Ce qui est sous Linux. Je ne sais pas à propos de Windows et d'autres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top