在PowerShell中通过UDP发送和接收数据

时间:2012-08-27 19:52:50

标签: sockets powershell udp

我正在尝试使用PowerShell编写一个脚本来测试和应用程序。测试应包括通过UDP将字符串发送到远程服务器,然后从该服务器读取响应并对结果执行某些操作。我需要的唯一帮助是使用脚本的中间两个步骤('发送字符串',然后是'接收响应')步骤:

  1. 在端口UDP 5000上发送字符串“ABCDEFG”到服务器10.10.10.1
  2. 从服务器10.10.10.1
  3. 接收回复

    我对PowerShell比较熟悉,但这是我第一次处理套接字,所以我处在陌生的水域,而且我似乎无法理解我在帖子中找到的几个例子。

3 个答案:

答案 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()

它执行以下操作:

  1. 使用自动分配的端口(0)创建UDPClient。
  2. 获取本地IP地址和UDPClient自动分配的端口,并将其打印给用户。
  3. 从用户处检索对等方的IP地址和端口。
  4. 将字符串“heyo”从ASCII编码转换为字节数组并将其发送给对等体。 (我相信它将坐在同行的末端,直到它被“收到”,即使是几秒钟。)
  5. 创建一个IPEndPoint,从任何IP地址和任何端口(0)获取UDP数据包。
  6. 接收从对等体发送的任何数据作为新的字节数组,并将该IPEndPoint作为参考参数(现在存储接收数据包的来源)。
  7. 将接收到的字节数组转换为ASCII编码字符串并打印出来。
  8. 关闭UDPClient。 (确保执行此操作;否则,资源将持续存在(直到您重新启动PS)!)
  9. 这个脚本的优点在于它非常简单明了,您可以将它与localhost / 127.0.0.1(在两个单独的PowerShell窗口中)或外部IP地址一起使用,如果它是一个本地IP地址,您已经知道了,因为脚本会为您打印本地IP。

    请注意,UDPClient有一个SendAsync和一个ReceiveAsync,但它们没有超时。有些人已为此制定了复杂的变通方法,但您也可以使用PowerShell的Start-Job和其他*-Job命令,并将接收循环放在单独运行的代码中。