none
UDP Receive nach timer beenden RRS feed

  • Frage

  • Hallo zusammen,

    nach langem suchen und experimentieren wende ich mich an euch :) 

    Folgendes Problem:

    Mein Skript lauscht auf dem UDP-Port 514 bis dort ein bestimmter Code eingeht, dies ist leider eine Automatische Schleife.
    Ich würde gerne eine Art Timeout mit aufrufen, das z.B. das Lauschen nach x Minuten abgebrochen wird.

    Hier der Teil Quellcode...

    $a = new-object system.text.asciiencoding 
    $udpobject = new-Object system.Net.Sockets.Udpclient(514)
    $remoteendpoint = New-Object system.net.ipendpoint([system.net.ipaddress]::Any,0)
    	
    $receivebytes = $udpobject.Receive([ref]$remoteendpoint)
    [string]$returndata = $a.GetString($receivebytes)
    

    Ich habe schon veruscht eine While-Schleife um die Abfrage zu bauen die nach x Minuten abbricht, das Problem ist aber das die Receive-Abfrage eine Eigene Schleife ist.


    Irgendwie stehe ich aufm Schlauch :/

    Dienstag, 15. Mai 2012 10:30

Antworten

  • Mit Get-member bekommst du alles angezeigt was ein Objekt dir bietet.
    Lies bitte dazu meine kurze Anleitung dazu.
    http://www.admin-source.de/BlogDeu/248/powershell-klassen-objekte-und-das-net-framework

    In meiner Anleitung steht auch, wie du die .NET Kalssen bzw. Objekt Dokumentation zu lesen hast!

    Dann siehst du bei der .NET Klasse (System.Net.Sockets.Socket) die du mit Get-Member ermittelt hast, was sie dir bietet:
    http://msdn.microsoft.com/de-de/library/system.net.sockets.socket.aspx

    Dort klickst du auf receivetimeout:
    http://msdn.microsoft.com/de-de/library/system.net.sockets.socket.receivetimeout.aspx

    Dann siehst du das das millisekunden sind die dort angegeben werden.
    >>> Der Timeoutwert in Millisekunden. Der Standardwert ist 0 und gibt ein unendliches Timeoutintervall an. Durch die Angabe von -1 wird ebenfalls ein unendliches Timeoutintervall angegeben. <<<

    $a = new-object system.text.asciiencoding 
    $udpobject = new-Object system.Net.Sockets.Udpclient(514)
    $remoteendpoint = New-Object system.net.ipendpoint([system.net.ipaddress]::Any,0)
    
    # Recive timeout auf 64 millisekunden setzen
    # ohne dies würde Recive unendlich lange auf die Daten warten
    $udpobject.Client.ReceiveTimeout = 64
    	
    $receivebytes = $udpobject.Receive([ref]$remoteendpoint)
    [string]$returndata = $a.GetString($receivebytes)


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Dienstag, 15. Mai 2012 13:14

Alle Antworten

  • $a = new-object system.text.asciiencoding 
    $udpobject = new-Object system.Net.Sockets.Udpclient(514)
    $remoteendpoint = New-Object system.net.ipendpoint([system.net.ipaddress]::Any,0)
    
    $udpobject.Client.ReceiveTimeout | Get-Member

    $udpobject.Client.ReceiveTimeout = 64 # ;-))


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Dienstag, 15. Mai 2012 12:03
  • Vielen Dank Peter,

    aber leider kann ich deine beiden Zeilen nicht so ganz interpretieren.

    Was bedeutet die 64 (Sekunden...?)und was hilft mit die "| Get-Member",darüber kann ich noch Methoden öffnen, aber ich versteh nicht so richtig wie ich das zu nutzen habe.

    Muss ich meine beiden Zeilen durch deine ersetzen ?
    $receivebytes = $udpobject.Receive([ref]$remoteendpoint)

    [string]$returndata = $a.GetString($receivebytes)

    $udpobject.Client.ReceiveTimeout | Get-Member
    $udpobject.Client.ReceiveTimeout = 64
    Könntest du mir deinen Lösungsansatz nochmal erläutern ? Danke


    • Bearbeitet toO231 Dienstag, 15. Mai 2012 12:57
    Dienstag, 15. Mai 2012 12:41
  • Mit Get-member bekommst du alles angezeigt was ein Objekt dir bietet.
    Lies bitte dazu meine kurze Anleitung dazu.
    http://www.admin-source.de/BlogDeu/248/powershell-klassen-objekte-und-das-net-framework

    In meiner Anleitung steht auch, wie du die .NET Kalssen bzw. Objekt Dokumentation zu lesen hast!

    Dann siehst du bei der .NET Klasse (System.Net.Sockets.Socket) die du mit Get-Member ermittelt hast, was sie dir bietet:
    http://msdn.microsoft.com/de-de/library/system.net.sockets.socket.aspx

    Dort klickst du auf receivetimeout:
    http://msdn.microsoft.com/de-de/library/system.net.sockets.socket.receivetimeout.aspx

    Dann siehst du das das millisekunden sind die dort angegeben werden.
    >>> Der Timeoutwert in Millisekunden. Der Standardwert ist 0 und gibt ein unendliches Timeoutintervall an. Durch die Angabe von -1 wird ebenfalls ein unendliches Timeoutintervall angegeben. <<<

    $a = new-object system.text.asciiencoding 
    $udpobject = new-Object system.Net.Sockets.Udpclient(514)
    $remoteendpoint = New-Object system.net.ipendpoint([system.net.ipaddress]::Any,0)
    
    # Recive timeout auf 64 millisekunden setzen
    # ohne dies würde Recive unendlich lange auf die Daten warten
    $udpobject.Client.ReceiveTimeout = 64
    	
    $receivebytes = $udpobject.Receive([ref]$remoteendpoint)
    [string]$returndata = $a.GetString($receivebytes)


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Dienstag, 15. Mai 2012 13:14
  • Vielen Dank für die Erläuterung, jetzt funktioniert es auch ;) 

    Aber eine Frage hätte ich noch, wie kann ich es denn abfangen das die Error-Meldung unterdrückt wird wenn keine Daten empfangen werden.

    Mittwoch, 16. Mai 2012 07:45
  • Get-Help about_Try_Catch_Finally #!!
    


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Mittwoch, 16. Mai 2012 07:49
  • S.u. Du solltest darüberhinaus die UDP-Verbindung auch wieder schließen, sonst erhältst du beim erneuten Ausführen einen Fehler.

    $a = new-object system.text.asciiencoding 
    $udpobject = new-Object system.Net.Sockets.Udpclient(514)
    $remoteendpoint = New-Object system.net.ipendpoint([system.net.ipaddress]::Any,0)
    
    # Recive timeout auf 64 millisekunden setzen
    # ohne dies würde Recive unendlich lange auf die Daten warten
    $udpobject.Client.ReceiveTimeout = 64
    
    try {	
    $receivebytes = $udpobject.Receive([ref]$remoteendpoint)
    [strig]$returndata = $a.GetString($receivebytes)
    }
    catch {
    Write-Host "Timeout erreicht."
    }
    
    $udpobject.close()

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Mittwoch, 16. Mai 2012 08:24
    Moderator
  • Jo ist richtig!
    Was man auf macht, muss man auch wieder zu machen ;-)

    Er hat ja schon das Beispiel von Boe Prox da ist alles drin !
    http://learn-powershell.net/2011/02/21/querying-udp-ports-with-powershell/


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Mittwoch, 16. Mai 2012 10:44