Client/Server-Problem mit TPC: Nachricht wird nicht empfangen

  • Server
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=Y:\Documents\Bilder\appicon.ico
    #AutoIt3Wrapper_outfile=pom_server.exe
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <GUIConstantsEx.au3>
    #include <ListviewConstants.au3>
    #include <GUIListView.au3>
    #include <SQLite.au3>
    #include <SQLite.dll.au3>

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

    Local $hQuery, $aRow, $user_array[4][2], $login_error

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

    $ip = IniRead(@ScriptDir & "\pom_server.ini", "Settings", "IP", @IPAddress1)
    $port = IniRead(@ScriptDir & "\pom_server.ini", "Settings", "Port", "65432")
    $s_version = IniRead(@ScriptDir & "\pom_server.ini", "Settings", "Version", "not available")

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

    TCPStartup()
    $pomSocket = TCPListen($ip, $port)
    If @error Then
    MsgBox(0, "", "Socket-Fehler")
    EndIf

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

    GUICreate("POM - Server (" & $ip & ")", 450, 300)
    GUICtrlCreateTab(0, 0, 450, 300)
    GUICtrlCreateTabItem("Übersicht")
    GUICtrlCreateGroup("Users", 10, 25, 300, 140)
    GUICtrlCreateLabel("User 1: ", 15, 40)
    $user1 = GUICtrlCreateLabel("---", 50, 40, 200)
    GUICtrlCreateLabel("User 2: ", 15, 70)
    $user2 = GUICtrlCreateLabel("---", 50, 70, 200)
    GUICtrlCreateLabel("User 3: ", 15, 100)
    $user3 = GUICtrlCreateLabel("---", 50, 100, 200)
    GUICtrlCreateLabel("User 4: ", 15, 130)
    $user4 = GUICtrlCreateLabel("---", 50, 130, 200)

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

    GUICtrlCreateGroup("Server", 10, 180, 430, 110)
    GUICtrlCreateLabel("Version: " & $s_version, 15, 195)
    GUICtrlCreateLabel("Oblivion: not started", 15, 215)
    $reg_label = GUICtrlCreateLabel("", 15, 235, 150, 25)

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

    GUICtrlCreateLabel("IP: " & $ip, 180, 195)
    GUICtrlCreateLabel("Port: " & $port, 180, 215)

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

    GUICtrlCreateTabItem("Datenbank")
    $user_list = GUICtrlCreateListView("User|Password|Activated", 0, 20, 448, 250, -1, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES))
    $new_user = GUICtrlCreateInput("New user", 15, 275, 100, 22)
    $new_pass = GUICtrlCreateInput("New users password", 125, 275, 110, 22)
    $new_activated = GUICtrlCreateCheckbox("Activated", 250, 275)
    $new_insert = GUICtrlCreateButton("Insert", 320, 272, 50)

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

    $user_list_contextmenu = GUICtrlCreateContextMenu($user_list)
    $user_list_contextmenu1 = GUICtrlCreateMenuItem("Activate user", $user_list_contextmenu)
    $user_list_contextmenu2 = GUICtrlCreateMenuItem("Deactivate user", $user_list_contextmenu)

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

    GUICtrlCreateTabItem("Settings")
    GUICtrlCreateLabel("Welcome-Message", 5, 60)
    $s_welcome = GUICtrlCreateEdit(IniRead(@ScriptDir & "\pom_server.ini", "Settings", "Welcome", "Welcome to " & $ip), 100, 25, 345, 100)
    GUICtrlCreateLabel("Server-IP", 10, 160)
    $s_ip = GUICtrlCreateInput($ip, 60, 158, 100)
    GUICtrlCreateLabel("Port", 10, 185)
    $s_port = GUICtrlCreateInput($port, 60, 183, 100)
    $s_user_reg_checkbox = GUICtrlCreateCheckbox("Registration opened", 10, 205)
    $s_save_settings = GUICtrlCreateButton("Save settings", 370, 272)

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

    GUICtrlCreateTabItem("Log")
    $log = GUICtrlCreateEdit(@HOUR & ":" & @MIN & ":" & @SEC & " - " & @MDAY & "." & @MON & "." & @YEAR & ": Server started", 0, 20, 450, 280)

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

    $reg = IniRead(@ScriptDir & "\pom_server.ini", "Settings", "Reg_Open", 0)
    If $reg = 0 Then
    GUICtrlSetState($s_user_reg_checkbox, $GUI_UNCHECKED)
    GUICtrlSetData($reg_label, "Registration opened: no")
    Else
    GUICtrlSetState($s_user_reg_checkbox, $GUI_CHECKED)
    GUICtrlSetData($reg_label, "Registration opened: yes")
    EndIf

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

    lese_db()

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

    GUISetState(@SW_SHOW)

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

    While 1
    $msg = GUIGetMsg()

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

    If $msg = $GUI_EVENT_CLOSE Then
    TCPCloseSocket($verbindung)
    TCPShutdown()
    Exit
    ElseIf $msg = $new_insert Then
    user_eintragen()
    ElseIf $msg = $user_list_contextmenu1 Then
    setze_userstatus(1)
    ElseIf $msg = $user_list_contextmenu2 Then
    setze_userstatus(0)
    ElseIf $msg = $s_save_settings Then
    save_settings()
    EndIf

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

    $verbindung = TCPAccept($pomSocket)
    $recv = TCPRecv($verbindung, 2048)

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

    If $verbindung <> -1 Then
    If $recv <> "" Then
    If StringInStr($recv, "login") Then
    login($recv)
    ElseIf StringInStr($recv, "logout") Then
    MsgBox(0, "USER", "loged out")
    EndIf
    EndIf
    EndIf
    WEnd

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

    Func login($recv)
    $data = StringSplit($recv, "???", 1)
    $ret = suche_user($data[2], $data[3])
    If $ret = 0 Then
    GUICtrlSetData($log, GUICtrlRead($log) & @CRLF & @HOUR & ":" & @MIN & ":" & @SEC & " - " & @MDAY & "." & @MON & "." & @YEAR & ": Connection closed - User " & $data[2] & " does not exist or the password is incorrect.")
    TCPSend($verbindung, "login=error=reason=udne") ;udne = user does not exists
    ElseIf $ret = 2 Then
    GUICtrlSetData($log, GUICtrlRead($log) & @CRLF & @HOUR & ":" & @MIN & ":" & @SEC & " - " & @MDAY & "." & @MON & "." & @YEAR & ": Connection closed - User " & $data[2] & " is not activated.")
    TCPSend($verbindung, "login=error=reason=una") ;una = user not active
    Else
    $login_error = 0
    For $i = 0 To 3
    If $user_array[$i][0] = "" Then
    $user_array[$i][0] = $data[2]
    $user_array[$i][1] = $verbindung
    TCPSend($verbindung, "login=OK???welcome=" & GUICtrlRead($s_welcome))
    If @error Then
    GUICtrlSetData($log, GUICtrlRead($log) & @CRLF & @HOUR & ":" & @MIN & ":" & @SEC & " - " & @MDAY & "." & @MON & "." & @YEAR & ": Was not able to send the welcome-message to user " & $data[2] & ".")
    EndIf
    GUICtrlSetData($log, GUICtrlRead($log) & @CRLF & @HOUR & ":" & @MIN & ":" & @SEC & " - " & @MDAY & "." & @MON & "." & @YEAR & ": Connection allowed - User " & $data[2] & " is now loged in.")
    If $i = 0 Then
    GUICtrlSetData($user1, $data[2] & " " & $user_array[0][1])
    ElseIf $i = 1 Then
    GUICtrlSetData($user2, $data[2])
    ElseIf $i = 2 Then
    GUICtrlSetData($user3, $data[2])
    ElseIf $i = 3 Then
    GUICtrlSetData($user4, $data[2])
    EndIf
    ExitLoop
    Else
    If $user_array[$i][0] = $data[2] Then
    TCPSend($verbindung, "login=error=reason=logedin") ;udne = user does not exists
    GUICtrlSetData($log, GUICtrlRead($log) & @CRLF & @HOUR & ":" & @MIN & ":" & @SEC & " - " & @MDAY & "." & @MON & "." & @YEAR & ": Connection closed - User " & $data[2] & " is already loged in.")
    ExitLoop
    EndIf
    $login_error = $login_error +1
    EndIf
    Next
    If $login_error = 4 Then
    TCPSend($verbindung, "login=error=reason=maxuser") ;udne = user does not exists
    GUICtrlSetData($log, GUICtrlRead($log) & @CRLF & @HOUR & ":" & @MIN & ":" & @SEC & " - " & @MDAY & "." & @MON & "." & @YEAR & ": Connection closed - Server is full.")
    EndIf
    EndIf
    EndFunc

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

    Func suche_user($user, $pass)
    $sSQliteDll = _SQLite_Startup ()
    $hwnd = _SQLite_Open (@ScriptDir & "\pom_users.db") ; open Database
    _SQlite_Query (-1, "SELECT Pass,Activated FROM Users WHERE Name='" & $user & "';", $hQuery) ; the query
    While _SQLite_FetchData ($hQuery, $aRow) = $SQLITE_OK
    _SQLite_QueryFinalize($hQuery)
    If $aRow[0] = $pass Then
    If $aRow[1] = 1 Then ;Account ist aktiviert
    _SQLite_Close($hwnd)
    Return 1;
    Else
    _SQLite_Close($hwnd)
    Return 2;
    EndIf
    Else
    _SQLite_Close($hwnd)
    Return 0;
    EndIf
    WEnd
    EndFunc

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

    Func user_eintragen()
    MsgBox(0, "", "1")
    If GUICtrlRead($new_activated) = $GUI_CHECKED Then
    $activated = 1
    Else
    $activated = 0
    EndIf
    MsgBox(0, "", $activated)
    $sSQliteDll = _SQLite_Startup ()
    $hwnd = _SQLite_Open (@ScriptDir & "\pom_users.db") ; open Database
    If @error Then
    MsgBox(0, "Datenbank-Fehler", @extended)
    EndIf
    If Not _SQLite_Exec (-1, "INSERT INTO Users(Name,Pass,Activated) VALUES ('" & GUICtrlRead($new_user) & "','" & GUICtrlRead($new_pass) & "','" & $activated & "');") = $SQLITE_OK Then
    _SQLite_Exec (-1, "CREATE TABLE Users(Name,Pass,Activated);")
    _SQLite_Exec (-1, "INSERT INTO Users(Name,Pass,Activated) VALUES ('" & GUICtrlRead($new_user) & "','" & GUICtrlRead($new_pass) & "','" & $activated & "');")
    EndIf
    _SQLite_Close($hwnd)
    lese_db() ;liest DB erneut ein
    EndFunc

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

    Func lese_db()
    _GUICtrlListView_DeleteAllItems($user_list)
    $sSQliteDll = _SQLite_Startup ()
    $hwnd = _SQLite_Open (@ScriptDir & "\pom_users.db") ; open Database
    _SQlite_Query (-1, "SELECT * FROM Users;", $hQuery) ; the query
    While _SQLite_FetchData ($hQuery, $aRow) = $SQLITE_OK
    GUICtrlCreateListViewItem($aRow[0] & "|" & $aRow[1] & "|" & $aRow[2], $user_list)
    WEnd
    _SQLite_Close($hwnd)
    EndFunc

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

    Func setze_userstatus($value)
    For $i = 0 To _GUICtrlListView_GetItemCount($user_list)
    If _GUICtrlListView_GetItemSelected($user_list, $i) Then
    $user = _GUICtrlListView_GetItemText($user_list, $i)
    $pass = _GUICtrlListView_GetItemText($user_list, $i, 1)
    $sSQliteDll = _SQLite_Startup ()
    $hwnd = _SQLite_Open (@ScriptDir & "\pom_users.db") ; open Database
    If @error Then
    MsgBox(0, "Datenbank-Fehler", @extended)
    Else
    _SQLite_Exec (-1, "UPDATE Users SET Activated='" & $value & "' WHERE Name='" & $user & "' AND Pass='" & $pass & "';")
    EndIf
    _SQLite_Close($hwnd)
    lese_db() ;liest DB erneut ein
    EndIf
    Next
    EndFunc

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

    Func save_settings()
    IniWrite(@ScriptDir & "\pom_server.ini", "Settings", "Welcome", GUICtrlRead($s_welcome))
    IniWrite(@ScriptDir & "\pom_server.ini", "Settings", "IP", GUICtrlRead($s_ip))
    IniWrite(@ScriptDir & "\pom_server.ini", "Settings", "Port", GUICtrlRead($s_port))

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

    If GUICtrlRead($s_user_reg_checkbox) = $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\pom_server.ini", "Settings", "Reg_Open", "1")
    Else
    IniWrite(@ScriptDir & "\pom_server.ini", "Settings", "Reg_Open", "0")
    EndIf

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

    MsgBox(64, "Important", "The settings take effect after restart of the server!" & @CRLF & "Please restart it as soon as possible!")
    EndFunc

    [/autoit]
    Client
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=Y:\Documents\Bilder\appicon.ico
    #AutoIt3Wrapper_outfile=pom_client.exe
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    #include <GUIConstants.au3>

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

    Global $ip = @IPAddress1, $socket, $sip, $sport

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

    TCPStartup()

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

    GUICreate("POM - Client (" & @IPAddress1 & ")", 450, 300)
    $welcome_message = GUICtrlCreateLabel("", 10, 10, 430, 100)

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

    $l_user = GUICtrlCreateLabel("User", 125, 85)
    $user = GUICtrlCreateInput("", 175, 80, 100)
    $l_pass = GUICtrlCreateLabel("Password", 125, 115)
    $pass = GUICtrlCreateInput("", 175, 110, 100)
    $l_sip = GUICtrlCreateLabel("Server-IP", 125, 145)
    $sip = GUICtrlCreateInput("", 175, 140, 100)
    $l_sport = GUICtrlCreateLabel("Port", 125, 175)
    $sport = GUICtrlCreateInput("", 175, 170, 100)

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

    $login = GUICtrlCreateButton("Login", 340, 270, 100)

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

    GUISetState(@SW_SHOW)

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

    While 1
    $msg = GUIGetMsg()

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

    If $msg = $GUI_EVENT_CLOSE Then
    TCPCloseSocket($socket)
    TCPShutdown()
    Exit
    ElseIf $msg = $login And GUICtrlRead($login) = "Login" Then
    $socket = TCPConnect(GUICtrlRead($sip), GUICtrlRead($sport))
    If $socket = -1 Then
    MsgBox(0, "", "Fehler beim Verbinden!")
    TCPCloseSocket($socket)
    TCPShutdown()
    Exit
    Else
    TCPSend($socket, "login???" & GUICtrlRead($user) & "???" & GUICtrlRead($pass))
    If @error Then
    MsgBox(0, "", "Fehler")
    EndIf
    EndIf
    ElseIf $msg = $login And GUICtrlRead($login) = "Logout" Then
    GUICtrlSetState($l_user, $GUI_SHOW)
    GUICtrlSetState($l_pass, $GUI_SHOW)
    GUICtrlSetState($l_sip, $GUI_SHOW)
    GUICtrlSetState($l_sport, $GUI_SHOW)
    GUICtrlSetState($user, $GUI_SHOW)
    GUICtrlSetState($pass, $GUI_SHOW)
    GUICtrlSetState($sip, $GUI_SHOW)
    GUICtrlSetState($sport, $GUI_SHOW)
    GUICtrlSetState($welcome_message, $GUI_HIDE)
    GUICtrlSetData($login, "Login")
    TCPSend($socket, "logout")
    If @error Then
    MsgBox(0, "Error", "Was not able to send logout!")
    EndIf
    EndIf

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

    $recv = TCPRecv($socket, 2048)
    If $recv <> "" Then
    If StringInStr($recv, "login=OK") Then
    GUICtrlSetState($l_user, $GUI_HIDE)
    GUICtrlSetState($l_pass, $GUI_HIDE)
    GUICtrlSetState($l_sip, $GUI_HIDE)
    GUICtrlSetState($l_sport, $GUI_HIDE)
    GUICtrlSetState($user, $GUI_HIDE)
    GUICtrlSetState($pass, $GUI_HIDE)
    GUICtrlSetState($sip, $GUI_HIDE)
    GUICtrlSetState($sport, $GUI_HIDE)
    GUICtrlSetData($login, "Logout")
    $welcome = StringSplit($recv, "???welcome=", 1)
    GUICtrlSetData($welcome_message, $welcome[2])
    ElseIf $recv = "login=error=reason=udne" Then
    MsgBox(48, "Error", "User or password are not correct or the user does not exist on that server!")
    ElseIf $recv = "login=error=reason=una" Then
    MsgBox(48, "Error", "User is not activated. Please contact the server administration!")
    ElseIf $recv = "login=error=reason=logedin" Then
    MsgBox(48, "Error", "You are already loged in!")
    ElseIf $recv = "login=error=reason=maxuser" Then
    MsgBox(48, "Error", "This server is full. Please try another or try it later again.")
    EndIf
    EndIf
    WEnd

    [/autoit]

    Nun zum Problem:
    Wenn im Client der Button $login mit "Logout" beschriftet ist, sollen ein Label verschwinden, mehrere Controls sollen auftauchen, der Button soll die Beschriftung "Login" bekommen und die Nachricht "logout" senden.
    Angeblich passiert das alles. Zumindest die Control-Änderungen geschehen (kann ich ja sehen) und die Nachricht wird angeblich gesendet - zumindest erhalte ich beim Client keine Fehlermeldung.

    Allerdings reagiert der Server nicht darauf (Zeile 106 ff.). Jetzt stellt sich mir die Frage, liegt es an meinem Server oder am Clienten?
    Dazu muss ich sagen, dass ich mir die TPC-Sachen anhand verschiedener Tutorials zusammenbauen musste, bis es funktionierte - abgesehen vom Logout, der funktioniert halt nicht.

    Des Weiteren stellt sich mir die Frage, wie ich Nachrichten von mehreren Usern unterscheide. Geht das dann über die SocketID? Ich will ja nachher nicht im Log stehen haben, dass User a sich abgemeldet hat, obwohl es User b war.

    Mit freundlichen Grüßen,
    _DICE_

  • Schau dir in der Hilfe das Beispiel zu TCPRecv und TCPSend an, da hast du ein voll funktionierendes Client-Server-Beispiel. Dann wirst du auch merken, dasas du bei TCPAccept nicht wartest bis eine Verbindung da ist.

    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.