2010-06-07 7 views
5

Hola, he estado jugando con Sockets en Ruby y encontré algún código de ejemplo que intenté modificar y quebrar. Quiero saber por qué está roto.Socket.recv funciona pero no se obtiene o lee?

Servidor:

require "socket" 
dts = TCPServer.new('127.0.0.1', 20000) 
loop do 
    Thread.start(dts.accept) do |s| 
    print(s, " is accepted\n") 
    s.write(Time.now) 
    print(s, " is gone\n") 
    s.close 
    end 
end 

de cliente que funciona:

require 'socket' 
streamSock = TCPSocket.new("127.0.0.1", 20000) 
streamSock.print("Hello\n") 
str = streamSock.recv(100) 
print str 
streamSock.close 

cliente que se rompe

require 'socket' 
streamSock = TCPSocket.new("127.0.0.1", 20000) 
streamSock.print("Hello\n") 
str=streamSock.read #this line modified 
print str 
streamSock.close 

Sé que el streamSock.print es innecesaria (así como el ser esquema de nombres no ruby) pero no entiendo por qué read no funciona mientras recv, ¿Por qué es esto?

+0

si alguien entendió que en el ejemplo roto tenía una dirección IP diferente. no tenga en cuenta que, me olvidé de cambiarlo al copiar y pegar – Earlz

+0

Eche un vistazo a esta pregunta relacionada: http://stackoverflow.com/questions/1147852/ruby-tcpsocket-write-doesnt-work-but-puts-does –

+0

Ambos tus clientes funcionan bien para mí Estoy en OS X Snow Leopard. – Hongli

Respuesta

0

Una condición de carrera muy sutil. Estás cerrando el lado del servidor de conexión sin esperar a que el cliente complete. Si su cliente termina antes de cerrar, obtendrá la respuesta correcta; si el servidor termina primero, obtendrá Errno :: ECONNRESET. Lo que significa que el cliente perdió la conexión mientras trabajaba.

Una solución simple será esperar un tiempo fijo antes de cerrar el servidor de conexión. El tiempo justo para dejar que el cliente termine.

Cuestiones relacionadas