gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:05:40 25 4
gpt4 key购买 nike

我已经设置了一个实验,通过 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--我认为我没有正确转换大尾数以进行比较,这不起作用
while data: --while 循环似乎是防止任何一方因“Broken Pipe”错误而停止的唯一方法。这就是我正在使用的。

我最终计划使用 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_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)

关于python - 发送大量数据包而不是 1 个 SSL Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26957608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com