TCP IP des Anfragenden Clients aulesen

  • Hi,

    ich habe einen Client und eine Server in Autoit realisiert. Gibt es eine Möglichkeit die IP des Anfragenen Clients abzurufen und in eine Variable zu speichern?
    Kann man auch die MAC Adresse des Client am Server herraus bekommen?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    • Offizieller Beitrag

    Die IP-Adresse sollte mit netstat gehen und die MAC-Adresse mit arp.

  • Wollte ich ja zuerst, hab aber immernoch Problem, damit das manchmal einfach nichts übermittelt wird:

    Das wäre Client - Server aktuell:

    CLient:

    Spoiler anzeigen
    [autoit]

    Func _GetMACFromIP($sIP=@IPAddress1, $mode = 1)
    Local $MAC, $MACSize
    Local $i, $s, $r, $iIP
    $MAC = DllStructCreate("byte[6]")
    $MACSize = DllStructCreate("int")
    DllStructSetData($MACSize, 1, 6)
    $r = DllCall("Ws2_32.dll", "int", "inet_addr", _
    "str", $sIP)
    $iIP = $r[0]
    $r = DllCall("iphlpapi.dll", "int", "SendARP", "int", $iIP, "int", 0, "ptr", DllStructGetPtr($MAC), "ptr", DllStructGetPtr($MACSize))
    $s = ""
    If $mode = 0 Then
    For $i = 0 To 5
    $s &= Hex(DllStructGetData($MAC, 1, $i + 1), 2)
    Next

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

    ElseIf $mode = 1 Then
    For $i = 0 To 5
    If $i Then $s = $s & ":"
    $s = $s & Hex(DllStructGetData($MAC, 1, $i + 1), 2)
    Next
    ElseIf $mode = 2 Then
    For $i = 0 To 5
    If $i Then $s = $s & "-"
    $s = $s & Hex(DllStructGetData($MAC, 1, $i + 1), 2)
    Next
    EndIf
    Return $s
    EndFunc

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

    Do
    Local $macadresse = ""
    $macadresse = _GetMACFromIP()
    Until $macadresse <> ""

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

    $text = @IPAddress1 & "#" & $macadresse & "#" & @ComputerName

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

    $Empfaenger_IP = "193.196.72.5"
    $Port = 33891

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

    TCPStartUp()

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

    $ConnectedSocket = TCPConnect($Empfaenger_IP, $Port)
    TCPSend($ConnectedSocket, $text)
    Sleep(3000)
    TCPShutdown ()

    [/autoit]
    Spoiler anzeigen
    [autoit]

    #include <SQLite.au3>
    #include <SQLite.dll.au3>

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

    Local $sSQliteDll
    $sSQliteDll = _SQLite_Startup ()
    If @error > 0 Then
    MsgBox(16, "SQLite Fehler", "SQLite.dll konnte nicht geladen werden!")
    Exit - 1
    EndIf
    ConsoleWrite("_SQLite_LibVersion=" &_SQLite_LibVersion() & @CR)

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

    _SQLite_Open(@ScriptDir & '\datenbank.db')

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

    $strCREATE = _
    "CREATE TABLE [Programme] (" & _
    "[id] INTEGER PRIMARY KEY NOT NULL," & _
    "[name] VARCHAR[50] NULL," & _
    "[pfad] VARCHAR[100] NULL," & _
    "[kategorie] VARCHAR[30] NULL)"
    If _SQLite_Exec ( -1, $strCREATE ) <> $SQLITE_OK Then

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

    EndIf

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

    $strCREATE = _
    "CREATE TABLE [Rechner] (" & _
    "[id] INTEGER PRIMARY KEY NOT NULL," & _
    "[ip] VARCHAR[15] NULL," & _
    "[mac] VARCHAR[17] NULL," & _
    "[name] VARCHAR[6] NULL," & _
    "[pool] VARCHAR[10] NULL)"
    If _SQLite_Exec ( -1, $strCREATE ) <> $SQLITE_OK Then

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

    EndIf

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

    $strCREATE = _
    "CREATE TABLE [Zuweisen] (" & _
    "[id] INTEGER PRIMARY KEY NOT NULL," & _
    "[programmid] INTEGER NULL," & _
    "[rechnerid] INTEGER NULL)"
    If _SQLite_Exec ( -1, $strCREATE ) <> $SQLITE_OK Then

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

    EndIf

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

    While 1
    TCPStartup()
    $MainSocket = TCPListen(@IPAddress1, 33891, 100 )

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

    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1

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

    If $ConnectedSocket <> -1 Then
    $recv = TCPRecv($ConnectedSocket, 100)
    MsgBox(0,"",$recv)
    Sleep(1000)

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

    $empfang = StringSplit($recv,"#")

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

    Local $hQuery, $hZeile = ""
    _SQLite_Query(-1,"SELECT ip,name FROM Rechner WHERE ip = '" & $empfang[1] & "'" ,$hQuery)
    _SQLite_FetchData($hQuery, $hZeile)
    _SQLite_QueryFinalize ($hQuery)

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

    $anzahl = Ubound($hZeile)
    MsgBox(0,"",$anzahl)
    If $anzahl < 2 Then
    MsgBox(0,"","nicht vorhanden")
    _SQLite_Exec(-1,"INSERT INTO Rechner (id, ip, mac, name, pool) VALUES (NULL, '"& $empfang[1] & "', '" & $empfang[2] & "', '" & $empfang[3] & "', NULL)")
    Else
    MsgBox(0,"","vorhanden")
    EndIf
    EndIF
    TCPShutdown()
    WEnd

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

    _SQLite_Close()
    _SQLite_Shutdown ()

    [/autoit]

    Manchmal gehts drei oder viermal, dann plötzlich einmal nicht dann gehts wieder villeicht fünf mal und einmal dann wieder nicht. Komm einfach nicht dahinter wo das Problem ist. Hab auch mal zum Testen alle @error Meldungen ausgegeben und auch überall mal sleep rein gepackt aber auch ohne großen Erfolg.
    Gleiche Problem ist auch wenn in SQLite raus lasse und z.b. MsgBox oder Listfeld rein mache.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Meinst du also das ich so machen soll, das Client auf eine Bestätigung wartet das die Daten richtig beim Server angekommen sind und wenn diese nicht in einer Zeit von x kommt er die Daten nochmals sendet?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • nein umgekehrt, der server soll es überprüfen ob es richtig angekommen ist, du hast da ja $recv = TCPRecv($ConnectedSocket, 100) nachdem machste meine if rein und all das was gemacht werden soll wenn was übertragen worden ist, muss in die if ;)

  • Ja gut das klar, aber ich muss ja dann dem Client irgendwie mitteilen das die Daten nicht angekommen sind sonst sendet er diese ja nicht noch einmal.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    Einmal editiert, zuletzt von chip (15. Juni 2009 um 14:44)

  • dann amchs so wie bei nem ftp

    z.B. ein NOOP sieht so aus

    Spoiler anzeigen
    Code
    [14:53:05] NOOP
    [14:53:05] 200 NOOP command successful

    sprich der client schickt es solange bis der server zum client ok sagt.

  • Ja so hatte ich das oben gemeint gehabt. Hat das bisschen verwirrt geschrieben gehabt. Danke für die Hilfe :).

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • np wenn wieder was ist einfach posten ^^

    EDIT 1:

    nochn kleiner tipp, ändere

    [autoit]

    $recv = TCPRecv($ConnectedSocket, 100)

    [/autoit]


    zu

    [autoit]

    $recv = TCPRecv($ConnectedSocket, 2048)

    [/autoit]

    mfg

    Einmal editiert, zuletzt von K1773R (15. Juni 2009 um 15:37)