我正在尝试使用PowerShell编写一个脚本来测试和应用程序。测试应包括通过UDP将字符串发送到远程服务器,然后从该服务器读取响应并对结果执行某些操作。我需要的唯一帮助是使用脚本的中间两个步骤('发送字符串',然后是'接收响应')步骤:
我对PowerShell比较熟悉,但这是我第一次处理套接字,所以我处在陌生的水域,而且我似乎无法理解我在帖子中找到的几个例子。
答案 0 :(得分:7)
回过头来,我写了一个简单的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
答案 1 :(得分:2)
好的,所以上面的朋友给了你客户端,这是一个简单的服务器端代码:
$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])"
}
答案 2 :(得分:0)
这是我的代码:
$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,但它们没有超时。有些人已为此制定了复杂的变通方法,但您也可以使用PowerShell的Start-Job
和其他*-Job
命令,并将接收循环放在单独运行的代码中。