Ecco il mio codice:
$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()
Non la seguente:
- Crea una classe UdpClient di una porta assegnato automaticamente (0).
- Ottiene l'indirizzo IP locale e la porta assegnata automaticamente a UDPClient e la stampa all'utente.
- Recupera l'indirizzo IP e la porta del peer dall'utente.
- Converte la stringa "heyo" dalla codifica ASCII in una matrice di byte e la invia al peer. (I crediamo nello finché non viene "ricevuto", anche per un certo numero di secondi.)
- Crea un IPEndPoint che accetta un pacchetto UDP da qualsiasi indirizzo IP e qualsiasi porta (0).
- Riceve qualsiasi dato inviato dal peer come nuovo array di byte con tale IPEndPoint come parametro di riferimento (che ora memorizza l'origine del pacchetto ricevuto).
- Converte l'array di byte ricevuti in una stringa con codifica ASCII e lo stampa.
- Chiude UDPClient. (Assicuratevi di fare questo,! In caso contrario, le risorse persisteranno (fino al riavvio PS))
La bellezza di questo script è che è molto semplice e lineare e si può utilizzare sia con localhost
/127.0.0.1
(in due finestre PowerShell separate) o con un indirizzo IP esterno, che, se si tratta di un indirizzo IP locale, lo saprete già perché l'IP locale è stampato per voi dallo script.
Nota che c'è un SendAsync e un ReceiveAsync per UDPClient, ma non esiste un timeout per essi. Alcune persone hanno elaborato soluzioni alternative per questo, ma è anche possibile utilizzare semplicemente i comandi Start-Job
di PowerShell e altri comandi *-Job
e inserire un ciclo di ricezione nel codice di esecuzione separato.
Ciao, Verificare quanto segue: http://www.leeholmes.com/blog/2009/10/28/scripting-network-tcp-connections-in-powershell/ Si riferisce a TCP, ma dovrebbe essere modificabile per noi UDP invece . – Arcass
Grazie, è stato un buon inizio e mi ha portato ad altri articoli e documentazione MSDN, che ha poi aperto altre domande ... Questa dichiarazione "$ RemoteIpEndPoint = [Net.EndPoint] (New-Object Net.IPEndPoint ($ ([Net.IPAddress] :: Any, 0))) "significa che il server ascolterà su 0.0.0.0 e su tutte le porte UDP? – CRCerr0r
OK, quindi vedo [qui] (http://msdn.microsoft.com/en-us/library/system.net.ipaddress.aspx) che "Qualsiasi" significa che ascolterà su tutti gli indirizzi locali e [qui ] (http://msdn.microsoft.com/en-us/library/k17zbw22.aspx) che '0' significa che prenderà qualsiasi porta disponibile. La mia domanda è: se creo un oggetto client, connetti al server remoto e invii una stringa, come questa: $ UDPclient = new-object System.Net.Sockets.UdpClient; $ UDPcliente.Connetti ($ remoteHost, $ port); $ UDPclient.Send ($ sendBytes, $ sendBytes.Length); l'OS/.NET gestisce automaticamente il traffico di ritorno quando si esegue questa operazione (per continuare): – CRCerr0r