2017-12-13 20 views
0

전화 시스템에서 우리는 호출을 위해 멀티 캐스트를 사용합니다. 때때로 우연히 누군가가 버튼을 밟을 것이고 우리는 whodunit을 추적하기 위해 Wireshark를 가동시켜야합니다. 그래서 나는 새로운 멀티 캐스트 패킷을 듣고 기록하기 위해 Powershell 스크립트를 만들었다. 잘 작동하지만 한 포트에만 바인딩 할 수 있습니다.여러 멀티 캐스트 포트 수신

Start-Job 및 워크 플로를 사용해 보았는데 성공하지 못했습니다. 그것은 나에게 완전히있을 수 있었다. 그럼 ... 여러 포트에서 이걸들을 수있는 방법에 대한 아이디어?

$outfile = "c:\multicast log\multicast.txt" 

function StartListener{ 
    Param(
     [Parameter(Mandatory)] 
     $IPAddress, 
     [Parameter(Mandatory)] 
     $Port 
    ) 

    $client = New-Object System.Net.Sockets.UDPClient 
    $client.ExclusiveAddressUse = $false; 
    #$localEp = [System.Net.IPEndPoint]::New([IPAddress]::Any, $Port); 
    $localEp = New-Object System.Net.IPEndPoint ([System.Net.IPAddress]::Any, $port) 
    $remEP = New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Any,0) 

    $client.Client.SetSocketOption([System.Net.Sockets.SocketOptionLevel]::Socket, [System.Net.Sockets.SocketOptionName]::ReuseAddress, $true); 
    $client.ExclusiveAddressUse = $false; 

    $client.Client.Bind($localEp); 
    $multicastaddress = [IPAddress]::Parse($IpAddress); 
    $client.JoinMulticastGroup($multicastaddress); 

    Write-Host "Listening. This will never quit so you will need to force close it" 

    $NewStream = $true 
    $last_remEP = "" 
    #initialize last_now to something that won't interfere 
    $last_now = (Get-Date).AddYears(-1) 
    while ($true) { 
     $receivedbytes = $client.Receive([ref]$remEP); 
     $now = Get-Date 
     $cur_remEP = $($remEP.ToString()) 
     if ($last_remEP -eq $cur_remEP) { 
      if ($now -gt ($last_now).AddSeconds(1)) { 
       $NewStream = $true 
      } else { 
       $NewStream = $false 
      } 
     } else { 
      $NewStream = $true 
     } 
     if ($NewStream) { 
      $last_remEP = $cur_remEP 
      if ((type $outfile).Count -ge 100) { 
       (Get-Content $outfile | Select-Object -Skip 25) | Set-Content $outfile 
      } 
      Add-Content $outfile "$($now.ToString("yyyy-MM-dd hh:mm:ss tt")) - Received multicast from $cur_remEP" 
     } 
     $last_now = $now 
    } 
} 

Clear-Content $outfile 
$now = Get-Date -Format "yyyy-MM-dd hh:mm:ss tt" 
Add-Content $outfile "$now - multicast logging started" 

startlistener 224.0.1.75 50008 
startlistener 224.0.1.75 50009 

pause 

답변

1

작업과 다른 포트에서 수신기를 실행할 수 있어야합니다. 동시 쓰기 시도로 이어질 수 있으므로 작업을 동일한 파일에 쓰지 않아야합니다. 이 쉽게되지 않을 것, 말했다와

$addr = '224.0.1.75' 
$ports = ... 
$sb = { 
    Param(
     [Parameter(Mandatory=$true)] 
     [Net.IPAddress]$IPAddress, 
     [Parameter(Mandatory=$true)] 
     [int]$Port 
    ) 

    $client = New-Object Net.Sockets.UDPClient 
    ... 
} 

$jobs = foreach ($port in $ports) { 
    Start-Job -Name "${addr}:${port}" -ScriptBlock $sb -ArgumentList $addr, $port 
} 

while ($true) { 
    $jobs | ForEach-Object { 
     $output = Receive-Job -Id $_.Id 
     if ($output) { 
      "{0}`t{1}" -f $_.Name, $output | Add-Content $outfile 
     } 
    } 
    Start-Sleep -Milliseconds 500 
} 

: 더 나은 방법은 작업이 STDOUT로 작성하여 실행 정기적으로 작업의 출력을 가져오고 파일에 기록이 가진 것 WinDump 해당 패킷을 추적하고 캡처 파일을 회전합니까?

+0

나는 시작 작업과 거의 같은 스크립트를 시도했지만 실제로 시작된 적이 없었다. 귀하의 의견을 조금이라도 조정하고 내가 더 큰 성공을 거둘 수 있는지 살펴 보겠습니다. WinDump의 경우 - 출력물은 멀티 캐스트 '세션'당 하나의 줄만 작성하여 보내진 마지막 전화를 간단하게 조회 할 수 있습니다. WinDump는 모든 패킷을 덤프합니다. – SaintFrag

+0

* WinDump는 모든 패킷을 덤프합니다. * 특정 패킷을 필터링하면 안됩니다. –

+0

죄송합니다, 명확히하기 : WinDump는 주어진 멀티 캐스트에 대한 모든 패킷을 덤프합니다. 특정 전화 페이지의 경우 수백 개의 패킷이있을 수 있습니다. 내 대본을 쓰는 동안 내 기록에는 한 줄의 줄이 있습니다. – SaintFrag