Server
#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>
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")
TCPStartup()
$pomSocket = TCPListen($ip, $port)
If @error Then
MsgBox(0, "", "Socket-Fehler")
EndIf
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)
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)
GUICtrlCreateLabel("IP: " & $ip, 180, 195)
GUICtrlCreateLabel("Port: " & $port, 180, 215)
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)
$user_list_contextmenu = GUICtrlCreateContextMenu($user_list)
$user_list_contextmenu1 = GUICtrlCreateMenuItem("Activate user", $user_list_contextmenu)
$user_list_contextmenu2 = GUICtrlCreateMenuItem("Deactivate user", $user_list_contextmenu)
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)
GUICtrlCreateTabItem("Log")
$log = GUICtrlCreateEdit(@HOUR & ":" & @MIN & ":" & @SEC & " - " & @MDAY & "." & @MON & "." & @YEAR & ": Server started", 0, 20, 450, 280)
$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
lese_db()
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]While 1
$msg = GUIGetMsg()
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
$verbindung = TCPAccept($pomSocket)
$recv = TCPRecv($verbindung, 2048)
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
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
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
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
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
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
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))
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
MsgBox(64, "Important", "The settings take effect after restart of the server!" & @CRLF & "Please restart it as soon as possible!")
EndFunc
Client
#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 ****
#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)
$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)
$login = GUICtrlCreateButton("Login", 340, 270, 100)
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]While 1
$msg = GUIGetMsg()
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
$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
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_