Chat - Problem mit IP's

  • Hi Community,

    ich bin gerade dabei an einem Chat (über TCP) zu arbeiten. Der Chat soll über das Internet laufen und nicht nur im Heimnetzwerk funktionen.

    Der Client soll dem Server etwas schicken können, jedoch liefert der Server direkt den WSA-Fehler: 10049. Ich verwende die öffentliche IP -> _GetIP() im Server. Im Client muss der Partner die IP in die Inputbox eingeben.

    Server:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <INet.au3>

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

    $Form1 = GUICreate("Console", 378, 58, 193, 125)
    $Label1 = GUICtrlCreateLabel("Connected:", 8, 8, 59, 17)
    $LabelConnected = GUICtrlCreateLabel("0", 72, 8, 10, 17)
    $Input1 = GUICtrlCreateInput("", 8, 32, 281, 21)
    $Button1 = GUICtrlCreateButton("Senden", 294, 30, 73, 25, $BS_DEFPUSHBUTTON)
    GUISetState(@SW_SHOW)

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

    $IP = _GetIP()
    If @error Then
    MsgBox(16, "Fehler", "Fehler!")
    Else
    MsgBox(16, "IP", $IP)
    EndIf
    ;ClipPut($IP)

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

    $iRValue = TCPStartup()
    If $iRValue = 0 Then
    MsgBox(16, "Fehler", "Der Dienst kann nicht gestartet werden!" & @CRLF & "Fehlercode: 0x" & @error & " - " & @ScriptLineNumber)
    EndIf

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

    $MainSocket = TCPListen($IP, 80)
    If $MainSocket = -1 Then
    MsgBox(16,"",@error)
    Exit
    Else
    MsgBox(16, "", "!")
    EndIf

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

    While 1
    $ConnectedSocket = TCPAccept($MainSocket)
    If $ConnectedSocket >= 0 Then
    MsgBox(0, "", "Client verbunden")
    GUICtrlSetData($LabelConnected, "1")
    ExitLoop
    EndIf
    WEnd

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

    While 1
    $recv = TCPRecv($ConnectedSocket, 2048)
    If $recv <> "" And Not @error Then
    MsgBox(16, "Nachricht", $recv)
    EndIf
    WEnd

    [/autoit]

    Client:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Global $ConnectedSocket = -1
    Global $szData
    Global $IPADDRESS = @IPAddress1
    Global $PORT = 80

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

    $IP = InputBox("IP","Bitte geben Sie die IP des Servers ein: ")
    If Not @error and $IP <> "" Then
    $IPADDRESS = $IP
    Else
    MsgBox(16,"Fehler","Es ist ein Fehler aufgetreten! Das Programm wird beendet.")
    Exit
    EndIf

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

    $Form1 = GUICreate("Console", 378, 34, 193, 125)
    $Input_Senden = GUICtrlCreateInput("", 8, 8, 281, 21)
    $Button_Senden = GUICtrlCreateButton("Senden", 294, 6, 73, 25, $BS_DEFPUSHBUTTON)
    GUISetState(@SW_SHOW)

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

    $iRValue = TCPStartup()
    If $iRValue = 0 Then
    MsgBox(16, "Fehler", "Der Dienst kann nicht gestartet werden!" & @CRLF & "Fehlercode: 0x" & @error & " - " & @ScriptLineNumber)
    Exit
    Else
    ;MsgBox(48, "Info", "Der Dienst ist gestartet !")
    EndIf

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

    $ConnectedSocket = TCPConnect($IPADDRESS, $PORT)

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

    If @error Then
    MsgBox(4112, "Fehler", "Fehler in Zeile: " & @ScriptLineNumber & " @error: " & @error)
    Exit
    EndIf

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button_Senden
    $RecData = GUICtrlRead($Input_Senden)
    If $RecData <> "" Then TCPSend($ConnectedSocket, $RecData)
    EndSwitch
    WEnd

    [/autoit]

    Vielen Dank schonmal ...
    Jautois

  • Mal eine Frage. Wieso schreibt man das was man dem Client übergeben möchte nicht einfach in eine Textdatei auf dem Server? Da können es dann doch alles Clients abrufen und das z. B. alle 10 Sekunden.
    Nur mal so ein blonder Gedankengang ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Der Server und der Client sollen später natürlich beide schreiben können. Außerdem finde ich die TCP-Variante "eleganter". Das Problem liegt ja nur in dem Fehler den TCPListen liefert ->WSAGetError aus der Windows API: 10049.