发送大量数据包而不是1个SSL Python
我已经做了一个实验,通过SSL隧道传递Modbus通信量(这是我在python中做的第一件事)。我能够发送和接收数据,但当我发送一个请求时,实际上会发送许多请求(参见屏幕截图) 我尝试了许多配置,包括(在客户端和服务器中): 在服务器端:发送大量数据包而不是1个SSL Python,python,scapy,modbus,Python,Scapy,Modbus,我已经做了一个实验,通过SSL隧道传递Modbus通信量(这是我在python中做的第一件事)。我能够发送和接收数据,但当我发送一个请求时,实际上会发送许多请求(参见屏幕截图) 我尝试了许多配置,包括(在客户端和服务器中): 在服务器端: if data==Read\u Coils\u Answer——我认为我没有正确地转换大端号以进行比较,这不起作用 while data:——while循环似乎是防止任何一方因“断管”错误而短停的唯一方法。这就是我用的 我最终计划使用for循环(现在注释掉并
if data==Read\u Coils\u Answer
——我认为我没有正确地转换大端号以进行比较,这不起作用while data:
——while循环似乎是防止任何一方因“断管”错误而短停的唯一方法。这就是我用的
我最终计划使用for
循环(现在注释掉并设置为4)
我的服务器代码:
from ModLib import *
import socket, ssl, sys, pprint
try:
bindsocket = socket.socket()
bindsocket.bind(('', 502))
bindsocket.listen(5)
bindsocket.setblocking(1)
def do_something(connstream, data):
readCoilsReq = str('\x01\x01\x00')
answer = str(ModbusPDU01_Read_Coils_Answer)
while data:
print ("Request Recevied from Client:")
print pprint.pformat(data)
connstream.send(answer)
print ("Answer Sent to Client")
print pprint.pformat(answer)
return False
def deal_with_client(connstream):
data = connstream.recv(64)
while data:
if not do_something(connstream, data):
break
data = connstream.recv(64)
while True:
newsocket, fromaddr = bindsocket.accept()
connstream = ssl.wrap_socket(newsocket,
server_side=True,
certfile="server.crt",
keyfile="server.key",
ssl_version=ssl.PROTOCOL_TLSv1)
try:
deal_with_client(connstream)
finally:
connstream.shutdown(socket.SHUT_RDWR)
connstream.close()
except KeyboardInterrupt:
print ("\nTerminating Session at User Request")
print ("No More Data Will be Sent/Recieved\n")
sys.exit(1)
我的客户端代码:
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\u something()
循环是不必要的,因为deal\u with\u client()
循环也在做同样的事情。我删除了do\u something()
您正在服务器端读取64字节块中的数据,并为每个块调用do\u something()
。因此,您(不一定)会收到多个请求,而是多个块。好吧,您的while data
在do\u something()
中循环可能会导致该问题<代码>数据
在该循环中永远不会更改-因此,您在同一数据块上无限期地循环,造成收到多个请求的印象。另外,您已经在外部函数(deal\u with\u client()
)中从循环中的套接字读取数据。不,只需完全删除循环,您不需要它。好的,您正在break
循环,并在发送一个响应后从deal\u with\u client()
返回,这反过来将关闭套接字=>损坏的管道。您需要以这样一种方式来编写服务器:它可以无限期地读取数据,并且可以处理多个后续请求。但是我不知道ModBus协议,所以很遗憾我不能告诉你如何详细地做到这一点;我刚刚取消了do_something()
,我正在deal_中与客户进行所有处理;似乎正在按预期生产产品。感谢您抽出时间@LukasGraf
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()
from ModLib import *
import socket, ssl, sys, pprint
try:
bindsocket = socket.socket()
bindsocket.bind(('', 502))
bindsocket.listen(5)
bindsocket.setblocking(1)
def deal_with_client(connstream):
data = connstream.recv(1120)
answer = str(ModbusPDU01_Read_Coils_Answer())
while data:
print ("Request Received from Client:")
print pprint.pformat(data)
connstream.send(answer)
print ("Answer Sent to Client")
print pprint.pformat(answer)
data = connstream.recv(1120)
while True:
newsocket, fromaddr = bindsocket.accept()
connstream = ssl.wrap_socket(newsocket,
server_side=True,
certfile="server.crt",
keyfile="server.key",
ssl_version=ssl.PROTOCOL_TLSv1)
try:
deal_with_client(connstream)
finally:
connstream.shutdown(socket.SHUT_RDWR)
connstream.close()
except KeyboardInterrupt:
print ("\nTerminating Session at User Request")
print ("No More Data Will be Sent/Received\n")
sys.exit(1)