发送大量数据包而不是1个SSL Python

2024-09-28 23:10:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我建立了一个实验,在这个实验中,我通过SSL隧道传递Modbus流量(这是我用python做的第一件事)。我可以发送和接收数据,但当我发送一个请求时,实际上发送了许多请求(见屏幕截图)

enter image description here

我尝试过许多配置,包括(在客户端和服务器中):

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()

Tags: nofromimport服务器客户端sslforread
1条回答
网友
1楼 · 发布于 2024-09-28 23:10:35

do_something()循环不是必需的,因为deal_with_client()循环也在做同样的事情。我删除了do_something(),并将代码放在deal_with_client()中,这允许我保持连接的打开(见下文)

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)

相关问题 更多 >