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:
- Crea un UDPClient con un puerto asignado automáticamente (0).
- Obtiene la dirección IP local y el puerto UDPClient asignado automáticamente y lo imprime al usuario.
- Recupera la dirección IP y el puerto del par del usuario.
- 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.)
- Crea un IPEndPoint que toma un paquete UDP de cualquier dirección IP y cualquier puerto (0).
- 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).
- Convierte la matriz de bytes recibida en una cadena codificada en ASCII y la imprime.
- 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.
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
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
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