Ale*_*lex 6 python windows powershell
在 Windows 10 上,我想从 UDP 端口 9001 读取数据。我创建了以下脚本,该脚本不提供任何输出(python 3.10.9):
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("", 9001))
while True:
data, addr = sock.recv(1024)
print(f"received message: {data.decode()} from {addr}")
Run Code Online (Sandbox Code Playgroud)
我检查了设备正在使用wireshark在端口9001上发送UDP数据。但上面的代码只是在 powershell 上“运行”,没有任何输出(并且没有任何错误)。
任何想法如何解决这一问题?
我发现这个页面有一个powershell脚本,该脚本应该监听 UDP 端口。因此,我尝试了此操作并创建了一个文件Start-UDPServer.ps1,其内容如该页面中所述,如下所示:
function Start-UDPServer {
[CmdletBinding()]
param (
# Parameter help description
[Parameter(Mandatory = $false)]
$Port = 10000
)
# Create a endpoint that represents the remote host from which the data was sent.
$RemoteComputer = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Any, 0)
Write-Host "Server is waiting for connections - $($UdpObject.Client.LocalEndPoint)"
Write-Host "Stop with CRTL + C"
# Loop de Loop
do {
# Create a UDP listender on Port $Port
$UdpObject = New-Object System.Net.Sockets.UdpClient($Port)
# Return the UDP datagram that was sent by the remote host
$ReceiveBytes = $UdpObject.Receive([ref]$RemoteComputer)
# Close UDP connection
$UdpObject.Close()
# Convert received UDP datagram from Bytes to String
$ASCIIEncoding = New-Object System.Text.ASCIIEncoding
[string]$ReturnString = $ASCIIEncoding.GetString($ReceiveBytes)
# Output information
[PSCustomObject]@{
LocalDateTime = $(Get-Date -UFormat "%Y-%m-%d %T")
SourceIP = $RemoteComputer.address.ToString()
SourcePort = $RemoteComputer.Port.ToString()
Payload = $ReturnString
}
} while (1)
}
Run Code Online (Sandbox Code Playgroud)
并在Powershell终端(以管理员身份)中启动它:
.\Start-UDPServer.ps1 -Port 9001
Run Code Online (Sandbox Code Playgroud)
它立即返回到 Powershell,没有任何输出(或错误消息)。也许窗户坏了?
如果有一个最终监听UDP端口9001的解决方案,我仍然强烈推荐Python解决方案!
据我所知,如果您发布的 Python 代码接收到任何数据,则在运行时应该会给出错误,因此这表明数据根本没有到达进程。
我建议检查该端口的 Windows 防火墙设置以及您可能正在运行的任何其他基于主机的防火墙。
而且,该recv()方法不返回元组。recvfrom()确实如此,所以下面的代码可以工作:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("", 9001))
while True:
data, addr = sock.recvfrom(1024)
print(f"received message: {data.decode()} from {addr}")
Run Code Online (Sandbox Code Playgroud)
切题说明:Powershell 脚本实际上并不启动 UDP 服务器,它只是创建一个函数来执行此操作。Start-UDPServer -Port 9001因此,如果您希望它实际侦听数据报,则需要在末尾添加一行来调用该函数。