這裏是我的代碼:
$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()
它具有下列功能:
- 創建UDPClient與自動分配的端口(0)。
- 獲取本地IP地址和UDPClient的自動分配端口並將其打印出來給用戶。
- 從用戶中檢索對等方的IP地址和端口。
- 將字符串「heyo」從ASCII編碼轉換爲字節數組並將其發送給對等體。 (我相信它將坐在那裏對等的一端,直到它被「接收」,即使幾秒鐘。)
- 創建一個IPEndPoint從任何IP地址和任何端口(0)採取UDP數據包。
- 接收從對等方發送的任何數據作爲新的字節數組,該IPEndPoint作爲參考參數(現在存儲接收數據包的來源)。
- 將接收到的字節數組轉換爲ASCII編碼的字符串並打印出來。
- 關閉UDPClient。 (請確保做到這一點;!否則,資源將持續(在重新啓動PS))
這個腳本的妙處在於,它是非常簡單明瞭的,你可以使用它都localhost
/127.0.0.1
(在兩個獨立的PowerShell窗口中)或外部IP地址,如果它是本地IP地址,則您將知道該地址,因爲腳本會爲您打印本地IP。
請注意,UDPClient有一個SendAsync和ReceiveAsync,但它們沒有超時。有些人爲此製作了複雜的解決方法,但您也可以使用PowerShell的Start-Job
和其他*-Job
命令,並將接收循環放在單獨運行的代碼中。
嗨, 檢查以下內容: http://www.leeholmes.com/blog/2009/10/28/scripting-network-tcp-connections-in-powershell/ 它指的是TCP,但應該可以修改爲UDP 。 – Arcass
謝謝,這是一個很好的開始,它引導我到一些其他文章和MSDN文檔,然後打開其他一些問題......這個聲明「$ RemoteIpEndPoint = [Net.EndPoint](New-Object Net.IPEndPoint $([Net.IPAddress] :: Any,0)))「表示服務器將偵聽0.0.0.0和所有UDP端口? – CRCerr0r
好的,所以我看到[這裏](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