尝试使用 Ruby 向 ctrader 服务器发送 FIX api 消息但未收到任何响应

Trying to send a FIX api message to ctrader server using Ruby but receiving no response

正在尝试查看是否可以从 ctrader 服务器获得响应。
没有任何回应,似乎挂在“s.recv(1024)”。所以不确定这里可能出了什么问题。
我在套接字和网络编码方面经验有限。
我检查了我的登录凭据,一切似乎都正常。
注意:我知道有许多 FIX 引擎可用于此目的,但我想 自己试试这个。
ctrader FIX guides

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.close   

套接字默认阻塞读取。当您调用 recv 时,如果没有可用数据,该调用将被阻止。

如果您的 recv 调用没有返回任何内容,则表明服务器根本没有向您发送任何回复;呼叫正在等待传入数据。

如果您改用 read,则调用将阻塞,直到收到 所有 请求的数据。

因此调用 recv(1024) 将阻塞,直到有 1 个或更多字节可用。
调用 read(1024) 将阻塞,直到收到所有 1024 个字节。

请注意 you cannot rely on a single recv call to return a full message,即使发件人已将您需要的一切都发送给您。构建完整消息可能需要多次 recv 调用。

另请注意,FIX 协议在每条消息的开头给出了消息长度。因此,在您获得足够的数据以查看消息长度后,您可以调用 read 以确保您获得其余部分。

如果您不希望您的 recvread 调用在没有数据(或不完整的数据)可用时阻塞,那么您需要使用 non-blocking IO 代替您的读。这是一个复杂的主题,您需要对其进行研究,但通常在您不想阻止并需要阅读任意长度的消息时使用。您可以 look here 获取一些提示。

另一种选择是使用 EventMachine 之类的东西,这样可以更轻松地处理这种情况下的套接字,而不必担心代码会阻塞。