IM

  • Hi @all
    ich hab zum Spaß mal angefangen einen IM(Instant Messenger) zu schreiben. Er funktioniert nur nicht wirklich und ich hab auch keine Ahnung was falsch läuft und es jetzt nach ~10Stunden Fehlersuche aufgegeben... :thumbdown:
    Vielleicht hat einer von euch ja Spaß dran ihn mal auseinander zunehmen.
    Server:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <inet.au3>

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

    Opt("TrayMenuMode",1)
    $Mainwindow = GUICreate("Server", @DesktopWidth /100*25, @DesktopHeight/100*15, -1, -1, BitOR($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX), $WS_EX_ACCEPTFILES) ;, $WS_VSCROLL
    GUISetState(@sw_Hide)
    $Liste = GUICtrlCreateListView("Benutzername | IP-Adresse | ON/Offline | Letzter Login | E-Mail Adresse", 10, 10, @DesktopWidth /100*25-10, @DesktopHeight/100*15-10)
    $WanIp = _GetIP()
    $User = 1
    $MIP = @IPAddress1
    TraySetIcon("Shell32.dll", -19)
    $IPanfordern = TrayCreateMenu("IP?")
    $Ipextern = TrayCreateItem($WanIP, $IPanfordern)
    $IPintern1 = TrayCreateItem(@ipaddress1, $IPanfordern)
    $IPintern2 = TrayCreateItem(@IPAddress2, $IPanfordern)
    $IPintern3 = TrayCreateItem(@IPAddress3, $IPanfordern)
    $SERVERSTAT = TrayCreateItem("Serverstatistik")
    $SSHUTDOWN = TrayCreateItem("Server beenden")

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

    Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet
    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")
    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
    "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
    $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
    If Not @error Then $aRet = $aRet[0]
    Else
    $aRet = 0
    EndIf
    $sockaddr = 0
    Return $aRet
    EndFunc

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

    TCPStartup()
    $MSocket = TCPListen($MIP, 6221, 9999)
    If @error = -1 Then
    MsgBox(0, "Error", "Folgender Fehler ist aufgetreten:" & @error)
    Else
    MsgBox(64, "Server", "Server gestartet :)")
    EndIf

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

    While 1
    ;~ $Start = TimerInit()
    $GUIMsg = GUIGetMsg()
    $SMsg = TCPAccept($Msocket)
    $eingehendeIP = SockettoIP($SMsg)
    ;~ If TimerDiff($start) >= 60000 Then
    ;~ TrayTip("$SMSG", $SMSG,10)
    If $SMsg <> -1 Then
    $check = 0
    While $Check = 0
    $Msg = TCPRecv($SMsg, 9999)
    If $Msg <> "" Then
    $eingehendeIP = SockettoIP($SMsg)
    $Neu = StringLeft($MSG, 8)
    If $Neu = "$ACCNEU|" Then
    $ACCDAten = StringSplit($MSG, "|")
    IniReadSection(@scriptdir & "\Benutzer.ini", $ACCDATEN[2])
    If @error = 1 Then
    TCPStartup()
    IniWrite(@scriptdir & "\Benutzer.ini", $ACCDATEN[2], "Passwort", $ACCDATEN[4])
    IniWrite(@scriptdir & "\Benutzer.ini", $ACCDATEN[2], "E-Mail Adresse", $ACCDATEN[6])
    IniWrite(@scriptdir & "\Benutzer.ini", $ACCDATEN[2], "IP", $eingehendeIP)
    IniWrite(@scriptdir & "\Benutzer.ini", $ACCDATEN[2], "LoginZeit", "Noch nicht eingeloggt")
    IniWrite(@scriptdir & "\Benutzer.ini", $ACCDATEN[2], "On", "Neu")
    $Antwort = TCPConnect($EingehendeIP, 6221)
    TCPSend($Antwort, "Benutzer erfolgreich erstellt.")
    TrayTip("Neuer Benutzer:", $ACCDATEN[2], 10, 1)
    Else
    TCPStartup()
    $Antwort = TCPConnect($EingehendeIP, 6221)
    $send = TCPSend($Antwort, "Benutzername nicht verfügbar!")
    EndIf
    $Check = 1
    EndIf

    If $MSg = "Verbindemich" Then
    TCPStartup()
    $Antwort = TCPConnect($EingehendeIP, 6221)
    TCPSend($Antwort, "Erfolgreich verbunden :)")
    TrayTip("Neue Verbindung mit:", $eingehendeIP, 10, 1)
    $check = 1
    EndIf

    If $Neu = "Benutzer" Then
    $Anmeldung = StringSplit($MSG, ":")
    IniReadSection(@scriptdir & "\Benutzer.ini", $Anmeldung[2])
    If @error = 1 Then
    TCPStartup()
    $Antwort = TCPConnect($EingehendeIP, 6221)
    $send = TCPSend($Antwort, "Benutzername nicht nicht registriert!")
    $check = 1
    Else
    $PWCHECK = IniReadSection(@scriptdir & "\Benutzer.ini", $Anmeldung[2])
    If $PWCHECK[1][1] = $Anmeldung[4] Then
    IniWrite(@scriptdir & "\Benutzer.ini", $Anmeldung[2], "IP", $EingehendeIP)
    $zeit = @YEAR &"."& @MON &"."& @WDAY &" "& @HOUR & ":"&@MIN & ":"& @SEC &"."& @MSEC
    IniWrite(@scriptdir & "\Benutzer.ini", $Anmeldung[2], "LoginZeit", $zeit)
    IniWrite(@scriptdir & "\Benutzer.ini", $Anmeldung[2], "ON", "On")
    TCPStartup()
    $Antwort = TCPConnect($EingehendeIP, 6221)
    $send = TCPSend($Antwort, "Erfolgreich eingeloggt ;)")
    TrayTip("Benutzer hat sich eingeloggt:", $Anmeldung[2], 10, 1)
    $check = 1
    Else
    TCPStartup()
    $Antwort = TCPConnect($EingehendeIP, 6221)
    $send = TCPSend($Antwort, "Falsches Passwort!")
    TrayTip("Falsches Passwort von:", $Anmeldung[2] & " @ IP" & $EingehendeIP, 10, 2)
    EndIf
    $Check = 1
    EndIf
    EndIf
    If $Neu = "binwech8" Then
    $Abmeldung = StringSplit($MSG, ":")
    IniWrite(@scriptdir & "\Benutzer.ini", $Abmeldung[1], "ON", "OFF")
    TrayTip("User hat sich abgemeldet:", $abmeldung[1], 10, 1)
    $check = 1
    EndIf
    EndIf
    WEnd
    EndIf


    $TrayMSG = TrayGetMsg()
    If $TrayMsg = $Ipextern Then
    ClipPut($WanIP)
    EndIf
    If $TrayMsg = $Ipintern1 Then
    ClipPut(@ipaddress1)
    EndIf
    If $TrayMsg = $Ipintern2 Then
    ClipPut(@IPAddress2)
    EndIf
    If $TrayMsg = $Ipintern3 Then
    ClipPut(@ipaddress3)
    EndIf
    If $TrayMSG = $SShutdown Then
    $MSGBOXANTWORT = MsgBox(4, "Sicher beenden?", "Den Server wirklich beenden? Alle Verbindungen werden getrennt!")
    If $MSGBOXANTWORT = 6 Then
    Exit
    Else

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

    EndIf
    EndIf
    If $TrayMSG = $SERVERSTAT Then
    $ininutzer = IniReadSectionNames(@ScriptDir & "\Benutzer.ini")
    If @error Then
    MsgBox(0, "Fehler", "Es besteht noch keine Benutzerdatei!")
    ExitLoop
    EndIf
    $Listtext = GUICtrlCreateListViewItem("", $Liste)
    GUICtrlSetData($Listtext, "")
    For $i = 1 To $ininutzer[0]
    $ininutzerdaten = IniReadSection(@ScriptDir & "\Benutzer.ini", $ininutzer[$i])
    $Listviewtext = $ininutzer[$i] &"|"& $ininutzerdaten[$i-$i+3][1] &"|"& $ininutzerdaten[$i-$i+5][1] &"|"& $ininutzerdaten[$i-$i+4][1] &"|"& $ininutzerdaten[$i-$i+2][1]
    $Listtext = GUICtrlCreateListViewItem($listviewtext, $Liste)
    GUICtrlSetData($Listtext,$ininutzer[$i])
    GUISetState(@sw_show, $mainwindow)
    WinActivate("Server")
    Next
    EndIf
    If $GUImsg = $GUI_EVENT_CLOSE Then
    GUISetState(@sw_hide, $mainwindow)
    EndIf
    WEnd

    [/autoit]


    Client:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <ButtonConstants.au3>
    #include <StaticConstants.au3>
    #include <ListboxConstants.au3>
    #include <TabConstants.au3>
    #include <Constants.au3>

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

    TraySetIcon("Shell32.dll", -14)
    Opt("TrayMenuMode",1)
    $GuiL = 600
    $GUIH = 500
    $GuiCLient = GUICreate("Client", $GuiL, $GUiH, -1, -1, BitOR($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX))
    GUISetState(@SW_Show)
    $Name = GUICtrlCreateInput("Accountname", $GUIL-110, $GUIH-100, 100, 20)
    $PW = GUICtrlCreateInput("Passwort", $GUIL-110, $GUIH-75, 100, 20, $ES_PASSWORD)
    $Einloggen = GUICtrlCreateButton("Einloggen", $GUIL-110, $GUIH-50, 100, 20)
    $Anmelden = GUICtrlCreateButton("Anmelden", $GUIL-110, $GUIH-125, 100, 20)
    $EIP = GUICtrlCreateInput("Server IP", $GUIL-110, $GUIH-200, 100, 20)
    $Verbinden = GUICtrlCreateButton("Verbinden", $GUIL-110, $GUIH-175, 100, 20)
    $bild = GUICtrlCreatePic(@ScriptDir & "\nemo-popup.jpg" , 0, 0, $GuiL, $GuiH, BitOR($SS_NOTIFY,$WS_GROUP,$WS_CLIPSIBLINGS,$Ws_Disabled))
    $Ausloggen = GUICtrlCreateButton("Ausloggen", $GUIL-110, $GUIH-50, 100, 20)
    GUICtrlSetState($Ausloggen, $GUI_Hide)
    $Eingabe = GUICtrlCreateEdit("", $GuiL-590, $GuiH-100, 400, 50, $LBS_DISABLENOSCROLL + $WS_VSCROLL)
    GUICtrlSetState($Eingabe, $GUI_Hide)
    $NAbschicken = GUICtrlCreateButton("Abschicken", $GUIL-185, $Guih-100, 70, 50)
    GUICtrlSetState($Nabschicken, $GUI_Hide)
    $MIP = @IPAddress1
    $verbunden = 0
    $Eingeloggt = 0
    $Chatfenster = GUICtrlCreateTab(10, 10, 400, 350)
    $1 = GUICtrlCreateTabItem("1")
    $2 = GUICtrlCreateTabItem("2")
    $3s = GUICtrlCreateTabItem("3")
    GUICtrlSetState($Chatfenster, $GUI_Hide)
    $Beenden = TrayCreateItem("Exit")
    $Maximieren = TrayCreateItem("Client")
    $Liste1 = GUiCTRLCReatelist("Liste", $Guil-180, $GUIH-468, 165, 331)
    GUICtrlSetState($Liste1, $GUI_hide)

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

    ;~ HotKeySet("{Enter}", "_Abschicken")
    ;~ Func _Abschicken()
    ;~ If GUICtrlGetHandle($NAbschicken) Then
    ;~
    ;~ MsgBox(0, "Abgeschickt", GUICtrlRead($Eingabe))
    ;~ EndIf
    ;~ EndFunc

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

    while 1
    $GuiMsg = GUIGetMsg()
    Select
    Case $GuiMsg = $GUI_EVENT_CLOSE
    GUISetState(@sw_hide, $GuiClient)
    Case $GUIMSG = $Anmelden
    If $Verbunden = 0 Then
    MsgBox(0, "Achtung!", "Bitte zuerst mit dem Server verbinden")
    $serverip = InputBox("IP", "Server-IP eingeben:", "", "",250,75)
    $verbunden = 1
    EndIf
    $ACCNEU = InputBox("Benutzername", "Wähle einen Benutzernamen:", @UserName,"",250, 75)
    $PWACCNEU = InputBox("Passwort", "Wähle ein Passwort:", "","",250, 75)
    $ACCNEUEM = InputBox("Email", "Gebe deine E-Mail Adresse ein (freiwillig):", "Keine Angabe","",300, 75)
    TCPStartup()
    $Connect = TCPConnect($serverip, 6221)
    If @error =-1 Then
    MsgBox(48, "FEHLER", "Beim Verbinden mit dem Server ist folgender Fehler aufgetreten:" & @error)
    EndIf
    TCPSend($Connect, "$ACCNEU|" & $ACCNEU & "|$PWACCNEU|" & $PWACCNEU & "|$ACCNEUEMAIL|" & $ACCNEUEM)
    TCPStartup()
    $MSocket = TCPListen($MIP, 6221, 9999)
    If @error = -1 Then
    MsgBox(0, "Error", "Folgender Fehler ist aufgetreten:" & @error)
    EndIf
    $check = 0
    While $check = 0
    $SMsg = TCPAccept($Msocket)
    If $SMsg <> -1 Then
    While $Check = 0
    $Msg = TCPRecv($SMsg, 9999)
    If $Msg <> "" Then
    MsgBox(0, "Account", $MSG)
    $Check = 1
    EndIf
    WEnd
    EndIf
    WEnd

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

    Case $GUIMSG = $Verbinden
    $start = TimerInit()
    $SERVERIP = GUICtrlRead($EIP)
    TCPStartup()
    $Connect = TCPConnect($ServerIp, 6221)
    TCPSend($connect, "Verbindemich")
    TCPStartup()
    $MSocket = TCPListen($MIP, 6221, 9999)
    If @error = -1 Then
    MsgBox(0, "Error", "Folgender Fehler ist aufgetreten:" & @error)
    EndIf
    $check = 0
    While $check = 0
    $SMsg = TCPAccept($Msocket)
    If TimerDiff($start) >=10000 Then
    MsgBox(0, "Timeout", "Server nicht erreichbar. Richtige IP? Server off?")
    ExitLoop
    EndIf
    ;~ If $SMsg <> -1 Then
    While $Check = 0
    $Msg = TCPRecv($SMsg, 9999)
    If $Msg <> "" Then
    MsgBox(0, "Verbinden", $Msg)
    $Check = 1
    $verbunden = 1
    EndIf
    WEnd
    ;~ EndIf
    WEnd
    Case $GUIMSG = $Einloggen
    If $Verbunden = 0 Then
    MsgBox(0, "Achtung!", "Bitte zuerst mit dem Server verbinden")
    $serverip = InputBox("IP", "Server-IP eingeben:", "", "",250,75)
    $verbunden = 1
    EndIf
    If $Verbunden = 1 Then
    $Name1 = GUICtrlRead($Name)
    $PW1 = GUICtrlRead($PW)
    TCPStartup()
    $Connect = TCPConnect($ServerIp, 6221)
    $Daten = "Benutzername:" & $Name1 & ":Passwort:" & $PW1
    TCPSend($Connect, $Daten)
    TCPStartup()
    $MSocket = TCPListen($MIP, 6221, 9999)
    If @error = -1 Then
    MsgBox(0, "Error", "Folgender Fehler ist aufgetreten:" & @error)
    EndIf
    $check = 0
    While $check = 0
    $SMsg = TCPAccept($Msocket)
    ;~ If $SMsg <> -1 Then
    ;~ While $Check = 0
    $Msg = TCPRecv($SMsg, 9999)
    If $Msg <> "" Then
    MsgBox(0, "Einloggen", $MSG)
    If $Msg = "Erfolgreich eingeloggt ;)" Then
    GUICtrlSetState($Name, $GUI_hide)
    GUICtrlSetState($PW, $GUI_hide)
    GUICtrlSetState($Einloggen, $GUI_hide)
    GUICtrlSetState($Anmelden, $GUI_hide)
    GUICtrlSetState($Eip, $GUI_hide)
    GUICtrlSetState($Verbinden, $GUI_hide)
    GUICtrlSetState($Eingabe, $GUI_show)
    GUICtrlSetState($Nabschicken, $GUI_hide)
    GUICtrlSetState($Chatfenster, $GUI_hide)
    GUICtrlSetState($Liste1, $GUI_show)
    GUICtrlSetState($Ausloggen, $GUI_show)
    GUICtrlSetState($Nabschicken, $GUI_show)
    GUICtrlSetState($chatfenster, $GUI_show)
    $Check = 1
    EndIf
    EndIf
    ;~ WEnd
    ;~ EndIf
    WEnd
    EndIf
    Case $GUIMSG = $Ausloggen
    TCPStartup()
    $Connect = TCPConnect($ServerIp, 6221)
    $sended = TCPSend($connect, "binwech8:"$Name1)
    Sleep(1000)
    Exit
    EndSelect
    $TrayMSG = TrayGetMsg()
    If $TrayMSG = $Beenden Then
    Exit
    EndIf
    If $TrayMsg = $Maximieren Then
    GUISetState(@sw_show, $GuiCLient)
    WinActivate("Client")
    EndIf
    WEnd

    [/autoit]


    Viel Spaß
    Aquaplant
    PS: Ist noch nicht fertig - aber warum etwas beenden, dass nicht mal richtig funktioniert :|

  • also ich denke die wenigsten (wenn überhaupt jemand) werden das script durchgehen. vllt hilfts etwas wenn du genauer beschreibst was nicht richtig funktioniert. dann hätte man einen ansatz wo man eventuell suchen muss.

  • Das ist etwas komisch - manchmal klappts, aber meistens nicht ganz. Wenn man sich mit dem Clienten Verbindet, anmeldet, einloggt bekommt man meistens nicht die Msgbox. Auf dem Server wird dennoch das Tray angezeigt (Verbunden mit: [IP] oder Neuer Benutzer: [Name])

  • Könnte es sein, dass da einfach zu viele TCPStartUp´s sind. Da eine Verbindung ja meine ich immer erst geschlossen werden muss oder so.

    Vielleicht hilft es mal ein TCPShutdown einzufügen

    MfG
    Conan (Nur Mitlesend)
    Schon lange dabei

  • Ich hab jetzt die meisten TCPStartups rausgenommen, aber scheint immer noch nicht zu klappen
    EDIT: Neuen Nutzer erstellen klappt, Verbinden und einloggen nicht. Kann es sein das die Traytips sich wie sleep auswirken?

    Einmal editiert, zuletzt von Aquaplant (18. November 2009 um 18:41)

  • Danke, ich schaus mir mal an.
    Könnte man an dieser Stelle im Client:

    [autoit]

    If $split[1] = "Kick" Then
    TCPCloseSocket($server)
    TCPCloseSocket($serverget)
    MsgBox(0, "", "Sie wurden vom Server gekickt!" & @CRLF & "Grund: " & $split[3])
    TCPShutdown()
    Exit

    [/autoit]


    Nicht einfach

    [autoit]

    If $split[1] = "Kick" Then
    MsgBox(0, "", "Sie wurden vom Server gekickt!" & @CRLF & "Grund: " & $split[3])
    TCPShutdown()
    Exit

    [/autoit]

    schreiben?

  • Hab jet mal deinen vorigen Thread zu dem Thema gelesen und falls du das Problem mit dem "gleichzeitig" machen noch immer hast:

    Versuchs doch mal mit AdLibEnable

    Zitat

    AdlibEnable ( "function" [, time] )
    Alle 250 ms (oder Zeit ms) wird die spezifizierte "Funktion" aufgerufen - normalerweise, um auf unerwartete Fehler zu prüfen. Z.B. könnte adlib in einem Script benutzt werden, welches ein unvorhergesehenes Fehler-Fenster öffnet.
    Die adlib Funktion sollte einfach gehalten werden, da sie oft ausgeführt wird und während dieser Zeit das Script pausiert.
    Außerdem sollte vorsichtig mit dem time-Parameter umgegangen werden um unnötige CPU-Last zu vermeiden.

    Ich hatte mal ein Script das alle 50ms prüfte ob ein Fenster aktiv ist UND eine Taste grdrückt wird UND eine andere Bedingung True ist, und die CPU last stieg nie über 1% (E8400 @ 3.4 Ghz)
    ;)

  • Hmm ich glaube es klappt auch so wie es jetzt ist. Hab es aber noch nicht getestet. Es ist jetzt alles übersichtlicher und ich habe Sachen entfernt, die mir überflüssig vorkamen:
    Client:

    Spoiler anzeigen
    [autoit]

    ;== Includes
    ;== Includes
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    ;=================================

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

    TraySetIcon("Shell32.dll", -14)
    Opt("TrayMenuMode",1)

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

    #Region Variabeln
    $GuiL = 600
    $GUIH = 500
    $MIP = @IPAddress1
    $verbunden = 0
    $Eingeloggt = 0
    $Antwort = 0
    #EndRegion Variabeln

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

    #Region GUI 1 ;== Selbsterklärend
    $GuiCLient = GUICreate("Client", $GuiL, $GUiH, -1, -1, BitOR($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX))
    GUISetState(@SW_Show)
    $Name = GUICtrlCreateInput("Accountname", $GUIL-110, $GUIH-100, 100, 20)
    $PW = GUICtrlCreateInput("Passwort", $GUIL-110, $GUIH-75, 100, 20, $ES_PASSWORD)
    $Einloggen = GUICtrlCreateButton("Einloggen", $GUIL-110, $GUIH-50, 100, 20)
    $Anmelden = GUICtrlCreateButton("Anmelden", $GUIL-110, $GUIH-125, 100, 20)
    $EIP = GUICtrlCreateInput("Server IP", $GUIL-110, $GUIH-200, 100, 20)
    $Verbinden = GUICtrlCreateButton("Verbinden", $GUIL-110, $GUIH-175, 100, 20)
    #EndRegion GUI 1

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

    #Region GUI Eingeloggt
    $Ausloggen = GUICtrlCreateButton("Ausloggen", $GUIL-110, $GUIH-50, 100, 20) ;== Auslogbutton
    GUICtrlSetState($Ausloggen, $GUI_Hide)
    $Eingabe = GUICtrlCreateEdit("", $GuiL-590, $GuiH-100, 400, 50, $LBS_DISABLENOSCROLL + $WS_VSCROLL) ;==Chateingabefenster
    GUICtrlSetState($Eingabe, $GUI_Hide)
    $NAbschicken = GUICtrlCreateButton("Abschicken", $GUIL-185, $Guih-100, 70, 50) ;==Nachricht abschicken
    GUICtrlSetState($Nabschicken, $GUI_Hide)
    $Chatfenster = GUICtrlCreateTab(10, 10, 400, 350) ;== Chatfenster 1-3
    $1 = GUICtrlCreateTabItem("1")
    $2 = GUICtrlCreateTabItem("2")
    $3 = GUICtrlCreateTabItem("3")
    GUICtrlSetState($Chatfenster, $GUI_Hide)
    $Beenden = TrayCreateItem("Exit") ;== Tray Exit
    $Maximieren = TrayCreateItem("Client") ;== Tray Fenster wieder aufrufen
    $Liste1 = GUiCTRLCReatelist("Liste", $Guil-180, $GUIH-468, 165, 331) ;== Freundesliste
    GUICtrlSetState($Liste1, $GUI_hide)
    #EndRegion GUI Eingeloggt

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

    While 1
    $GuiMsg = GUIGetMsg()
    $TrayMSG = TrayGetMsg()
    ;======================================== GUI Messeges
    Select
    Case $GuiMsg = $GUI_EVENT_CLOSE ;== Gui verstecken
    GUISetState(@sw_hide, $GuiClient)

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

    Case $GUIMSG = $Anmelden ;== Anmeldung
    If $Verbunden = 0 Then
    MsgBox(0, "Achtung", "Bitte erst mit dem Server verbinden!")
    ElseIf $Verbunden = 1 Then
    $ACCNEU = InputBox("Benutzername", "Wähle einen Benutzernamen:", @UserName,"",250, 75)
    $PWACCNEU = InputBox("Passwort", "Wähle ein Passwort:", "","",250, 75)
    $ACCNEUEM = InputBox("Email", "Gebe deine E-Mail Adresse ein (freiwillig):", "Keine Angabe","",300, 75)
    TCPSend($Connect, "$ACCNEU|" & $ACCNEU & "|$PWACCNEU|" & $PWACCNEU & "|$ACCNEUEMAIL|" & $ACCNEUEM)
    While $Antwort = 0
    $Smsg = TCPAccept($Msocket)
    $Msg = TCPRecv($SMsg, 9999)
    If $Msg <> "" Then
    MsgBox(0, "Account", $Msg)
    $Antwort = 1
    EndIf
    WEnd
    $Antwort = 0
    EndIf

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

    Case $GUIMSG = $Verbinden ;== Verbindung mit dem Server aufbauen
    TCPStartup()
    $start = TimerInit()
    $ServerIP = GUICtrlRead($EIP) ;== ließt die eingegebene IP aus
    $Connect = TCPConnect($ServerIp, 6221)
    TCPSend($connect, "Verbindemich")
    $MSocket = TCPListen($MIP, 6221, 9999)
    While $Antwort = 0
    $Smsg = TCPAccept($Msocket)
    $Msg = TCPRecv($SMsg, 9999)
    If TimerDiff($start) >= 5000 Then
    MsgBox(0, "Timeout", "Server nicht erreichbar. Richtige IP? Server off?")
    ExitLoop
    EndIf
    If $Msg <> "" Then
    MsgBox(0, "Verbinden", $Msg)
    $Antwort = 1
    $Verbunden = 1
    EndIf
    WEnd
    $Antwort = 0

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

    Case $GUIMSG = $Einloggen ;== Als Benutzer einloggen
    If $Verbunden = 0 Then
    MsgBox(0, "Achtung", "Bitte erst mit dem Server verbinden!")
    ElseIf $Verbunden = 1 Then
    $Name1 = GUICtrlRead($Name) ;== liest den Benutzernamen aus
    $PW1 = GUICtrlRead($PW) ;== liest das Passwort aus
    $Daten = "Benutzername:" & $Name1 & ":Passwort:" & $PW1 ;== Speichtert die Daten in einer Variabel
    TCPSend($Connect, $Daten) ;== und sendet sie an den Server
    While $Antwort = 0
    $Smsg = TCPAccept($Msocket)
    $Msg = TCPRecv($SMsg, 9999)
    If $Msg <> "" Then
    MsgBox(0, "Einloggen", $MSG)
    If $Msg = "Erfolgreich eingeloggt ;)" Then
    GUICtrlSetState($Name, $GUI_hide) ;== versteckt die Benutzernameneingabe
    GUICtrlSetState($PW, $GUI_hide) ;== versteckt die Passworteingabe
    GUICtrlSetState($Einloggen, $GUI_hide) ;== versteckt den Einlogbutton
    GUICtrlSetState($Anmelden, $GUI_hide) ;== versteckt den Anmeldebutton
    GUICtrlSetState($Eip, $GUI_hide) ;== versteckt das IP-Eingabefeld
    GUICtrlSetState($Verbinden, $GUI_hide) ;== versteckt den Verbinde-Button
    GUICtrlSetState($Eingabe, $GUI_show) ;== macht die Chateingabe sichtbar
    GUICtrlSetState($Liste1, $GUI_show) ;== macht die Freundesliste sichtbar
    GUICtrlSetState($Ausloggen, $GUI_show) ;== macht den Auslogge-Button sichtbar
    GUICtrlSetState($Nabschicken, $GUI_show) ;== macht den Nachricht abschicken Button sichtbar
    GUICtrlSetState($chatfenster, $GUI_show) ;== macht das Chatfenster sichtbar
    $Antwort = 1
    EndIf
    EndIf
    WEnd
    $Antwort = 0
    EndIf
    Case $GUIMSG = $Ausloggen ;== loggt den User aus und beendet den Clienten
    TCPSend($connect, "binwech8:"$Name1)
    TCPShutdown()
    TCPCloseSocket($MSocket)
    TCPCloseSocket($Connect)
    Exit
    EndSelect
    ;======================================= Tray Messeges
    If $TrayMSG = $Beenden Then ;== Beendet den Clienten
    TCPShutdown()
    TCPCloseSocket($Connect)
    TCPCloseSocket($MSocket)
    Exit
    EndIf
    If $TrayMsg = $Maximieren Then ;== macht den Clienten wieder sichtbar
    GUISetState(@sw_show, $GuiCLient)
    WinActivate("Client")
    EndIf
    WEnd

    [/autoit]


    Und der Server:

    Spoiler anzeigen
    [autoit]

    ;== Includes
    #include
    #include
    #include
    #include
    ;=================================

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

    TraySetIcon("Shell32.dll", -19)
    Opt("TrayMenuMode",1)

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

    #Region Variabeln
    $User = 1
    $WanIp = _GetIP()
    $MIP = @IPAddress1
    #EndRegion Variabeln

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

    #Region GUI
    $Mainwindow = GUICreate("Server", @DesktopWidth /100*25, @DesktopHeight/100*15, -1, -1, BitOR($WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX), $WS_EX_ACCEPTFILES) ;, $WS_VSCROLL
    GUISetState(@sw_Hide)
    $Liste = GUICtrlCreateListView("Benutzername | IP-Adresse | ON/Offline | Letzter Login | E-Mail Adresse", 10, 10, @DesktopWidth /100*25-10, @DesktopHeight/100*15-10)

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

    $IPanfordern = TrayCreateMenu("IP?") ;== TrayItems
    $Ipextern = TrayCreateItem($WanIP, $IPanfordern)
    $IPintern1 = TrayCreateItem(@ipaddress1, $IPanfordern)
    $IPintern2 = TrayCreateItem(@IPAddress2, $IPanfordern)
    $IPintern3 = TrayCreateItem(@IPAddress3, $IPanfordern)
    $SERVERSTAT = TrayCreateItem("Serverstatistik")
    $SSHUTDOWN = TrayCreateItem("Server beenden")
    #EndRegion GUI

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

    #Region Func
    Func SocketToIP($SHOCKET) ;== Ip des Senders erhalten s. Hilfe "Function Reference TCPRecv"
    Local $sockaddr, $aRet
    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")
    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
    "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
    $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
    If Not @error Then $aRet = $aRet[0]
    Else
    $aRet = 0
    EndIf
    $sockaddr = 0
    Return $aRet
    EndFunc
    #EndRegion Func

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

    TCPStartup()
    $MSocket = TCPListen($MIP, 6221, 9999)
    If @error = -1 Then
    MsgBox(0, "Error", "Folgender Fehler ist aufgetreten:" & @error)
    Else
    MsgBox(64, "Server", "Server gestartet :)")
    EndIf

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

    While 1
    $GUIMsg = GUIGetMsg()
    $TrayMSG = TrayGetMsg()
    $SMsg = TCPAccept($Msocket)
    $Msg = TCPRecv($SMsg, 9999)
    If $Msg <> "" Then
    $eingehendeIP = SockettoIP($SMsg)
    $Neu = StringLeft($MSG, 8)

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

    If $Neu = "$ACCNEU|" Then ;== Fall: Neuer Account erstellt
    $ACCDAten = StringSplit($MSG, "|")
    IniReadSection(@scriptdir & "\Benutzer.ini", $ACCDATEN[2]) ;== Benutzer schon registriert? Wenn ja kein @error = 1
    If @error = 1 Then
    IniWrite(@scriptdir & "\Benutzer.ini", $ACCDATEN[2], "Passwort", $ACCDATEN[4])
    IniWrite(@scriptdir & "\Benutzer.ini", $ACCDATEN[2], "E-Mail Adresse", $ACCDATEN[6])
    IniWrite(@scriptdir & "\Benutzer.ini", $ACCDATEN[2], "IP", $eingehendeIP)
    IniWrite(@scriptdir & "\Benutzer.ini", $ACCDATEN[2], "LoginZeit", "Noch nicht eingeloggt")
    IniWrite(@scriptdir & "\Benutzer.ini", $ACCDATEN[2], "On", "Neu")
    $Antwort = TCPConnect($EingehendeIP, 6221)
    TCPSend($Antwort, "Benutzer erfolgreich erstellt.")
    TrayTip("Neuer Benutzer:", $ACCDATEN[2], 10, 1)
    Else
    $Antwort = TCPConnect($EingehendeIP, 6221) ;== @error<>1 = Benutzername existiert schon
    $send = TCPSend($Antwort, "Benutzername nicht verfügbar!")
    EndIf
    EndIf

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

    If $MSg = "Verbindemich" Then ;== Fall: Will verbinden
    $Antwort = TCPConnect($EingehendeIP, 6221)
    TCPSend($Antwort, "Erfolgreich verbunden :)")
    TrayTip("Neue Verbindung mit:", $eingehendeIP, 10, 1)
    EndIf

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

    If $Neu = "Benutzer" Then ;== Fall: Benutzer will einloggen
    $Anmeldung = StringSplit($MSG, ":")
    IniReadSection(@scriptdir & "\Benutzer.ini", $Anmeldung[2])
    If @error = 1 Then ;== Benutzer existiert ja gar nicht
    $Antwort = TCPConnect($EingehendeIP, 6221)
    $send = TCPSend($Antwort, "Benutzername nicht nicht registriert!")
    Else
    $PWCHECK = IniReadSection(@scriptdir & "\Benutzer.ini", $Anmeldung[2]) ;== Stimmt das Passwort?
    If $PWCHECK[1][1] = $Anmeldung[4] Then ;== Ja
    IniWrite(@scriptdir & "\Benutzer.ini", $Anmeldung[2], "IP", $EingehendeIP) ;== Schnell noch die IP speichern...
    $zeit = @YEAR &"."& @MON &"."& @WDAY &" "& @HOUR & ":"&@MIN & ":"& @SEC &"."& @MSEC
    IniWrite(@scriptdir & "\Benutzer.ini", $Anmeldung[2], "LoginZeit", $zeit) ;== ... und die Anmeldezeit...
    IniWrite(@scriptdir & "\Benutzer.ini", $Anmeldung[2], "ON", "On") ;== ... und Status auf On setzen
    $Antwort = TCPConnect($EingehendeIP, 6221) ;== Antort abschicken und fertig
    $send = TCPSend($Antwort, "Erfolgreich eingeloggt ;)")
    TrayTip("Benutzer hat sich eingeloggt:", $Anmeldung[2], 10, 1)
    Else ;== Nein
    $Antwort = TCPConnect($EingehendeIP, 6221)
    $send = TCPSend($Antwort, "Falsches Passwort! Groß- und Kleinschreibung beachten. Ist Capslock aktiv?")
    TrayTip("Falsches Passwort von:", $Anmeldung[2] & " @ IP" & $EingehendeIP, 10, 2)
    EndIf
    EndIf
    EndIf

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

    If $Neu = "binwech8" Then ;== Fall: Benutzer loggt aus
    $Abmeldung = StringSplit($MSG, ":")
    IniWrite(@scriptdir & "\Benutzer.ini", $Abmeldung[1], "ON", "OFF") ;== Status ändern in OFF
    TrayTip("User hat sich abgemeldet:", $abmeldung[1], 10, 1)
    EndIf
    EndIf

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

    If $TrayMsg = $Ipextern Then
    ClipPut($WanIP)
    EndIf
    If $TrayMsg = $Ipintern1 Then
    ClipPut(@ipaddress1)
    EndIf
    If $TrayMsg = $Ipintern2 Then
    ClipPut(@IPAddress2)
    EndIf
    If $TrayMsg = $Ipintern3 Then
    ClipPut(@ipaddress3)
    EndIf

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

    If $TrayMSG = $SShutdown Then
    $MSGBOXANTWORT = MsgBox(4, "Sicher beenden?", "Den Server wirklich beenden? Alle Verbindungen werden getrennt!")
    If $MSGBOXANTWORT = 6 Then
    TCPCloseSocket($Antwort)
    TCPCloseSocket($SMsg)
    TCPCloseSocket($MSocket)
    TCPShutdown()
    Exit
    EndIf
    EndIf

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

    If $TrayMSG = $SERVERSTAT Then
    $ininutzer = IniReadSectionNames(@ScriptDir & "\Benutzer.ini")
    If @error Then
    MsgBox(0, "Fehler", "Es besteht noch keine Benutzerdatei!")
    ExitLoop
    EndIf
    $Listtext = GUICtrlCreateListViewItem("", $Liste)
    GUICtrlSetData($Listtext, "")
    For $i = 1 To $ininutzer[0]
    $ininutzerdaten = IniReadSection(@ScriptDir & "\Benutzer.ini", $ininutzer[$i])
    $Listviewtext = $ininutzer[$i] &"|"& $ininutzerdaten[$i-$i+3][1] &"|"& $ininutzerdaten[$i-$i+5][1] &"|"& $ininutzerdaten[$i-$i+4][1] &"|"& $ininutzerdaten[$i-$i+2][1]
    $Listtext = GUICtrlCreateListViewItem($listviewtext, $Liste)
    GUICtrlSetData($Listtext,$ininutzer[$i])
    GUISetState(@sw_show, $mainwindow)
    WinActivate("Server")
    Next
    EndIf

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

    If $GUImsg = $GUI_EVENT_CLOSE Then
    GUISetState(@sw_hide, $mainwindow)
    EndIf
    WEnd

    [/autoit]


    Schon gleich viel schöner - oder? ^^
    EDIT: Kann man überhaupt vom selben PC aus beide Scripte testen? Die blockieren sich doch dann gegenseitig oder nicht?
    EDIT 2: Habs mal ausprobiert. Verbinden klappt zu ~30%. Der Rest läuft nicht - irgendwo bleiben Server und/oder Client hängen (aber meist ohne CPU Auslastung) :(
    EDIT 3: Hab den Fehler eingrenzen können: Beim verbinden schickt der Client die Sachen zum Server. Der registriert das und schickt eine Messege an den Clienten zurück. Die kommt aber nie an -.- (Er schickt definitiv!(24Byte)) Ist der Client an der Stelle kurz zu langsam (hab Zeit gemessen ~14ms): line 106ff

    [autoit]

    TCPSend($connect, "Verbindemich")
    While $Antwort = 0
    $Smsg = TCPAccept($Msocket)
    $Msg = TCPRecv($SMsg, 9999)

    [/autoit]

    2 Mal editiert, zuletzt von Aquaplant (19. November 2009 um 00:08)