Estoy tratando de escribir una secuencia de comandos de prueba de la aplicación y el uso de PowerShell. La prueba debe consistir en el envío de una cadena a un servidor remoto a través de UDP, entonces la lectura de la respuesta del servidor y hacer algo con el resultado. La única ayuda que necesito es con el centro de los dos (‘send cadena’, luego en ‘recibir respuesta’) pasos de la secuencia de comandos:

  1. Enviar cadena “ABCDEFG” al servidor 10.10.10.1 en el puerto UDP 5000
  2. Recibir la respuesta desde el servidor 10.10.10.1

Soy relativamente familiarizados con PowerShell, pero esta es mi primera vez tener que lidiar con sockets, por lo que estoy en aguas desconocidas, y me parece que no puede hacer sentido de los pocos ejemplos que he encontrado en los postes.

Hola, Compruebe lo siguiente: leeholmes.com/blog/2009/10/28/… Se refiere a TCP, pero debe ser modificable para nosotros UDP en su lugar.
Gracias, que fue un buen comienzo y que me llevan a algunos otros artículos y documentación de MSDN, que luego se abrieron algunas otras preguntas… ¿esta declaración “$RemoteIpEndPoint = [Red.EndPoint](Nuevo Objeto-Net.IPEndPoint($([Net.IPAddress]::Ninguna, 0)))” significa que el servidor escuche en 0.0.0.0 y en todos los puertos UDP?
OK, así que consulte aquí que ‘Cualquier’ significa que se escuchará en todas las direcciones locales, y aquí que ‘0’ significa que va a agarrar cualquier puerto disponible. Mi pregunta es si puedo crear un objeto cliente, conectar con el servidor remoto y enviar una cadena de texto, como este: $UDPclient = nuevo-Sistema de objetos.Net.Sockets.UdpClient; $UDPclient.Connect($remoteHost, $puerto); $UDPclient.Enviar($sendBytes, $sendBytes.De longitud); el OS/.Manija de la RED el tráfico de retorno automáticamente cuando hago esto (a continuación):
$RemoteIpEndPoint = [Red.EndPoint](Nuevo Objeto-Net.IPEndPoint($([Net.IPAddress]::Ninguna, 0))); $receiveBytes = $UDPclient.Recibir([Ref]$RemoteIpEndPoint); con un poco de ‘bajo las cubiertas de la’ magia?

OriginalEl autor CRCerr0r | 2012-08-27

3 Comentarios

  1. 6

    Algún tiempo atrás, escribí un simple script de PowerShell para enviar un Datagrama UDP. Ver: http://pshscripts.blogspot.co.uk/2008/12/send-udpdatagramps1.html que se obtiene la mitad del camino. Yo nunca hicimos la otra mitad y escribir el lado del servidor de esto, sin embargo!

    <#  
    .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 
    Gracias, me encontré que con el post que estaba buscando (antes he publicado aquí) y fue de mucha ayuda, pero parece que mi principal lucha es con el recibo de parte de ella…

    OriginalEl autor Thomas Lee

  2. 2

    Aceptar para que el amigo de arriba le dio el lado del cliente, y aquí es un simple código del lado del 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 la IP 127.0.0.1 para su máquina en el lado del cliente, la apertura de 2 de windows powershell (uno para el cliente y otro para el lado del servidor).

    • Para obtener más de 1 paquete puede utilizar el código siguiente:

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

    }

    OriginalEl autor Matheus Mendes

  3. 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()

    Se hace lo siguiente:

    1. Crea un UDPClient con un asigna automáticamente el puerto (0).
    2. Obtiene la dirección IP local y UDPClient automáticamente se asigna el puerto y se imprime al usuario.
    3. Recupera los compañeros de la dirección IP y el puerto del usuario.
    4. Convierte la cadena “heyo” de ASCII-codificación en una matriz de bytes y la envía a la par. (Yo creer va a sentarse en el peer final hasta que se “recibió”, incluso para un número de segundos).
    5. Crea una IPEndPoint que tarda un paquete UDP desde cualquier dirección IP y puerto (0).
    6. Recibe los datos que se envían desde el punto como una nueva matriz de bytes con la que IPEndPoint como un parámetro de referencia (que ahora almacena el origen del paquete recibido).
    7. Convierte la recibió matriz de bytes ASCII string codificado y lo imprime.
    8. Cierra la UDPClient. (Asegúrese de hacer esto; de lo contrario, los recursos se persistir (hasta que reinicie PS)!)

    La belleza de este script es que es muy simple y sencillo y se puede utilizar tanto con localhost/127.0.0.1 (en dos PowerShell de windows) o con una dirección IP externa, la cual, si es una dirección IP local, vosotros ya sabréis porque la IP local se imprime para que la secuencia de comandos.

    Nota que hay un SendAsync y un ReceiveAsync para UDPClient, pero no hay tiempo de espera para ellos. Algunas personas han cocinado complicado soluciones para esto, pero usted también puede utilizar PowerShell Start-Job y otros *-Job comandos y poner a recibir un bucle en forma separada de ejecución de código.

    OriginalEl autor Andrew

Dejar respuesta

Please enter your comment!
Please enter your name here