2012-08-27 53 views
6

Estoy tratando de escribir un script para probar y usar PowerShell. La prueba debe consistir en enviar una cadena a un servidor remoto a través de UDP, luego leer la respuesta de ese servidor y hacer algo con el resultado. La única ayuda que necesito es con el medio dos ('enviar cadena', luego 'recibir la respuesta') pasos de la secuencia de comandos:Enviar y recibir datos a través de UDP en PowerShell

  1. Enviar cadena "ABCDEFG" al servidor de 10.10.10.1 en el puerto UDP 5000
  2. recibir respuesta del servidor 10.10.10.1

soy relativamente familiarizados con PowerShell, pero esta es mi primera vez tener que lidiar con tomas de corriente, por lo que estoy en aguas desconocidas, y me parece que no puede dar sentido a la algunos ejemplos que he encontrado en publicaciones.

+0

Hola, Compruebe lo siguiente: http://www.leeholmes.com/blog/2009/10/28/scripting-network-tcp-connections-in-powershell/ Se refiere a TCP, pero debe ser modificable para nosotros UDP en su lugar . – Arcass

+0

Gracias, eso fue un buen comienzo y me llevó a algunos otros artículos y documentación de MSDN, que luego abrieron algunas otras preguntas ... ¿Esta declaración "$ RemoteIpEndPoint = [Net.EndPoint] (New-Object Net.IPEndPoint ($ ([Net.IPAddress] :: Any, 0))) "significa que el servidor escuchará en 0.0.0.0 y en todos los puertos UDP? – CRCerr0r

+0

OK, entonces veo [aquí] (http://msdn.microsoft.com/en-us/library/system.net.ipaddress.aspx) que 'Cualquiera' significa que escuchará en todas las direcciones locales, y [aquí ] (http://msdn.microsoft.com/en-us/library/k17zbw22.aspx) que '0' significa que atrapará cualquier puerto disponible. Mi pregunta es: si creo un objeto cliente, conéctese al servidor remoto y envíe una cadena, como esta: $ UDPclient = new-object System.Net.Sockets.UdpClient; $ UDPclient.Connect ($ remoteHost, $ port); $ UDPclient.Send ($ sendBytes, $ sendBytes.Length); hace que OS/.NET maneje el tráfico de retorno automáticamente cuando hago esto (continuará): – CRCerr0r

Respuesta

5

Hace algún tiempo, escribí un simple script de PowerShell para enviar un UDP Datagram. Ver: http://pshscripts.blogspot.co.uk/2008/12/send-udpdatagramps1.html que te llevará a mitad de camino. ¡Nunca hice la otra mitad y escribo el lado del servidor de esto!

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

Gracias, encontré esa publicación cuando estaba buscando (antes de publicar aquí) y fue útil, pero parece que mi principal problema es con la parte del recibo ... – CRCerr0r

0

Aquí está mi código:

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

realiza las siguientes acciones:

  1. Crea un UDPClient con un puerto asignado automáticamente (0).
  2. Obtiene la dirección IP local y el puerto UDPClient asignado automáticamente y lo imprime al usuario.
  3. Recupera la dirección IP y el puerto del par del usuario.
  4. Convierte la cadena "heyo" de la codificación ASCII en una matriz de bytes y la envía al par. (I cree que se quedará allí en el extremo del igual hasta que se "reciba", incluso durante algunos segundos.)
  5. Crea un IPEndPoint que toma un paquete UDP de cualquier dirección IP y cualquier puerto (0).
  6. Recibe los datos enviados por el par como una nueva matriz de bytes con ese IPEndPoint como parámetro de referencia (que ahora almacena el origen del paquete recibido).
  7. Convierte la matriz de bytes recibida en una cadena codificada en ASCII y la imprime.
  8. Cierra el UDPClient. (Asegúrese de hacer esto;! De lo contrario, persistirán los recursos (hasta que reinicie PS))

La belleza de este guión es que es muy simple y directo y se puede usar tanto con localhost/127.0.0.1 (en dos ventanas independientes de PowerShell) o con una dirección IP externa, que, si se trata de una dirección IP local, ya lo sabrá porque la secuencia de comandos local imprime la dirección IP local.

Tenga en cuenta que hay SendAsync y ReceiveAsync para UDPClient, pero no hay tiempo de espera para ellos. Algunas personas han ideado soluciones complicadas para esto, pero también puede simplemente usar los comandos Start-Job de PowerShell y otros *-Job y colocar un bucle de recepción en el código de ejecución por separado.

1

Ok por lo que el amigo anterior le dio el lado del cliente, y aquí es un simple código de servidor:

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

  • Puede probar usando el IP 127.0.0.1 para su máquina en t el lado del cliente, abriendo 2 ventanas de powershell (una para el lado del cliente y otra para el lado del servidor).

  • Desde hace más de 1 paquete puede utilizar el código de abajo:

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

Cuestiones relacionadas