你如何使用带 stunnel 的 Python 套接字?
How do you use a Python socket with stunnel?
我正在尝试通过 stunnel 实现 TCP 套接字,但不确定如何捕获服务器响应。我的stunnel配置文件是这样的:
[Coinbase]
client = yes
accept = 127.0.0.1:4197
connect = fix.gdax.com:4198
verify = 4
CAfile = /etc/fix.gdax.com.pem
我的 Python 代码是:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 4197))
msg = b'GET / HTTP/1.1\nHost: www.google.com\n\n' # ping google as a means of testing
s.send(msg)
print(s.recv(1024))
无论我通过套接字发送什么消息(包括位于 fix.gdax.com 的服务器所期望的消息),该打印语句的结果始终只是一个字节形式的空字符串:
b''
stunnel日志如下:
2017.11.02 20:49:58 LOG5[7]: Service [Coinbase] accepted connection from
127.0.0.1:65205
2017.11.02 20:49:58 LOG5[7]: s_connect: connected 52.86.60.82:4198
2017.11.02 20:49:58 LOG5[7]: Service [Coinbase] connected remote server from
192.168.0.14:65206
2017.11.02 20:49:58 LOG5[7]: Certificate accepted at depth=0: C=US,
ST=California, L=San Francisco, O="Coinbase, Inc.", CN=*.gdax.com
2017.11.02 20:50:06 LOG3[7]: readsocket: Connection reset by peer
(WSAECONNRESET) (10054)
2017.11.02 20:50:06 LOG5[7]: Connection reset: 37 byte(s) sent to TLS, 0
byte(s) sent to socket
我对此的解释是消息发送正常并且证书有效等,但我不知道如何接收服务器发回的数据...非常感谢任何帮助!我对 TCP 和 SSL 很陌生,如果有任何术语错误,我深表歉意。
如果远程方关闭连接,socket.recv() 将 return 一个空字符串。
您似乎正在尝试连接到 FIX 网关。如果 FIX 服务器没有收到正确的 LOGON 消息,它会在没有任何响应的情况下关闭连接,这是一种非常标准的行为。您发送的第一条消息必须是登录 - 例如:
8=FIX.4.4|9=74|35=A|34=1|49=SenderCompIdGoesHere|52=20171103-01:15:00.000|56=TargetCompIdGoesHere|98=0|108=30|10=144
其中“|”是 SOH(ASCII 代码 01)字符。如果您不发送此消息,或者其中有任何错误(例如 CompID 或 FIX 版本、时间戳等),服务器通常只会关闭连接(这让您需要猜测才能弄清楚您发送的是什么)发送错误)。
此外,您只能发送 FIX 协议消息,您试图到达 google 的 "GET ..." 字符串是 HTTP 协议的一部分 - 它不会被 FIX 服务器识别。
我正在尝试通过 stunnel 实现 TCP 套接字,但不确定如何捕获服务器响应。我的stunnel配置文件是这样的:
[Coinbase]
client = yes
accept = 127.0.0.1:4197
connect = fix.gdax.com:4198
verify = 4
CAfile = /etc/fix.gdax.com.pem
我的 Python 代码是:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 4197))
msg = b'GET / HTTP/1.1\nHost: www.google.com\n\n' # ping google as a means of testing
s.send(msg)
print(s.recv(1024))
无论我通过套接字发送什么消息(包括位于 fix.gdax.com 的服务器所期望的消息),该打印语句的结果始终只是一个字节形式的空字符串:
b''
stunnel日志如下:
2017.11.02 20:49:58 LOG5[7]: Service [Coinbase] accepted connection from
127.0.0.1:65205
2017.11.02 20:49:58 LOG5[7]: s_connect: connected 52.86.60.82:4198
2017.11.02 20:49:58 LOG5[7]: Service [Coinbase] connected remote server from
192.168.0.14:65206
2017.11.02 20:49:58 LOG5[7]: Certificate accepted at depth=0: C=US,
ST=California, L=San Francisco, O="Coinbase, Inc.", CN=*.gdax.com
2017.11.02 20:50:06 LOG3[7]: readsocket: Connection reset by peer
(WSAECONNRESET) (10054)
2017.11.02 20:50:06 LOG5[7]: Connection reset: 37 byte(s) sent to TLS, 0
byte(s) sent to socket
我对此的解释是消息发送正常并且证书有效等,但我不知道如何接收服务器发回的数据...非常感谢任何帮助!我对 TCP 和 SSL 很陌生,如果有任何术语错误,我深表歉意。
socket.recv() 将 return 一个空字符串。
您似乎正在尝试连接到 FIX 网关。如果 FIX 服务器没有收到正确的 LOGON 消息,它会在没有任何响应的情况下关闭连接,这是一种非常标准的行为。您发送的第一条消息必须是登录 - 例如:
8=FIX.4.4|9=74|35=A|34=1|49=SenderCompIdGoesHere|52=20171103-01:15:00.000|56=TargetCompIdGoesHere|98=0|108=30|10=144
其中“|”是 SOH(ASCII 代码 01)字符。如果您不发送此消息,或者其中有任何错误(例如 CompID 或 FIX 版本、时间戳等),服务器通常只会关闭连接(这让您需要猜测才能弄清楚您发送的是什么)发送错误)。
此外,您只能发送 FIX 协议消息,您试图到达 google 的 "GET ..." 字符串是 HTTP 协议的一部分 - 它不会被 FIX 服务器识别。