Oto mój kod:
$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()
wykonuje następujące:
- Tworzy UDPClient z automatycznie przypisanego portu (0).
- Pobiera lokalny adres IP i automatycznie przypisany port UDPClienta i drukuje je użytkownikowi.
- Pobiera adres IP i port peer od użytkownika.
- Konwertuje ciąg "heyo" z ASCII-encoding na tablicę bajtów i wysyła ją do peera. (I wierzę, że będzie siedział tam po stronie równorzędnej, dopóki nie zostanie "odebrany", nawet przez pewną liczbę sekund.)
- Tworzy IPEndPoint, który pobiera pakiet UDP z dowolnego adresu IP i dowolnego portu (0).
- Odbiera wszelkie dane, które zostały wysłane od węzła sieci jako nową tablicę bajtów z tym parametrem IPEndPoint jako parametrem referencyjnym (który przechowuje teraz pochodzenie odebranego pakietu).
- Konwertuje odebraną tablicę bajtów na ciąg znaków zakodowany w kodzie ASCII i drukuje go.
- Zamyka UDPClient. (Upewnij się, aby to zrobić!; Inaczej, zasoby będą się utrzymywać (dopiero po ponownym uruchomieniu PS))
Piękno tego scenariusza jest to, że jest to bardzo proste i jednoznaczne i można go używać zarówno z localhost
/127.0.0.1
(w dwóch oddzielnych oknach PowerShell) lub z zewnętrznym adresem IP, który, jeśli jest to lokalny adres IP, będzie już znany, ponieważ lokalny adres IP jest wydrukowany dla ciebie przez skrypt.
Należy zauważyć, że istnieje funkcja SendAsync i ReceiveAsync dla UDPClient, ale nie ma dla nich limitu czasu. Niektóre osoby opracowały skomplikowane obejścia tego problemu, ale można także po prostu użyć poleceń PowerShell Start-Job
i innych poleceń *-Job
i umieścić pętlę odbiorczą w osobnym kodzie.
Cześć, Sprawdź: http://www.leeholmes.com/blog/2009/10/28/scripting-network-tcp-connections-in-powershell/ Odnosi się do TCP, ale powinno być możliwe do zmodyfikowania do nas UDP . – Arcass
Dziękuję, to był dobry początek i to doprowadziło mnie do kilku innych artykułów i dokumentacji MSDN, które następnie otworzyły kilka innych pytań ... Czy ta deklaracja "$ RemoteIpEndPoint = [Net.EndPoint] (New-Object Net.IPEndPoint ($ ([Net.IPAddress] :: Any, 0))) "oznacza, że serwer będzie nasłuchiwał na 0.0.0.0 i na wszystkich portach UDP? – CRCerr0r
OK, więc widzę [tutaj] (http://msdn.microsoft.com/en-us/library/system.net.ipaddress.aspx), że "Any" oznacza, że będzie nasłuchiwał na wszystkich lokalnych adresach i [tutaj ] (http://msdn.microsoft.com/en-us/library/k17zbw22.aspx), że "0" oznacza, że pobierze dowolny dostępny port. Moje pytanie brzmi: jeśli utworzę obiekt klienta, połącz się ze zdalnym serwerem i wyślij ciąg znaków: $ UDPclient = new-object System.Net.Sockets.UdpClient; $ UDPclient.Połącz ($ remoteHost, $ port); $ UDPclient.Send ($ sendBytes, $ sendBytes.Length); czy OS/.NET obsługuje ruch zwrotny automatycznie, kiedy to robię (należy kontynuować): – CRCerr0r