2012-08-27 12 views
6

Sto provando a scrivere uno script per testare e un'applicazione utilizzando PowerShell. Il test dovrebbe consistere nell'inviare una stringa a un server remoto su UDP, quindi leggere la risposta da quel server e fare qualcosa con il risultato. L'unico aiuto che mi serve è con al centro due ('inviare stringa', quindi 'ricevere risposta') passi dello script:Invia e ricevi dati tramite UDP in PowerShell

  1. Send stringa "ABCDEFG" al server 10.10.10.1 sulla porta UDP 5000
  2. ricevere risposta dal server 10.10.10.1

sono relativamente familiarità con PowerShell, ma questa è la mia prima volta avere a che fare con gli zoccoli, quindi sono in acque sconosciute, e io non riesco a dare un senso alla alcuni esempi che ho trovato sui post.

+0

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

+0

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

+0

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

risposta

5

Qualche tempo fa, ho scritto un semplice script PowerShell per inviare un datagramma UDP. Vedi: http://pshscripts.blogspot.co.uk/2008/12/send-udpdatagramps1.html che ti porterà a metà strada lì. Non ho mai fatto l'altra metà e scrivo il lato server di questo però!

<# 
.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

Grazie, ho trovato quel post quando stavo cercando (prima di pubblicare qui) ed è stato utile, ma sembra che la mia principale difficoltà sia con la parte ricevuta di esso ... – CRCerr0r

0

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:

  1. Crea una classe UdpClient di una porta assegnato automaticamente (0).
  2. Ottiene l'indirizzo IP locale e la porta assegnata automaticamente a UDPClient e la stampa all'utente.
  3. Recupera l'indirizzo IP e la porta del peer dall'utente.
  4. 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.)
  5. Crea un IPEndPoint che accetta un pacchetto UDP da qualsiasi indirizzo IP e qualsiasi porta (0).
  6. 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).
  7. Converte l'array di byte ricevuti in una stringa con codifica ASCII e lo stampa.
  8. 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.

1

Ok, quindi l'amico di cui sopra ti ha dato il lato client, e qui è un semplice codice lato server:

$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)

  • È possibile eseguire il test utilizzando IP 127.0.0.1 per la propria macchina su t lui lato client, aprendo 2 finestre di PowerShell (una per lato client e un'altra per lato server).

  • Per più di 1 pacchetto è possibile utilizzare il codice qui sotto:

$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])"
}