你如何使用带有stunnel的Python套接字?

时间:2017-11-02 22:03:26

标签: python sockets ssl tcp 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所期望的那些消息),该print语句的结果总是只是一个字节形式的空字符串:

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如此道歉。

1 个答案:

答案 0 :(得分:1)

如果远程方关闭了连接,

socket.recv()将返回一个空字符串。

您似乎正在尝试连接到FIX网关。如果FIX服务器没有收到正确的LOGON消息,则在没有任何响应的情况下关闭连接是一种非常标准的行为。您发送的第一条消息必须是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)字符。如果你没有发送这条消息,或者你得到任何错误(比如CompIDs或FIX版本,时间戳等),服务器通常只会关闭连接(让你有点猜测 - 弄清楚你是什么发错了。)

此外,您只能发送FIX协议消息,您尝试访问Google的“GET ...”字符串是HTTP协议的一部分 - 它将无法被FIX服务器识别。