【问题标题】:Python socket.recv hangingPython socket.recv 挂起
【发布时间】:2019-07-01 22:08:05
【问题描述】:

我正在尝试从 PLC (AutomationDirect P2000) 检索数据。我已经使用他们的软件程序将 PLC 设置为服务器(我也可以通过以太网使用他们的软件连接到它,并使用 Wireshark 查看它实际上大约每 200 毫秒向我的机器发送 UDP 数据包)。我正在尝试设置一个非常简单的 Python 脚本来检索所述数据,而无需对其进行编码或对其进行任何操作,但我的程序挂在 socket.recv() 上。每当我尝试运行它时,都会打印“Got here”,但不会打印“Now here”。从我读到的事实来看,它挂起意味着没有数据可以接收,但根据我对在 Wireshark 上看到的内容的(有限)理解,情况并非如此。我对这一切都很陌生,如果有任何帮助,我将不胜感激。

我尝试过使用 socket.recvfrom(),它产生了相同的结果。我也尝试过使用 socket.bind() 而不是 socket.connect() 但我得到一个“请求的地址在其上下文中无效”异常。此外,我尝试过使用各种 IP 和端口。例如,我尝试使用 IP = '' 而不是实际 IP,并且尝试使用 Wireshark 的源/目标信息作为我尝试绑定或连接的信息,但到目前为止没有任何效果。

import socket

IP = '192.168.3.1'
PORT = 9999
BUFFER_SIZE = 4096

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect((IP, PORT))

while True:
    print("Got here")
    data = s.recv(BUFFER_SIZE)
    print("Now here")
    print(f"Received {data}")

我希望以字节格式打印出数据包,但程序却挂起。如果我尝试使用 socket.bind() 而不是 socket.connect() 我会收到一条错误消息,内容为“...第 8 行,在 s.bind((IP, PORT))

OSError: [WinError 10049] 请求的地址在其上下文中无效”

【问题讨论】:

标签: python networking plc


【解决方案1】:

你不能像这样使用bind,因为IP地址不属于你的PC。

当您connect 到服务器时,它(服务器)不发送任何内容,但您尝试从服务器获取数据,因此套接字等待直到它获取数据,然后才会继续执行(这称为阻塞函数,因为它会阻塞执行直到完成)。

【讨论】:

  • 感谢您的回复。是的,我使用非阻塞套接字对其进行了测试,但它引发了错误(可能是因为没有数据)。如果是这种情况并且没有数据,为什么我会看到来自 PLC 的 IP 的数据通过 Wireshark 传输到我机器的 IP?
  • 我能想到的唯一另一件事是防火墙阻止数据到套接字
【解决方案2】:

问题在于我如何将 PLC 设置为服务器。我在端口 9999 上看到的 UDP 数据并不是我认为的通信,而只是 PLC 和网络之间通过其专有程序进行的固有通信。对于任何好奇的人,我使用的是来自 AutomationDirect 的 P2000 PLC,最初我按照他们的一个视频将其设置为 EtherNet/IP 适配器,但我必须使用“通信”部分中提供的基于以太网的自定义协议功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    相关资源
    最近更新 更多