Hilfe bei einem Messenger

  • Hallo, bin gerade dabei ein bisschen an einem Messenger rum zu basteln. Wollte eigentlich alle in ein Fenster, hab aber keinen Source-Code gefunden den ich mal auseinander nehmen kann um mir mal die funktionsweise an zu schauen...
    Jetzt arbeite ich quasi erstmal mit einem Server und einem Client. der Server funktioniert soweit und empfängt die Daten vom echten client.
    jetzt habe ich versucht das der Client statt einer Inputbox auch ein GUI sein soll, damit das nicht immer kurz zu geht wenn ich eine Nachricht schicke.
    Jetzt habe ich aber das Problem das sich der neue Client direkt nach dem Start wieder schließt. hat jemand eine Ahnung woran das liegen kann?


    Hier noch der Code von dem Client:

    Spoiler anzeigen
    [autoit]



    ;==============================================
    ;==============================================
    ;CLIENT! Start Me after starting the SERVER!!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================

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

    Func Example2()
    ; Set Some reusable info
    ;--------------------------
    Local $ConnectedSocket, $szData
    ; Set $szIPADDRESS to wherever the SERVER is. We will change a PC name into an IP Address
    ; Local $szServerPC = @ComputerName
    ; Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891

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

    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891
    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted
    Local $msg, $recv

    $GOOEY = GUICreate("My Server (IP: " & $szIPADDRESS & ")", 500, 400)
    $edit = GUICtrlCreateEdit("", 10, 10, 480, 280)
    Local $Input = GUICtrlCreateInput("hi", 10, 300, 480, 80)
    $Click = GuiCtrlCreateButton ( "Send", 500, 350, 25, 40)
    GUISetState()

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

    ; Start The TCP Services
    ;==============================================
    TCPStartup()

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

    ; Initialize a variable to represent a connection
    ;==============================================
    $ConnectedSocket = -1

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

    ;Attempt to connect to SERVER at its IP and PORT 33891
    ;=======================================================
    $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)

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

    ; If there is an error... show it
    If @error Then
    MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
    ; If there is no error loop an inputbox for data
    ; to send to the SERVER.
    Else
    ;Loop forever asking for data to send to the SERVER
    While 1
    $nMsg = GuiGetMsg ()
    Switch $nMsg

    ; If they cancel the InputBox or leave it blank we exit our forever loop
    Case @error
    ExitLoop

    Case $Click
    ; InputBox for data to transmit
    $szData = GUICtrlRead ($Input)
    ; We should have data in $szData... lets attempt to send it through our connected socket.
    TCPSend($ConnectedSocket, $szData)

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

    ; If the send failed with @error then the socket has disconnected
    ;----------------------------------------------------------------
    ;~ Case @error
    ;~ ExitLoop
    EndSwitch
    WEnd
    EndIf
    EndFunc ;==>Example

    [/autoit]


    Edit Oscar: Spoiler-Tags hinzugefügt. Bitte bei längeren Quelltexten zusätzlich zu dem AutoIt-Tag auch den Spoiler-Tag benutzen!

    Zitat

    "Some people feel the rain, others just get wet." - Bob Marley

    2 Mal editiert, zuletzt von NightmarePhoenix (13. Dezember 2013 um 11:14)

  • Hey Schnitzel,

    dankeschön, war wohl zu blöd dazu, die suche zu nutzen, hab nicht an chat gedacht!
    ich hab die ganze zeit nur nach "messenger" gesucht... :S
    Naja, werd mir das dann mal bei gelegentheit durchschauen :P

    trotzdem ist damit nicht meine eigentliche Frage beantwortet wieso sich das direkt schließt ;)

    Zitat

    "Some people feel the rain, others just get wet." - Bob Marley

    Einmal editiert, zuletzt von NightmarePhoenix (31. Oktober 2013 um 11:36)

  • sooo, hab jetzt mal ein Example2 () davor gesetzt, jetzt schließt es zumindest auch den Server mit :P
    heißt, ich hab jetzt eine Funktion drinnen die läuft, aber immer noch anders als ich das eigentlich wollte ?(
    weil eigentlich soll der klick auf senden ja eigentlich die eingabe aus dem Inputfeld auslesen und dann an
    server schicken. und alles was ich zum vorgänger geändert habe war das ich statt der InputBox eine GUI
    mit Inputfeld und Button erstellt habe... und ich habe einen case drinne für den button... demnach könnte
    es doch eigentlich nur am Button liegen oder denke ich da grade falsch?


    Hier nochmal der Code:

    Spoiler anzeigen
    [autoit]




    ;==============================================
    ;==============================================
    ;CLIENT! Start Me after starting the SERVER!!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================
    Example2 ()

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

    Func Example2()
    ; Set Some reusable info
    ;--------------------------
    Local $ConnectedSocket, $szData
    ; Set $szIPADDRESS to wherever the SERVER is. We will change a PC name into an IP Address
    ; Local $szServerPC = @ComputerName
    ; Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891
    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted
    Local $msg, $recv

    $GOOEY = GUICreate("My Server (IP: " & $szIPADDRESS & ")", 500, 400)
    $edit = GUICtrlCreateEdit("", 10, 10, 480, 280)
    Local $Input = GUICtrlCreateInput("hi", 10, 300, 480, 80)
    $Click = GuiCtrlCreateButton ( "Send", 500, 350, 25, 40)
    GUISetState()

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

    ; Start The TCP Services
    ;==============================================
    TCPStartup()

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

    ; Initialize a variable to represent a connection
    ;==============================================
    $ConnectedSocket = -1

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

    ;Attempt to connect to SERVER at its IP and PORT 33891
    ;=======================================================
    $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)

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

    ; If there is an error... show it
    If @error Then
    MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
    ; If there is no error loop an inputbox for data
    ; to send to the SERVER.
    Else
    ;Loop forever asking for data to send to the SERVER
    While 1
    $nMsg = GuiGetMsg ()
    Switch $nMsg

    ; If they cancel the InputBox or leave it blank we exit our forever loop
    Case @error
    ExitLoop

    Case $Click
    ; InputBox for data to transmit
    $szData = GUICtrlRead ($Input)
    ; We should have data in $szData... lets attempt to send it through our connected socket.
    TCPSend($ConnectedSocket, $szData)

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

    ; If the send failed with @error then the socket has disconnected
    ;----------------------------------------------------------------
    ;~ Case @error
    ;~ ExitLoop
    EndSwitch
    WEnd
    EndIf
    EndFunc ;==>Example

    [/autoit]


    Edit Oscar: Spoiler-Tags hinzugefügt. Bitte bei längeren Quelltexten zusätzlich zu dem AutoIt-Tag auch den Spoiler-Tag benutzen!

    Zitat

    "Some people feel the rain, others just get wet." - Bob Marley

    Einmal editiert, zuletzt von Oscar (31. Oktober 2013 um 18:09)

  • howdy

    wenn du einen simplen messenger machen möchtest empfehle ich dir die TCP UDF von Kip

    http://www.autoitscript.com/forum/topic/74…f-event-driven/

    wenn du aber etwas komplexeres machen möchtest kannst du mich gern mal per PN oder skype ("sgtigram") anschreiben da ich mir da was aufwendigeres geschrieben habe wenn man als beispiel mehrere clienten oder server in einem script unterbringen möchte

    edit: oder wenn du sogar mehrere clienten und server gleichzeitig in ein und dem selben script machen möchtest.. allerdings solltest du sowas nur für sehr komplexe dinge brauchen und nicht für einen messenger^^

    mfg sgtigram

  • Hi euch beide :)

    Oscar : das script hab ich hier mit angehängt.
    bis jetzt nur zum testen auf meinem pc und sobald ich das verstanden habe wie das genau funktioniert versuche ich es auf andere IP's zu senden bzw client und server in ein script zu fassen damit ich senden und empfangen in einem fenster machen kann, bis jetzt sende ich es nur an den server und der zeigt es dann in einer editbox an.
    ok, wie müsste das dann aussehen? ich dachte das Case @error wäre dafür gedacht...
    hab jetzt das Case @error rausgenommen, jetzt funktioniert es soweit das ich auf den Server sende.


    SgtIgram: ok, werde mir das mal anschauen und wenn ich das soweit beherrsche das ich den kleinen komplett selbst programmieren könnte komme ich nochmal auf dein angebot zurück :)

    Edit:
    Danke für den Tipp Oscar :)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt('MustDeclareVars', 1)

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

    ;==============================================
    ;==============================================
    ;SERVER!! Start Me First !!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================

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

    Example()

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

    Func Example()
    ; Set Some reusable info
    ; Set your Public IP address (@IPAddress1) here.
    ; Local $szServerPC = @ComputerName
    ; Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891
    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted
    Local $msg, $recv

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

    ; Start The TCP Services
    ;==============================================
    TCPStartup()

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

    ; Create a Listening "SOCKET".
    ; Using your IP Address and Port 33891.
    ;==============================================
    $MainSocket = TCPListen($szIPADDRESS, $nPORT)

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

    ; If the Socket creation fails, exit.
    If $MainSocket = -1 Then Exit

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

    ; Create a GUI for messages
    ;==============================================
    $GOOEY = GUICreate("My Server (IP: " & $szIPADDRESS & ")", 700, 400,0,0)
    $edit = GUICtrlCreateEdit("", 210, 10, 480, 280)
    Local $Input = GUICtrlCreateInput("", 210, 300, 480, 80)
    Local $Friendlost = GUICtrlCreateList ("Friends", 10, 10, 190, 380)
    GUISetState()

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

    ; Initialize a variable to represent a connection
    ;==============================================
    $ConnectedSocket = -1

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

    ;Wait for and Accept a connection
    ;==============================================
    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1

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

    ; Get IP of client connecting
    $szIP_Accepted = SocketToIP($ConnectedSocket)

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

    ; GUI Message Loop
    ;==============================================
    While 1
    $msg = GUIGetMsg()

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

    ; GUI Closed
    ;--------------------
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop

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

    ; Try to receive (up to) 2048 bytes
    ;----------------------------------------------------------------
    $recv = TCPRecv($ConnectedSocket, 2048)

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

    ; If the receive failed with @error then the socket has disconnected
    ;----------------------------------------------------------------
    If @error Then ExitLoop

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

    ; Update the edit control with what we have received
    ;----------------------------------------------------------------
    If $recv <> "" Then GUICtrlSetData($edit, _
    $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))

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

    WEnd

    Call ( "Example2")

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

    If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)

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

    TCPShutdown()
    EndFunc ;==>Example

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

    ; Function to return IP Address from a connected socket.
    ;----------------------------------------------------------------------
    Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet

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

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

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

    $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

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

    $sockaddr = 0

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

    Return $aRet
    EndFunc ;==>SocketToIP

    [/autoit]
    Zitat

    "Some people feel the rain, others just get wet." - Bob Marley

    3 Mal editiert, zuletzt von NightmarePhoenix (1. November 2013 um 00:27)

  • Hm, hab mir jetzt erstmal vorgenommen das in ein Fenster zu packen, jetzt hab ich aber das Problem das ich bei Zeile 154 einen Fehler bekomme. Angeblich habe ich hier ein "WEnd"-Statement ohne passenden "While"-Befehl...

    Hier der besagte Bereicht:

    Spoiler anzeigen
    [autoit]


    While 1
    $nMsg = GuiGetMsg ()

    If $nMsg = $Click Then
    ; InputBox for data to transmit
    $szData = _NowTime () & ": " & GUICtrlRead ($Input)
    ; We should have data in $szData... lets attempt to send it through our connected socket.
    TCPSend($ConnectedSocket, $szData)

    WEnd

    [/autoit]


    Hier das komplette Script:

    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>

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

    Opt('MustDeclareVars', 1)

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

    ;==============================================
    ;==============================================
    ;SERVER!! Start Me First !!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================

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

    Example()

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

    Func Example()
    ; Set Some reusable info
    ; Set your Public IP address (@IPAddress1) here.
    ; Local $szServerPC = @ComputerName
    ; Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891
    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted
    Local $msg, $recv

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

    ; Start The TCP Services
    ;==============================================
    TCPStartup()

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

    ; Create a Listening "SOCKET".
    ; Using your IP Address and Port 33891.
    ;==============================================
    $MainSocket = TCPListen($szIPADDRESS, $nPORT)

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

    ; If the Socket creation fails, exit.
    If $MainSocket = -1 Then Exit

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

    ; Create a GUI for messages
    ;==============================================
    $GOOEY = GUICreate("My Server (IP: " & $szIPADDRESS & ")", 750, 400,0,0)
    $edit = GUICtrlCreateEdit("", 210, 10, 530, 280)
    Local $Input = GUICtrlCreateInput("", 210, 300, 480, 80)
    Local $Friendlost = GUICtrlCreateList ("Friends", 10, 10, 190, 380)
    Local $Click = GuiCtrlCreateButton ( "Send", 700, 327.5, 40, 25, $BS_DEFPUSHBUTTON)
    GUISetState()

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

    ; Initialize a variable to represent a connection
    ;==============================================
    $ConnectedSocket = -1

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

    ;Wait for and Accept a connection
    ;==============================================
    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1

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

    ; Get IP of client connecting
    $szIP_Accepted = SocketToIP($ConnectedSocket)


    ; Start The TCP Services
    ;==============================================
    TCPStartup()

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

    ; Initialize a variable to represent a connection
    ;==============================================
    $ConnectedSocket = -1

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

    ;Attempt to connect to SERVER at its IP and PORT 33891
    ;=======================================================
    $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)

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

    ; If there is an error... show it
    If @error Then
    MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
    ; If there is no error loop an inputbox for data
    ; to send to the SERVER.
    Else
    ;Loop forever asking for data to send to the SERVER

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

    ; GUI Message Loop
    ;==============================================
    While 1
    $msg = GUIGetMsg()

    ; GUI Closed
    ;--------------------
    If $msg = $GUI_EVENT_CLOSE Then Exit

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

    ; Try to receive (up to) 2048 bytes
    ;----------------------------------------------------------------
    $recv = TCPRecv($ConnectedSocket, 2048)

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

    ; If the receive failed with @error then the socket has disconnected
    ;----------------------------------------------------------------
    If @error Then ExitLoop

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

    ; Update the edit control with what we have received
    ;----------------------------------------------------------------
    If $recv <> "" Then GUICtrlSetData($edit, _
    $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))

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

    WEnd

    Call ( "Example2")

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

    If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
    EndIf
    TCPShutdown()
    EndFunc ;==>Example

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

    ; Function to return IP Address from a connected socket.
    ;----------------------------------------------------------------------
    Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet

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

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

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

    $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

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

    $sockaddr = 0

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

    Return $aRet
    EndFunc ;==>SocketToIP





    Func _Example2 ()

    While 1
    $nMsg = GuiGetMsg ()

    If $nMsg = $Click Then
    ; InputBox for data to transmit
    $szData = _NowTime () & ": " & GUICtrlRead ($Input)
    ; We should have data in $szData... lets attempt to send it through our connected socket.
    TCPSend($ConnectedSocket, $szData)

    WEnd
    ;~ GUIDelete ($Input)
    ;~ $Input = GUICtrlCreateInput("", 10, 300, 480, 80)

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

    ; If the send failed with @error then the socket has disconnected
    ;----------------------------------------------------------------
    ;~ EndSwitch

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

    EndIf
    EndFunc ;==>Example

    [/autoit]
    Zitat

    "Some people feel the rain, others just get wet." - Bob Marley

  • Ok, danke. Dachte das würde auch ohne endif gehen, da es oben ja anscheinend auch nicht zwingend gebraucht wird oder? Also Zeile 90 bis ca. Zeile 110.
    So, immerhin kein Fehler mehr :P allerdings funktioniert das mit dem senden immer noch nicht, bzw. das empfangen... hab das script jetzt auch noch ein bisschen verändert, aber immer noch nichts. habe es versucht normal von dem alten client zu senden, da kommt aber auch nichts an, insofern denke ich das das TCPRecv nicht funktioniert, ich verstehe nur nicht wieso.Ob das senden funktioniert weiß ich nicht, da ich nur einen Server laufen lassen kann und da die nachrichten nicht in dem eigentlichen ankommen, kann ich nicht schauen ob das senden funktioniert...

    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>

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

    Opt('MustDeclareVars', 1)

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

    ;==============================================
    ;==============================================
    ;SERVER!! Start Me First !!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================

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

    Example()

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

    Func Example()
    ; Set Some reusable info
    ; Set your Public IP address (@IPAddress1) here.
    ; Local $szServerPC = @ComputerName
    ; Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891
    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted
    Local $msg, $recv

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

    ; Start The TCP Services
    ;==============================================
    TCPStartup()

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

    ; Create a Listening "SOCKET".
    ; Using your IP Address and Port 33891.
    ;==============================================
    $MainSocket = TCPListen($szIPADDRESS, $nPORT)

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

    ; If the Socket creation fails, exit.
    If $MainSocket = -1 Then Exit

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

    ; Create a GUI for messages
    ;==============================================
    $GOOEY = GUICreate("My Server (IP: " & $szIPADDRESS & ")", 750, 400,0,0)
    $edit = GUICtrlCreateEdit("", 210, 10, 530, 280)
    Local $Input = GUICtrlCreateInput("", 210, 300, 480, 80)
    Local $Friendlost = GUICtrlCreateList ("Friends", 10, 10, 190, 380)
    Local $Click = GuiCtrlCreateButton ( "Send", 700, 327.5, 40, 25, $BS_DEFPUSHBUTTON)
    GUISetState()

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

    ; Initialize a variable to represent a connection
    ;==============================================
    $ConnectedSocket = -1

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

    ;Wait for and Accept a connection
    ;==============================================
    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1

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

    ; Get IP of client connecting
    $szIP_Accepted = SocketToIP($ConnectedSocket)


    ; Start The TCP Services
    ;==============================================
    TCPStartup()

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

    ; Initialize a variable to represent a connection
    ;==============================================
    $ConnectedSocket = -1

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

    ;Attempt to connect to SERVER at its IP and PORT 33891
    ;=======================================================
    $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)

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

    ; If there is an error... show it
    If @error Then
    MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
    ; If there is no error loop an inputbox for data
    ; to send to the SERVER.
    Else
    ;Loop forever asking for data to send to the SERVER

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

    ; GUI Message Loop
    ;==============================================
    While 1
    $msg = GUIGetMsg()


    If $nMsg = $Click Then
    ; InputBox for data to transmit
    $szData = _NowTime () & ": " & GUICtrlRead ($Input)
    ; We should have data in $szData... lets attempt to send it through our connected socket.
    TCPSend($ConnectedSocket, $szData)
    EndIf

    ; GUI Closed
    ;--------------------
    ;~ If $msg = $GUI_EVENT_CLOSE Then Exit

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

    ; Try to receive (up to) 2048 bytes
    ;----------------------------------------------------------------
    $recv = TCPRecv($ConnectedSocket, 2048)

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

    ; If the receive failed with @error then the socket has disconnected
    ;----------------------------------------------------------------
    If @error Then ExitLoop

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

    ; Update the edit control with what we have received
    ;----------------------------------------------------------------
    If $recv <> "" Then GUICtrlSetData($edit, _
    $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))

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

    WEnd

    Call ( "Example2")

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

    If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
    EndIf
    TCPShutdown()
    EndFunc ;==>Example

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

    ; Function to return IP Address from a connected socket.
    ;----------------------------------------------------------------------
    Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet

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

    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

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

    $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

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

    $sockaddr = 0

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

    Return $aRet
    EndFunc ;==>SocketToIP





    ;~ Func _Example2 ()
    ;~
    ;~ While 1
    ;~ $nMsg = GuiGetMsg ()
    ;~
    ;~ If $nMsg = $Click Then
    ;~ ; InputBox for data to transmit
    ;~ $szData = _NowTime () & ": " & GUICtrlRead ($Input)
    ;~ ; We should have data in $szData... lets attempt to send it through our connected socket.
    ;~ TCPSend($ConnectedSocket, $szData)
    ;~ EndIf
    ;~ WEnd
    ;~ GUIDelete ($Input)
    ;~ $Input = GUICtrlCreateInput("", 10, 300, 480, 80)

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

    ; If the send failed with @error then the socket has disconnected
    ;----------------------------------------------------------------
    ;~ EndSwitch

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

    ;~ EndFunc ;==>Example

    [/autoit]
    Zitat

    "Some people feel the rain, others just get wet." - Bob Marley

  • Es gibt einzeilige IF's und mehrzeilige bei einzeiligen. Siehe Hilfe
    Du solltest erstmal die Basic's verstehen bevor du irgendwelche Scripte zusammenkopierst.
    Es hilft dir sicher nichts irgendwelche Variablen zu überschreiben die du später noch benötigen würdest (siehe $ConnectedSocket...)

  • Hi Schnitzel,

    danke. Naja, ich dachte eigentlich das ich die Basics soweit verstehen würde... Ich hatte mir schon einen "Launcher" programmiert und einen Lockscreen. Der Launcher besteht eigentlich bloß aus ein paar knöpfen die verschiedene Funktionen ausführen. Was allerdings etwas schwerer war, war es so hin zu bekommen das der launcher versteckt ist und sobald ich in die rechte obere Ecke fahre er "ausklappt". Der Lockscreen war ein bisschen einfacher, das ist ja quasi nur ein GUI über den ganzen Bildschirm, das sich nur entsperren lässt wenn das richtige passwort eingegeben ist... Bei dem Launcher bin ich aber nach dem gleichen Prinzip vorgegangen wie jetzt. Ich denke halt das wenn ich Fehler mache das ich daraus dann lerne und mir das nicht nochmal passiert. Das mir den einzeiligen IF's hätte mir genau so gut passieren können bei einem einfacherern Script, oder? Bzw., da ich nicht wusste das es geht, einzeilige IF's zu schreiben, hätte ich immer mit EndIf geschrieben, und hätte nie oder erst sehr spät herausgefunden das es einzeilige IF's gibt. Und das mit dem vergessenen Funktionsaufruf war ein leichsinns-Fehler ;P

    Wie meinst du das mit Variablen zu überschreiben?

    Zitat

    "Some people feel the rain, others just get wet." - Bob Marley

  • Du hast 2x TCPStartup() --> Wieso?
    $ConnectedSocket verwendest du erst für TCPAccept und später überschreibst du es dann durch ein TCPConnect --> Dein Server versucht auf sich selbst zu verbinden --> Das passt nicht
    Auch im Client ist so einiges drin das keinen Sinn macht.

    Und versteh mich nicht falsch. Das ist nicht böse gemeint, wenn ich sage, dass das zusammenkopiert ist.
    Fast jeder fängt mal so an.
    Aber wenn du einen Chat mit ein paar weiteren Funktionen bauen willst dann solltest du das was bisher in deinem Script ist auch verstehen.
    Tutorials gibt es genügend. Kannst ja mal einen Blick in meine Signatur werfen ;)

    Wenn man es versteht bekommt man von der Funktionsweise das was du bisher hast auf geschätzt 30 Zeilen pro Script ( Server / Client ).

  • Ahhhh, ok, danke :)

    Versteh ich schon nicht falsch, wenn man mit kritik nicht umgehen kann ist man in so einem Forum meiner meinung nach falsch ;)
    Und ich hab ja gesagt das ich es mir kopiert habe und jetzt versuche es zu verstehen^^ Wobei ich mich da ja anscheinend etwas doof anstelle :P Das TCPStartup () habe ich zweimal drinnen, weil ich den Text ja zusammenkopiert habe und habe es nicht rausgelöscht, weil ich mir gedacht habe an sich stört es ja nicht (oder?) und wenn ich es raus lösche und später irgendwann brauche weil ich das irgendwie anders schreiben will wäre ja doof oder? :P

    Andere Frage nebenbei, ich habe den Chat von Protex neulich mal ausprobiert ( Auto IT TCP Chat ), und mit nem kumpel getestet, hat aber nicht so ganz funktioniert... muss man da extra einen Server haben damit wir beide zum gleichen chat connecten können? Oder müsste das nicht rein theoretisch auch gehen wenn wir beide die IP von uns angeben? Und wenn wir einen Server brauchen, wieso genau wäre as so? Danke schonmal für die Antworten^^

    Zitat

    "Some people feel the rain, others just get wet." - Bob Marley

  • howdy,

    bei der protex variante müsste noch der port freigegeben werden (in diesem fall 7500) damit überhaupt etwas funktioniert...
    zusätzlich wäre es von wichtigkeit die firewall entsprechend einzustellen...

    ich hab mir den chat jetzt nicht näher angeschaut aber ich denke als erstes muss die onlyserver datei ausgeführt werden was dann den server darstellt.. anschließend können beide auf diesen server verbinden.. wenn du den server startest müsstet ihr beide deine ip angeben bzw. könntest du (und nur du!) auch 127.0.0.1 eingeben.. wichtig sollte sein das auch wenn du drauf connecten kannst, es nicht heißen muss das der port wirklich offen ist da deine verbindung ja sozusagen bei dir bleibt und nicht am router vorbeimuss

    ich erwähne sicherheitshalber noch das nicht beide den server ausführen müssen^^.. sonst connectet ihr auf den server des jeweils anderen und wundert euch das niemand da is.. immer nur 1 server

    zu beachten ist natürlich das so wie der chat momentan ist, bietet er keinerlei sicherheit weil kein passwort verlangt wird

    falls ich was vergessen haben sollte, füge ich es an^^

    mfg
    sgtigram

  • hi^^

    ok, das mit dem port war der fehler :D

    gestartet haben wir es bekommen, nur halt eben nicht connected :P
    server nur einmal starten ist klar, da wir ja auf den gleichen server müssen ;)
    127.0.0.1 weiß ich, da das ja der eigene pc ist^^
    ok, danke für den tipp^^

    Gruß, Nightmare

    Zitat

    "Some people feel the rain, others just get wet." - Bob Marley

  • hi leute :)

    hab mich jetzt mal dran gemacht wie schnitzel gesagt hat und einen messenger komplett selbst geschrieben.
    Der client funktioniert ausgezeichnet, den server hab ich wohl etwas zu umständlich gemacht... aber er funktioniert, wenn auch erst für einen client :P
    habe jetzt einen anderen server fürs erste genommen, mit dem ich auch mehrere clients verbinden kann.

    Jetzt würde ich mich nur fragen, kann ich die Clients die auf den Server connecten irgendwie abspeichern? Also seperat in einer Txt-Datei die IP mit Uhrzeit?
    Den Code habe ich leider gerade nicht da, weil mein Pc im moment weg ist und da der source-code drauf war :( falls der zwingend benötigt wir um meine frage zu beantworten würde ich ihn so bald wie möglich posten. allerdings würde mir auch vollkommen eine allgemeine antwort langen, damit ich es mir selbst erarbeiten kann^^

    Gruß, Nightmare

    Zitat

    "Some people feel the rain, others just get wet." - Bob Marley

  • Warum willst du die Clients denn in einer Txt speichern? Als einfaches logging?
    Falls ja hast du doch schon fast alles was du brauchst
    Mit der SocketToIP() Funktion bekommst du die IP Adresse. Auserdem noch:

    [autoit]


    ; Datei schreiben
    Fileopen(); nicht zwingend aber besser wenn oft geschrieben wird
    Filewrite()
    Fileclose(); Wenn Fileopen dann auch Fileclose verwenden
    ; und für die Uhrzeiten z.B. die Makros:
    @Year
    @Mon
    @Mday
    @Hour
    @Min
    @Sec

    [/autoit]