TCP Verbindung nur einmal möglich

  • Hi,

    hab etwas an meinem Script geändert und nun ist es nur noch möglich einmal sich von Client zu Verbinden. Hier mal Anleitung zu Fehlerreproduktion, webei es egal ist ob Client und Server auf dem selben Rechner laufen oder nicht. Man muss nur im Client die IP anspassen:

    1. Server starten
    2. Client starten wobei hier die Verbindung noch geht, die Daten übertragen werden und der Client wieder geschlossen wird.
    3. Client erneut starten, Socketverbindung wird garnicht erst aufgebaut


    Server:

    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('datenbank.db')

    [/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[50] NULL," & _
    "[kategorie] INTEGER NULL)"
    If _SQLite_Exec ( -1, $strCREATE ) <> $SQLITE_OK Then

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

    EndIf

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

    $strCREATE = _
    "CREATE TABLE [Zuweisenrechner] (" & _
    "[id] INTEGER PRIMARY KEY NOT NULL," & _
    "[programmname] VARCHAR[50] NULL," & _
    "[rechnername] VARCHAR[50] NULL)"
    If _SQLite_Exec ( -1, $strCREATE ) <> $SQLITE_OK Then

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

    EndIf

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

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

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

    EndIf

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

    _SQLite_Close()
    _SQLite_Shutdown ()

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

    TCPStartup()
    While 1

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

    $MainSocket = TCPListen(@IPAddress1, 33891, 100 )

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

    while 1
    $ConnectedSocket = TCPAccept($MainSocket)
    If $ConnectedSocket <> -1 Then ExitLoop
    Sleep(100)
    WEnd

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

    TCPSend($ConnectedSocket,"1")

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

    Do
    $recv = TCPRecv($ConnectedSocket, 2048)
    Sleep(100)
    Until $recv <> ""

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

    _SQLite_Startup ()
    _SQLite_Open('H:\Packages\ProgrammeAutoit\datenbank.db')

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

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

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

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

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

    $anzahl = Ubound($hZeile)

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

    If $anzahl < 2 Then
    _SQLite_Exec(-1,"INSERT INTO Rechner (id, ip, mac, name, kategorie) VALUES (NULL, '"& $empfang[1] & "', '" & $empfang[2] & "', '" & $empfang[3] & "', 'keine')")
    Else

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

    EndIf

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

    _SQLite_Close()
    _SQLite_Shutdown ()

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

    WEnd
    TCPShutdown()

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

    _SQLite_Close()
    _SQLite_Shutdown ()

    [/autoit]

    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.108.32"
    $Port = 33891

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

    TCPStartUp()
    $ConnectedSocket = TCPConnect($Empfaenger_IP, $Port)
    Do
    $recv = TCPRecv($ConnectedSocket, 2048)
    Sleep(100)
    Until $recv <> ""
    TCPSend($ConnectedSocket, $text)
    Sleep(2000)

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

    TCPShutdown ()

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

    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 (5. August 2009 um 12:36)

  • Hallo,
    das kommt daher, weil dein Server in der schleife mehrfach versucht , eine Socketverbindung zu einer IP herzustellen

    Spoiler anzeigen
    [autoit]

    _SQLite_Close()
    _SQLite_Shutdown ()

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

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

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

    While 1
    while 1
    $ConnectedSocket = TCPAccept($MainSocket)
    msgbox(0,"Server empfängt",$ConnectedSocket,1)
    If $ConnectedSocket <> -1 Then ExitLoop
    Sleep(100)
    WEnd

    [/autoit]


    ciao
    Andy

  • Oh man vielen vielen dank, hab da schon Stunden gesucht gehabt.

    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.