这里是我的代码:
$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()
它具有下列功能:
- 创建UDPClient与自动分配的端口(0)。
- 获取本地IP地址和UDPClient的自动分配端口并将其打印出来给用户。
- 从用户中检索对等方的IP地址和端口。
- 将字符串“heyo”从ASCII编码转换为字节数组并将其发送给对等体。 (我相信它将坐在那里对等的一端,直到它被“接收”,即使几秒钟。)
- 创建一个IPEndPoint从任何IP地址和任何端口(0)采取UDP数据包。
- 接收从对等方发送的任何数据作为新的字节数组,该IPEndPoint作为参考参数(现在存储接收数据包的来源)。
- 将接收到的字节数组转换为ASCII编码的字符串并打印出来。
- 关闭UDPClient。 (请确保做到这一点;!否则,资源将持续(在重新启动PS))
这个脚本的妙处在于,它是非常简单明了的,你可以使用它都localhost
/127.0.0.1
(在两个独立的PowerShell窗口中)或外部IP地址,如果它是本地IP地址,则您将知道该地址,因为脚本会为您打印本地IP。
请注意,UDPClient有一个SendAsync和ReceiveAsync,但它们没有超时。有些人为此制作了复杂的解决方法,但您也可以使用PowerShell的Start-Job
和其他*-Job
命令,并将接收循环放在单独运行的代码中。
嗨, 检查以下内容: http://www.leeholmes.com/blog/2009/10/28/scripting-network-tcp-connections-in-powershell/ 它指的是TCP,但应该可以修改为UDP 。 – Arcass
谢谢,这是一个很好的开始,它引导我到一些其他文章和MSDN文档,然后打开其他一些问题......这个声明“$ RemoteIpEndPoint = [Net.EndPoint](New-Object Net.IPEndPoint $([Net.IPAddress] :: Any,0)))“表示服务器将侦听0.0.0.0和所有UDP端口? – CRCerr0r
好的,所以我看到[这里](http://msdn.microsoft.com/en-us/library/system.net.ipaddress.aspx)“任何”意味着它将监听所有本地地址,并[在这里](http://msdn.microsoft.com/en-us/library/k17zbw22.aspx)'0'表示它将抓住任何可用的端口。我的问题是 - 如果我创建一个客户端对象,连接到远程服务器并发送一个字符串,如下所示: $ UDPclient = new-object System.Net.Sockets.UdpClient; $ UDPclient。连接($ remoteHost,$ port); $ UDPclient.Send($ sendBytes,$ sendBytes.Length);当我这样做时(待续): – CRCerr0r