我正在尝试使用 PowerShell 编写脚本来测试和应用程序。测试应该包括通过 UDP 向远程服务器发送一个字符串,然后从该服务器读取响应并对结果进行处理。我需要的唯一帮助是脚本的中间两个(“发送字符串”,然后是“接收响应”)步骤:
- 在端口 UDP 5000 上将字符串“ABCDEFG”发送到服务器 10.10.10.1
- 从服务器 10.10.10.1 接收响应
我对 PowerShell 比较熟悉,但这是我第一次处理套接字,所以我处于陌生的水域,我似乎无法理解我在帖子中找到的几个示例。
我正在尝试使用 PowerShell 编写脚本来测试和应用程序。测试应该包括通过 UDP 向远程服务器发送一个字符串,然后从该服务器读取响应并对结果进行处理。我需要的唯一帮助是脚本的中间两个(“发送字符串”,然后是“接收响应”)步骤:
我对 PowerShell 比较熟悉,但这是我第一次处理套接字,所以我处于陌生的水域,我似乎无法理解我在帖子中找到的几个示例。
前段时间,我编写了一个简单的 PowerShell 脚本来发送 UDP 数据报。请参阅:http ://pshscripts.blogspot.co.uk/2008/12/send-udpdatagramps1.html ,这将使您走到一半。不过,我从来没有做过另一半,也没有写过服务器端!
<# .SYNOPSIS Sends a UDP datagram to a port .DESCRIPTION This script used system.net.socckets to send a UDP datagram to a particular port. Being UDP, there's no way to determine if the UDP datagram actually was received. for this sample, a port was chosen (20000). .NOTES File Name : Send-UDPDatagram Author : Thomas Lee - tfl@psp.co.uk Requires : PowerShell V2 CTP3 .LINK http://www.pshscripts.blogspot.com .EXAMPLE #> ### # Start of Script ## # Define port and target IP address # Random here! [int] $Port = 20000 $IP = "10.10.1.100" $Address = [system.net.IPAddress]::Parse($IP) # Create IP Endpoint $End = New-Object System.Net.IPEndPoint $address, $port # Create Socket $Saddrf = [System.Net.Sockets.AddressFamily]::InterNetwork $Stype = [System.Net.Sockets.SocketType]::Dgram $Ptype = [System.Net.Sockets.ProtocolType]::UDP $Sock = New-Object System.Net.Sockets.Socket $saddrf, $stype, $ptype $Sock.TTL = 26 # Connect to socket $sock.Connect($end) # Create encoded buffer $Enc = [System.Text.Encoding]::ASCII $Message = "Jerry Garcia Rocks`n"*10 $Buffer = $Enc.GetBytes($Message) # Send the buffer $Sent = $Sock.Send($Buffer) "{0} characters sent to: {1} " -f $Sent,$IP "Message is:" $Message # End of Script
这是我的代码:
$client = new-object net.sockets.udpclient(0)
write-host "You are $(((ipconfig) -match 'IPv').split(':')[1].trim()):$($client.client.localendpoint.port)"
$peerIP = read-host "Peer IP address"
$peerPort = read-host "Peer port"
$send = [text.encoding]::ascii.getbytes("heyo")
[void] $client.send($send, $send.length, $peerIP, $peerPort)
$ipep = new-object net.ipendpoint([net.ipaddress]::any, 0)
$receive = $client.receive([ref]$ipep)
echo ([text.encoding]::ascii.getstring($receive))
$client.close()
它执行以下操作:
该脚本的美妙之处在于它非常简单明了,您可以将它与localhost
/ 127.0.0.1
(在两个单独的 PowerShell 窗口中)或外部 IP 地址一起使用,如果它是本地 IP 地址,您将已经知道,因为本地脚本会为您打印出 IP。
请注意,UDPClient 有一个 SendAsync 和一个 ReceiveAsync,但它们没有超时。有些人为此制定了复杂的解决方法,但您也可以只使用 PowerShellStart-Job
和其他*-Job
命令,并在单独运行的代码中放置一个接收循环。
Thomas 刚刚给了你客户端,下面是一个简单的服务器端代码:
$port = 2020
$endpoint = new-object System.Net.IPEndPoint ([IPAddress]::Any,$port)
$udpclient = new-Object System.Net.Sockets.UdpClient $port
$content = $udpclient.Receive([ref]$endpoint)
[Text.Encoding]::ASCII.GetString($content)
您可以在客户端为您的机器使用 IP 127.0.0.1 进行测试,打开 2 个 powershell 窗口(一个用于客户端,另一个用于服务器端)。
对于超过 1 个数据包,您可以使用以下代码:
$port = 2020
$endpoint = New-Object System.Net.IPEndPoint ([IPAddress]::Any, $port)
Try {
while($true) {
$socket = New-Object System.Net.Sockets.UdpClient $port
$content = $socket.Receive([ref]$endpoint)
$socket.Close()
[Text.Encoding]::ASCII.GetString($content)
}
} Catch {
"$($Error[0])"
}