gpt4 book ai didi

powershell - 退出UDP监听例程

转载 作者:行者123 更新时间:2023-12-03 12:03:19 26 4
gpt4 key购买 nike

我正在尝试在powershell中编写一个例程,该例程将监听UDP端口,然后在按下某个键时退出。我的问题是该程序将仅在读取数据报后退出。

IE。它将读取n个值,用户将按F12键,程序将等待直到获得第n + 1个值,然后退出。

应该发生的情况是:读取n个值,用户将按F12键,程序应关闭。

$endpoint = New-Object System.Net.IPEndPoint ([IPAddress]::Any, $port)
$continue = $true
while($continue)
{

if ([console]::KeyAvailable)
{
echo "Exit with F12";
$x = [System.Console]::ReadKey()

switch ( $x.key)
{
F12 { $continue = $false }
}
}
else
{

$socket = New-Object System.Net.Sockets.UdpClient $port
$content = $socket.Receive([ref]$endpoint)
$socket.Close()
[Text.Encoding]::ASCII.GetString($content)
}
}

我对Powershell完全陌生,所以也许这是不可能的。其余代码已从此处的其他答案中窃取。

最佳答案

一种使用ReceiveTimeout属性的解决方案,该属性在@bluuf的注释中提到:

$p = 17042
$e = New-Object System.Net.IPEndPoint ([System.Net.IPAddress]::Any, $p)
$u = New-Object System.Net.Sockets.UdpClient $p
$u.Client.ReceiveTimeout = 100
try
{
for()
{
try
{
$b = $u.Receive([ref]$e)
$s = [System.Text.Encoding]::ASCII.GetString($b)
Write-Host $s
}
catch [System.Net.Sockets.SocketException]
{
if ( $_.Exception.SocketErrorCode -ne 'TimedOut' )
{
throw
}
}
if ( [System.Console]::KeyAvailable )
{
$x = [System.Console]::ReadKey($true)
if ( $x.key -eq [System.ConsoleKey]::F12 )
{
Write-Host 'Exit with F12'
break
}
}
}
}
finally
{
$u.Close()
}

异步版本可能如下所示:
if( -not('CallbackEventBridge' -as [type]) )
{
Add-Type @'
using System;

public sealed class CallbackEventBridge
{
public event AsyncCallback CallbackComplete = delegate { };

private CallbackEventBridge() {}

private void CallbackInternal(IAsyncResult result)
{
CallbackComplete(result);
}

public AsyncCallback Callback
{
get { return new AsyncCallback(CallbackInternal); }
}

public static CallbackEventBridge Create()
{
return new CallbackEventBridge();
}
}
'@
}
$sb = {
param($ar)
$e = $ar.AsyncState.e
$u = $ar.AsyncState.u
$b = $u.EndReceive($ar, [ref]$e)
$s = [System.Text.Encoding]::ASCII.GetString($b)
Write-Host $s
$ar.AsyncState.completed = $true
}
$bridge = [CallbackEventBridge]::Create()
Register-ObjectEvent -InputObject $bridge -EventName CallbackComplete -Action $sb > $null
$p = 17042
$e = New-Object System.Net.IPEndPoint ([System.Net.IPAddress]::Any, $p)
$u = New-Object System.Net.Sockets.UdpClient $p
$state = @{e = $e; u = $u; completed = $true}
try
{
for()
{
if( $state.completed )
{
$state.completed = $false
[void]$u.BeginReceive($bridge.Callback, $state)
}
if ( [System.Console]::KeyAvailable )
{
$x = [System.Console]::ReadKey($true)
if ( $x.key -eq [System.ConsoleKey]::F12 )
{
Write-Host 'Exit with F12'
break
}
}
[System.Threading.Thread]::Sleep(100)
}
}
finally
{
$u.Close()
}

在Oisin Grehan的 PowerShell 2.0 – Asynchronous Callbacks from .NET文章中了解有关CallbackEventouBridge类的更多信息。

可以使用以下代码片段测试这两个版本:
$p = 17042
$u = New-Object System.Net.Sockets.UdpClient
$b = [System.Text.Encoding]::ASCII.GetBytes('Is anybody there')
$u.Connect('localhost', $p)
[void]$u.Send($b, $b.Length)
$u.Close()

关于powershell - 退出UDP监听例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53458103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com