如何在Windows中使用python从给定端口读取UDP数据?

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解决方案!

ric*_*lly 4

据我所知,如果您发布的 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因此,如果您希望它实际侦听数据报,则需要在末尾添加一行来调用该函数。

  • `data = sock.recv(1024)` 和 `data, addr = sock.recvfrom(1024)` 一样有效。不起作用的是“data, addr = sock.recv(1024)”,这就是上面问题中的内容。如果您想要发送方的地址,那么您需要使用“recvfrom”而不是“recv”。传递给“bind”的元组的地址部分的““”被转换为所使用的套接字地址族的“INADDR_ANY”,并绑定到所有地址。 (3认同)