簡體   English   中英

Python socket.recv掛起

[英]Python socket.recv hanging

我正在嘗試從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]請求的地址在其上下文中無效”

您不能像這樣使用bind ,因為IP地址不屬於您的PC。

當您connect到服務器時,它(服務器)不發送任何信息,但是您嘗試從服務器獲取數據,因此套接字等待直到它獲取數據,然后套接字才會繼續執行(這稱為a阻止功能,因為它會阻止執行直到完成)。

問題在於如何將PLC設置為服務器。 我在端口9999上看到的UDP數據不是我想的通訊,而是PLC和網絡之間通過其專有程序進行的固有通訊。 對於任何好奇的人,我使用的是AutomationDirect的P2000 PLC,最初我按照他們的視頻之一將其設置為EtherNet / IP適配器,但是我必須使用“通信”部分中提供的“以太網自定義協議”功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM