12

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

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

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

4

3 回答 3

11

前段时间,我编写了一个简单的 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 
于 2012-08-27T21:57:33.123 回答
3

这是我的代码:

$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. 创建一个从任何 IP 地址和任何端口 (0) 获取 UDP 数据包的 IPEndPoint。
  6. 接收从对等方发送的任何数据作为一个新的字节数组,并以该 IPEndPoint 作为参考参数(现在存储接收到的数据包的来源)。
  7. 将接收到的字节数组转换为 ASCII 编码的字符串并打印出来。
  8. 关闭 UDPClient。(确保这样做;否则,资源将持续存在(直到您重新启动 PS)!)

该脚本的美妙之处在于它非常简单明了,您可以将它与localhost/ 127.0.0.1(在两个单独的 PowerShell 窗口中)或外部 IP 地址一起使用,如果它是本地 IP 地址,您将已经知道,因为本地脚本会为您打印出 IP。

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

于 2017-11-22T17:43:11.937 回答
3

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])"
      }
    
于 2017-12-01T17:00:29.127 回答