2012-08-27 185 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])"
}