我建立了一个实验,在这个实验中,我通过SSL隧道传递Modbus流量(这是我用python做的第一件事)。我可以发送和接收数据,但当我发送一个请求时,实际上发送了许多请求(见屏幕截图)
我尝试过许多配置,包括(在客户端和服务器中):
send()--no change
sendall() --no change
setblocking(1)
setblocking(0)--doesn't read all the data
在服务器端:if data == Read_Coils_Answer
——我认为我没有正确地转换big-endian以进行比较,这不起作用while data:
——while循环似乎是防止任何一方因“断管”错误而短时间停止的唯一方法。所以这就是我用的。在
我最终计划使用for
循环(现在注释掉并设置为4)。在
我的服务器代码:
^{pr2}$我的客户端代码:
from ModLib import *
from time import sleep
import socket, ssl, pprint
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = ssl.wrap_socket(s,
ca_certs="server.crt",
cert_reqs=ssl.CERT_REQUIRED)
ssl_sock.connect(('localhost', 502))
ssl_sock.setblocking(1)
readCoils = ModbusPDU01_Read_Coils()
#for i in range(4):
sleep(2)
ssl_sock.sendall(str(readCoils))
print ("Request for Read Coils Sent")
#start receive
data = ssl_sock.recv(64)
print ("Response from Server:")
print pprint.pformat(data)
if False: #from the python docs
ssl_sock.write("""GET / HTTP/1.0\r
Host: www.verisign.com\n\n""")
data = ssl_sock.read()
ssl_sock.close()
do_something()
循环不是必需的,因为deal_with_client()
循环也在做同样的事情。我删除了do_something()
,并将代码放在deal_with_client()
中,这允许我保持连接的打开(见下文)相关问题 更多 >
编程相关推荐