2012-08-27 132 views
6

我正在尝试使用PowerShell编写测试脚本和应用程序。测试应该包括通过UDP向远程服务器发送一个字符串,然后从该服务器读取响应并对结果进行处理。唯一的帮助,我需要的是有剧本的中间两个(“发送字符串”,然后“接收响应”)步骤:在PowerShell中通过UDP发送和接收数据

  1. 发送字符串“ABCDEFG”服务器10.10.10.1端口UDP 5000
  2. 接收来自服务器10.10.10.1

响应我比较熟悉的PowerShell的,但这是不得不面对插座我的第一次,所以我在陌生海域,我似乎不能做的意义我在帖子中找到了几个例子。

+0

嗨, 检查以下内容: http://www.leeholmes.com/blog/2009/10/28/scripting-network-tcp-connections-in-powershell/ 它指的是TCP,但应该可以修改为UDP 。 – Arcass

+0

谢谢,这是一个很好的开始,它引导我到一些其他文章和MSDN文档,然后打开其他一些问题......这个声明“$ RemoteIpEndPoint = [Net.EndPoint](New-Object Net.IPEndPoint $([Net.IPAddress] :: Any,0)))“表示服务器将侦听0.0.0.0和所有UDP端口? – CRCerr0r

+0

好的,所以我看到[这里](http://msdn.microsoft.com/en-us/library/system.net.ipaddress.aspx)“任何”意味着它将监听所有本地地址,并[在这里](http://msdn.microsoft.com/en-us/library/k17zbw22.aspx)'0'表示它将抓住任何可用的端口。我的问题是 - 如果我创建一个客户端对象,连接到远程服务器并发送一个字符串,如下所示: $ UDPclient = new-object System.Net.Sockets.UdpClient; $ UDPclient。连接($ remoteHost,$ port); $ UDPclient.Send($ sendBytes,$ sendBytes.Length);当我这样做时(待续): – CRCerr0r

回答

5

有段时间,我写了一个简单的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 - [email protected] 
    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 
+0

谢谢,我在搜索时找到了这篇文章(之前我在这里发布),这很有帮助,但看起来我的主要困难在于它的收据部分... – CRCerr0r

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. 创建UDPClient与自动分配的端口(0)。
  2. 获取本地IP地址和UDPClient的自动分配端口并将其打印出来给用户。
  3. 从用户中检索对等方的IP地址和端口。
  4. 将字符串“heyo”从ASCII编码转换为字节数组并将其发送给对等体。 (我相信它将坐在那里对等的一端,直到它被“接收”,即使几秒钟。)
  5. 创建一个IPEndPoint从任何IP地址和任何端口(0)采取UDP数据包。
  6. 接收从对等方发送的任何数据作为新的字节数组,该IPEndPoint作为参考参数(现在存储接收数据包的来源)。
  7. 将接收到的字节数组转换为ASCII编码的字符串并打印出来。
  8. 关闭UDPClient。 (请确保做到这一点;!否则,资源将持续(在重新启动PS))

这个脚本的妙处在于,它是非常简单明了的,你可以使用它都localhost/127.0.0.1(在两个独立的PowerShell窗口中)或外部IP地址,如果它是本地IP地址,则您将知道该地址,因为脚本会为您打印本地IP。

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

1

好了,所以上面的朋友给你的客户端,这里是一个简单的服务器端代码:

$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)

  • 您可以在t上使用IP 127.0.0.1为您的机器进行测试他在客户端,打开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])"
}