Tratando de ver si puedo obtener una respuesta del servidor ctrader.
No obtiene respuesta y parece colgarse en "s.recv(1024)". Así que no estoy seguro de qué podría estar saliendo mal aquí.
Tengo experiencia limitada con sockets y codificación de red.
He comprobado mis credenciales de inicio de sesión y todo parece estar bien.
Nota: conozco muchos motores FIX que están disponibles para este propósito, pero quería probar esto por mi cuenta.
guías ctrader FIX
require 'socket' hostname = "h51.p.ctrader.com" port = 5201 #constructing a fix message to see what ctrader server returns #8=FIX.4.4|9=123|35=A|49=demo.ctrader.*******|56=cServer|57=QUOTE|50=QUOTE|34=1|52=20220127-16:49:31|98=0|108=30|553=********|554=*******|10=155| fix_message = "8=FIX.4.4|9=#{bodylengthsum}|" + bodylength + "10=#{checksumcalc}|" s = TCPSocket.new(hostname, port) s.send(fix_message.force_encoding("ASCII"),0) print fix_message puts s.recv(1024) s.closeLos sockets se bloquean por defecto en la lectura. Cuando llame a recv , esa llamada se bloqueará si no hay datos disponibles.
El hecho de que su llamada recv no devuelva nada, sería una indicación de que el servidor no le envió ninguna respuesta; la llamada se está bloqueando esperando datos entrantes.
Si prefiere read , la llamada se bloqueará hasta que se hayan recibido todos los datos solicitados.
Entonces, llamar a recv(1024) se bloqueará hasta que haya 1 o más bytes disponibles.
La llamada a read(1024) se bloqueará hasta que se hayan recibido los 1024 bytes.
Tenga en cuenta que no puede confiar en una sola llamada de recv para devolver un mensaje completo , incluso si el remitente le envió todo lo que necesita. Es posible que se requieran múltiples llamadas de recv para construir el mensaje completo.
También tenga en cuenta que el protocolo FIX proporciona la longitud del mensaje al comienzo de cada mensaje. Entonces, después de obtener suficientes datos para ver la duración del mensaje, puede llamar a read para asegurarse de obtener el resto.
Si no desea que sus llamadas recv o read se bloqueen cuando no hay datos (o datos incompletos) disponibles, entonces necesita usar IO sin bloqueo para sus lecturas. Este es un tema complejo, que necesita investigar, pero a menudo se usa cuando no desea bloquear y necesita leer mensajes de longitud arbitraria. Puedes buscar aquí algunos consejos.
Otra opción sería usar algo como EventMachine en su lugar, lo que facilita el manejo de sockets en situaciones como esta, sin tener que preocuparse por bloquear su código.