Frage zu TCP CHAT

  • Hi habe hier im forum einen TCP chat gefunden
    jedoch frage ich mich wie das ganze nach dem ip reset klappen soll
    hier mal das script
    Server

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    Global Const $IP = @IPAddress1
    Global Const $PORT = 5393
    Global Const $MAXCON = 2;Maximal 50 Verbindungen

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

    Global $aClients[$MAXCON + 1][3]
    $aClients[0][0] = $MAXCON

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

    Opt("GuiOnEventMode", 1)

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

    TCPStartup()

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

    $hListen = TCPListen($IP, $PORT, $MAXCON)

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

    AdlibRegister("TCPAcc", 100)

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

    ;Hat nicht zu interessieren, ist nur GUI
    GUICreate("Server", 400, 150)
    GUISetOnEvent(-3, "_Exit")

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

    $hListV = GUICtrlCreateListView("ID|Client|IP", 0, 0, 200, 150)
    $hEdit = GUICtrlCreateEdit("Text zum Senden", 200, 0, 200, 80,0)
    $hSendToAll = GUICtrlCreateRadio("An alle Senden",200,80,200,15)
    GUICtrlSetOnEvent(-1,"_gui_radio")
    GUICtrlSetState(-1,$GUI_CHECKED)
    GUICtrlCreateRadio("Nur an folgende ID senden:",200,95,200,15)
    GUICtrlSetOnEvent(-1,"_gui_radio")
    $hInput = GUICtrlCreateInput("",200,110,200,20)
    GUICtrlSetState(-1,$GUI_DISABLE)
    GUICtrlCreateButton("SEND", 200, 130, 200, 20)
    GUICtrlSetOnEvent(-1, "_gui_send")
    GUISetState()

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

    ;Main Schleife: Hier wird das, was in den Server reinkommt abgefangen
    While 1
    For $i = 1 To $aClients[0][0]
    If $aClients[$i][0] Then
    $sRecv = TCPRecv($aClients[$i][0], 1024)
    If $sRecv Then TrayTip("Neue Nachricht von " & $aClients[$i][1], $sRecv, 2)
    EndIf
    Next
    Sleep(100)
    WEnd

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

    ;GUI Krimskrams
    Func _gui_radio()
    ConsoleWrite(@GUI_CtrlId & @CRLF)
    If @GUI_CtrlId = $hSendToAll Then
    GUICtrlSetState($hInput,$GUI_DISABLE)
    Else
    GUICtrlSetState($hInput,$GUI_ENABLE)
    EndIf

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

    EndFunc

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

    ;GUI Krimskrams
    Func _gui_send()
    Local $sText = GUICtrlRead($hEdit)
    If BitAND(GUICtrlRead($hSendToAll), $GUI_CHECKED) Then
    ConsoleWrite("--" & @CRLF)
    _TCP_ServerBroadcast($sText)
    Else
    Local $iID = GUICtrlRead($hInput)
    ConsoleWrite($iID & @CRLF)
    If $iID < 1 Or $iID > $MAXCON Then Return MsgBox(16,"","ID muss zwischen 1 und "&$MAXCON&" sein!")
    TCPSend($aClients[$iID][0],$sText)
    If @error Then _DelClient($aClients[$iID][0])
    EndIf
    EndFunc ;==>_gui_send

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

    ;Adlib funktion, hier wird alle 100ms nach einem neuen Client gesucht
    Func TCPAcc()
    $hAcc = TCPAccept($hListen)
    If $hAcc > 0 Then _AddClient($hAcc)
    EndFunc ;==>TCPAcc

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

    ;Hier wird der Client hinzugefügt
    Func _AddClient($hSocket)
    Local $i
    For $i = 1 To $aClients[0][0]
    If Not $aClients[$i][0] Then ExitLoop
    Next
    $aClients[$i][0] = $hSocket
    $aClients[$i][1] = SocketToIP($hSocket)
    $aClients[$i][2] = GUICtrlCreateListViewItem($i&"|"&$aClients[$i][0] & "|" & $aClients[$i][1],$hListV)
    Return TCPSend($hSocket, "welcome")
    EndFunc ;==>_AddClient

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

    ;Hier wird er ggf. wieder gelöscht
    Func _DelClient($hSocket)
    Local $i
    For $i = 1 To $aClients[0][0]
    If $aClients[$i][0] = $hSocket Then
    TCPCloseSocket($aClients[$i][0])
    $aClients[$i][0] = '' ;Entferne Client
    GUICtrlDelete($aClients[$i - 1][2])
    Return True
    EndIf
    Next
    Return False
    EndFunc ;==>_DelClient

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

    ;Sendet einen String an alle verbundenen Clients
    Func _TCP_ServerBroadcast($sText)
    Local $i
    For $i = 1 To $aClients[0][0]
    If $aClients[$i][0] Then
    TCPSend($aClients[$i][0], $sText)
    If @error Then _DelClient($aClients[$i][0])
    EndIf
    Next
    EndFunc ;==>_TCP_ServerBroadcast

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

    Func _Exit()
    Local $i
    For $i = 1 To $aClients[0][0]
    If $aClients[$i][0] Then
    TCPCloseSocket($aClients[$i][0])
    GUICtrlDelete($aClients[$i - 1][2])
    EndIf
    Next
    TCPShutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit] [autoit][/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]


    Client

    Spoiler anzeigen
    [autoit]

    Global Const $IP = @IPAddress1
    Global Const $PORT = 5393
    TCPStartup()

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

    $hCon = TCPConnect($IP,$PORT)
    If @error Then Exit MsgBox(16,"","Server ist nicht gestartet. Fehler: "&@error)

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

    TCPSend($hCon,"Hi. Ich bin "&@ComputerName&" mit dem User"& @UserName)
    While 1
    $sRecv = TCPRecv($hCon,1024)
    If @error Then ExitLoop
    If $sRecv Then MsgBox(0,"Client Incoming",$sRecv)
    Sleep(100)
    WEnd

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

    TCPShutdown()

    [/autoit]
  • Ich weiß zwar nicht wirklich nach was du jetzt genau frägst, aber ich denke mal die Antwort ist:
    Garnicht, da die bestehende Verbindung verloren geht und kein Neuverbinden oder ähnliches eingebaut ist.
    Bei dem geposteten Scripts handelt es sich so wie ich das sehe sowieso nur um ein Beispiel

  • Hallo Detroit49,

    ich selber habe vor einiger Zeit auch einen Chatroom geschrieben.. ich löse dein Problem durch eine Namensauflösung mithilfe der Funktion TCPNameToIp($Servername).
    Diese Funktion liefert die die IP Adresse zum angegebenen Servernamen sofern er erreichbar ist. ( bezogen auf LAN, also nicht übers Internet).

    Sofern du deinen Chatroom auf das WWW erweitern möchtest brauchst du ein gegenstück was immer die Aktuelle IP deines Servers
    kennt z.b. zu lösen mit "dyndns" etc..

    Gruß Marvin

  • Vielen Dank für die Info dann werde ich das mit Dyndns machen,war mir halt nicht sicher ob es geht