2012-10-29 97 views
2

我目前有一个脚本在指定的端口上侦听。我希望此脚本在5秒后停止运行,无论连接与否。有没有办法可以做到这一点?某种延迟在powershell中“x”秒后停止函数

function listen-port ($port) { 
    $endpoint = new-object System.Net.IPEndPoint ([ipaddress]::any,$port) 
    $listener = new-object System.Net.Sockets.TcpListener $endpoint 
    $listener.start() 
    $listener.AcceptTcpClient() # will block here until connection 
    $listener.stop() 
    } 
listen-port 25 
+0

在http://msdn.microsoft.com/en-us/library/zsyxy9k2.aspx,你有''BeginAcceptTcpClient''和''EndAcceptTcpClient''功能做异步接受,但你需要设置回调。在两者之间插入启动 - 睡眠5并完成。 –

回答

2

如果你不打算跟客户做任何事情,那么你就必须接受他们,只需停止监听:

function listen-port ($port) { 
$endpoint = new-object System.Net.IPEndPoint ([ipaddress]::any,$port) 
$listener = new-object System.Net.Sockets.TcpListener $endpoint 
$listener.start() 
Start-Sleep -s 5 
$listener.stop() 
} 

可以利用异步AcceptTcpClient方法(BeginAcceptTcpClientEndAcceptTcpClient)如果你需要做一些与客户端:

function listen-port ($port) { 
$endpoint = new-object System.Net.IPEndPoint ([ipaddress]::any,$port) 
$listener = new-object System.Net.Sockets.TcpListener $endpoint 
$listener.start() 
$ar = $listener.BeginAcceptTcpClient($null,$null) # will not block here until connection 

if ($ar.AsyncWaitHandle.WaitOne([timespan]'0:0:5') -eq $false) 
{ 
Write-Host "no connection within 5 seconds" 
} 
else 
{ 
Write-Host "connection within 5 seconds" 
$client = $listener.EndAcceptTcpClient($ar) 
} 

$listener.stop() 
} 

另一种选择是使用Pending方法对听众:

function listen-port ($port) { 
$endpoint = new-object System.Net.IPEndPoint ([ipaddress]::any,$port) 
$listener = new-object System.Net.Sockets.TcpListener $endpoint 
$listener.start() 
Start-Sleep -s 5 

if ($listener.Pending() -eq $false) 
{ 
Write-Host "nobody connected" 
} 
else 
{ 
Write-Host "somebody connected" 
$client = $listener.AcceptTcpClient() 
} 

$listener.stop() 
}