Abbruch einer Verbindung feststellen

  • hallo
    ich und ein freund haben ein tool für das spiel silkroad geschrieben. sobald man vom server disconnected ist, führt es einige aktionen aus. alles funktioniert wunderbar, aber leider haben wir die feststellung des disconnects nicht richtig hinbekommen, weshalb wir es dann durch eine pixelsuche gelöst haben. es wäre schon wenn uns jemand einen tipp geben könnte wie man den verbindungsabbruch vllt auch ohne pixelsuche feststellen könnte...

    mfg thasTony

    3 Mal editiert, zuletzt von thastony (9. Februar 2008 um 22:13)

  • Hi, ihr könnt mit dem cmdbefehl netstat ( netstat -n ) schauen welche connections zum pc bestehn.
    Könnt ja rausfinden welche Silkroad ist, und dann so lösen:

    [autoit]


    #include <Constants.au3>
    #include <string.au3>
    Dim $string
    $ip1 = "192.168.0.200"

    [/autoit][autoit][/autoit][autoit]

    $foo = Run(@ComSpec & " /c netstat -n", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)

    [/autoit][autoit][/autoit][autoit]

    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    $string = $string & $line
    Wend

    [/autoit][autoit][/autoit][autoit]

    msgbox(0,"Rückgabe",$string)

    [/autoit][autoit][/autoit][autoit]

    IF (Stringinstr($string,$ip1) <> 0) Then
    msgbox(0,"Bestehend","Die Connection zu der genannten IP besteht")
    Else
    msgbox(0,"Nicht aufgebaut","Die Connection zu der genannten IP besteht nicht")
    EndIf

    [/autoit]
  • edit: ach sry ich sollte mir angewöhnen nachzudenken bevor ich was poste ^^ funzt jetzt alles sehr vielen dank an qon

    Einmal editiert, zuletzt von thastony (1. Dezember 2007 um 17:47)

  • sry, dass ich jetzt nochmal so ein altes thema ausgrabe, aber ich würde das proramm gerne noch um eine funktion erweitern. und zwar würde ich das tool gerne multiclient kompatibel machen. Ich denke die beste möglichkeit dafür wäre den netstat befehl auf einen prozessnamen zu erweitern. jedoch habe ich abso´lut keine ahnung von kommandozeile und ob das überhaupt möglich ist dass der netstat befehl nur die verbindungen eines einzigen prozesses überprüft...

    naja bitte um hilfe ^^

    mfg thastony

  • Hi,

    das ist mit meiner Variante leider nicht möglich,
    aber hab meine Variante mal zu ner Funktion zusammengefasst:

    Spoiler anzeigen
    [autoit]


    #include <Constants.au3>
    #include <string.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Description: Checks if a connection to a specific ip adress exists.
    ; Syntax: _connectioncheck($ip)
    ; Parameter(s): $ip - The IP Adress to look for
    ; Requirement(s): None
    ; Return Value(s): On Success - Returns 1
    ; On Failure - Returns 0 and sets @error
    ; 1 = No connection exists
    ; Author(s): qon
    ; Note(s): None
    ;
    ;===============================================================================

    [/autoit] [autoit][/autoit] [autoit]

    func _checkipconnect($ip)
    Local $istring
    $foo = Run(@ComSpec & " /c netstat -n", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    $istring = $istring & $line
    Wend

    IF (Stringinstr($istring,$ip) <> 0) Then
    Return 1
    Else
    Seterror(1)
    Return 0
    EndIf
    EndFunc

    [/autoit]

    Beispiel:

    Spoiler anzeigen
    [autoit]


    IF _checkipconnect("192.168.0.200") = 1 then
    msgbox(0,"","besteht")
    else
    msgbox(0,"","besteht nicht")
    endif

    [/autoit]

    mfg qon

  • man bekommt eine meldung: "Disconnected from the server" aber via pxelsuche, wollt ichs nicht machen...

    ich verstehe die erstellung des strings leider nicht so ganz. ich fasse es so auf, dass in der variable $line immer nur eine zeile gesoeichert wird, jedoch wenn ich versuche andere variablen damit zu füllen kommen nur leere ergebnisse :( würde ich eas hinkriegen, jede zeilke einzeln zu speichern hätte ich schon eine idee mein problem zu löüsen, da jeder neu verbundene client über einen extra port verbindet...

    ich hoffe ihr könnt mir helfen


    mfg thasTony

  • also das riecht ja mal nach bot aber egal ^^

    Das zauberwort heißt Memory da stehts 100% drin aber die Frage ist wie dein script aussieht weil nur deswegen memory func zu machen lohnt sich net.

  • Die Zuordnung nach PID bekommt man mit
    netstat -on
    o für PID, n für IP-Ausgabe.
    Dann muss nur noch die PID des Prozesses bekannt sein...
    z.B. über $PID = Run("App.exe")

  • Hab dann mal meine Funktion etwas geändert bzw erweitert :D

    Spoiler anzeigen
    [autoit]


    #include <Constants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Description: Checks if a process is connected - to the internet / to a specific IP
    ; Syntax: _CheckProcessConnect($sProcess,$iIp = False)
    ; Parameter(s): $sProcess = Processname / Process ID to look for
    ; $iIp = The IP that the Process should be connected to [ optional! ]
    ; Requirement(s): None
    ; Return Value(s): On Success - Returns 1
    ; On Failure - Returns 0 and sets @error
    ; 1 = No connection exists
    ; 2 = Process does not exist
    ; 3 = No german Windows
    ; Author(s): qon
    ; Note(s): None
    ;
    ;===============================================================================

    [/autoit] [autoit][/autoit] [autoit]

    Func _CheckProcessConnect($sProcess,$iIp = False)
    If RegRead("HKEY_CURRENT_USER\Control Panel\International\", "sLanguage") <> "DEU" Then
    SetError(3)
    Return 0
    EndIf
    $iPID = ProcessExists($sProcess)
    If $iPID = 0 then
    SetError(2)
    Return 0
    EndIf
    $foo = Run(@ComSpec & " /c netstat -on", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    Switch $iIp
    Case False
    If StringInStr(" " & $line & " ",$iPID) and StringInStr(" " & $line & " ","HERGESTELLT") Then
    Return 1
    EndIf
    Case Else
    If StringInStr(" " & $line & " ",$iPID) and StringInStr(" " & $line & " ","HERGESTELLT") and StringInStr(" " & $line & " ",$iIp) Then
    Return 1
    EndIf
    EndSwitch
    Wend
    SetError(1)
    Return 0
    EndFunc

    [/autoit]

    Kannst jetzt beide Processid's bzw bei einer Sitzung den Prozessnamen checken,
    zur Not auch noch zu ner speziellen IP, falls es da mehrere Connections von dem Programm gibt.

    Greetz

  • ihr seit die besten ^^ hab jetzt aber noch ein kleines problem und zwar weiß ich nicht genau was mit prozecssid gemeint ist. also wie kann ich die beiden prozesse unterscheiden, sie tragen ja den selben namen? ich habe mal einen autoit code gesehen, der den prozess umbenennt, aber
    1. habe ich den grade nach 20min suchen nicht wiederfinden können und
    2. hat der soweit ich mich errinnern kann nur den Titel geändert...

    btw: greift autoit auf sprachspezifische funktionen zurück, oder warum die sperre für anderssprachige windowssysteme?

    mfg thasTony

  • Hi,

    das mit der Sprache ist einfach, weil er ja im CMD Fenster von netstat "Hergestellt" sucht,
    und naja in anderen Sprachen wird er da wohl kaum was finden ;) Wenn du mir sagen kannst was an der Stelle im französischen oder englischen steht könnte ich sie um die Sprachen erweitern ;)

    Eine Prozess ID ist eine einmalige ID des Prozesses, womit man auch 3 prozesse die Beispielsweise firefox.exe heissen voneinander unterscheiden kann.
    Wie oben beschrieben gibt die Funktion Run(..) auch die PID zurück, falls du das Programm mit AutoIt aufrufst kriegst du so beide PID's.
    Oder mit ProcessList("meinprozess.exe") wird n array ausgegeben mit allen prozessen inklusive ID die so heissen.
    greetz

    Einmal editiert, zuletzt von qon (8. Februar 2008 um 14:12)

  • ups war leicht müde als ich das gefragt hab ^^ na ich habs mal auf TCP umgeändert funktioniert in diesem falle eigentlich genauso gut. das mit der PID habe ich jetzt auch verstanden und die funktion ist nun fertig :) ich dank euch allen nochmals für die unterstützung :)

    mfg thastony