TCP Chat > TCPSend kommt nicht an (glaube ich)

  • Hallo,
    ich schreibe momentan ein Chat über TCP. Das Problem ist ich kann was an den Server schiken, aber der Server nicht zurück zum Client.

    Client
    [autoit]

    #RequireAdmin

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

    #include <GUIConstantsEx.au3>
    #include <GuiIPAddress.au3>

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

    Global $socket, $connect = 0, $TempSocket, $socket2, $zahl = 0

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Client", 664, 334, 241, 111)
    $Group1 = GUICtrlCreateGroup("Benutzer", 4, 0, 197, 241)
    $ListView1 = GUICtrlCreateListView("", 10, 14, 186, 222)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Chat", 208, 2, 453, 329)
    $ListView2 = GUICtrlCreateListView("", 214, 16, 442, 286)
    $Input1 = GUICtrlCreateInput("", 216, 306, 387, 21)
    $Button1 = GUICtrlCreateButton("Senden", 608, 306, 47, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group3 = GUICtrlCreateGroup("Login", 4, 242, 197, 89)
    $Label1 = GUICtrlCreateLabel("ServerIP:", 12, 258, 48, 17)
    $IPAddress1 = _GUICtrlIpAddress_Create($Form1, 62, 254, 130, 21)
    _GUICtrlIpAddress_Set($IPAddress1, FileRead("serverip.ini"))
    $Button2 = GUICtrlCreateButton("Login", 12, 280, 179, 25)
    $Label = GUICtrlCreateLabel("Login Status", 14, 308, 179, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    TCPSend($socket, "#Exit:" & @ComputerName)
    TCPCloseSocket($socket)
    TCPShutdown()
    Exit
    Case $Button1
    TCPSend($socket, GUICtrlRead($Input1))
    Case $Button2
    TCPStartup()
    $socket = TCPConnect(_GUICtrlIpAddress_Get($IPAddress1), 65432)
    If $socket = -1 Then
    GUICtrlSetData($Label, "Server läuft nicht.")
    MsgBox(0, "Fehler", "Server läuft nicht.")
    Else
    $socket2 = TCPListen(_GUICtrlIpAddress_Get($IPAddress1), 65431, 100)
    TCPSend ($socket,"listen")
    Do
    $TempSocket = TCPAccept($socket2)
    Until $TempSocket <> -1
    TCPSend($socket, "gefunden")
    Do
    TCPSend($socket, "#Name:" & @ComputerName)
    $rec = TCPRecv($socket2, 2048)
    Until $rec <> "ok"
    TCPSend($socket, "#Name:" & @ComputerName)
    GUICtrlSetData($Label, "Erfolgreich eingelogt.")
    GUICtrlSetState($Button1, $GUI_ENABLE)
    GUICtrlSetState($Button2, $GUI_DISABLE)
    $connect = 1
    EndIf
    EndSwitch
    If $connect = 1 Then
    $rec = TCPRecv($socket2, 2048)
    If $rec <> "" Then
    GUICtrlCreateListViewItem(@HOUR & ":" & @MIN & "|Server|" & $rec, $ListView2)
    EndIf
    EndIf
    WEnd

    [/autoit]
    Server
    [autoit]

    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiIPAddress.au3>
    Global $sClient[1][2], $socket

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Server", 664, 334, 241, 111)
    $Group1 = GUICtrlCreateGroup("Benutzer", 4, 0, 197, 241)
    $ListView1 = GUICtrlCreateListView("Computername", 10, 14, 186, 222)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Chat", 208, 2, 453, 329)
    $ListView2 = GUICtrlCreateListView("Zeit|Computername|Text ", 214, 16, 442, 286)
    $Input1 = GUICtrlCreateInput("", 216, 306, 387, 21)
    $Button1 = GUICtrlCreateButton("Senden", 608, 306, 47, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group3 = GUICtrlCreateGroup("Login", 4, 242, 197, 89)
    $Label1 = GUICtrlCreateLabel("ServerIP:", 12, 258, 48, 17)
    $IPAddress1 = _GUICtrlIpAddress_Create($Form1, 62, 254, 130, 21)
    _GUICtrlIpAddress_Set($IPAddress1, @IPAddress1)
    $Button2 = GUICtrlCreateButton("Server starten", 12, 280, 179, 25)
    $Label = GUICtrlCreateLabel("Server Status", 14, 308, 179, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    $benutzer = GUICtrlRead (GUICtrlRead ($ListView1))
    If $benutzer <> "" Then
    For $i = 0 To UBound ($sClient)-1
    If $benutzer = $sClient[$i][1] & "|" Then
    For $j = 1 To 10
    TCPSend ($sClient[$i][0],GUICtrlRead ($Input1))
    Sleep (100)
    Next
    MsgBox (0,"","Gesendet")
    EndIf
    Next
    Else
    MsgBox (0,"Fehler","Bitte ein benutzer auswählen")
    EndIf
    Case $Button2
    TCPStartup()
    $socket = TCPListen(@IPAddress1, 65432, 100)
    If $socket = -1 Then
    GUICtrlSetData($Label, "Port Falsch.")
    MsgBox(0, "ERROR", "Port Falsch")
    Else
    TCPSend($socket, "#Name:" & @ComputerName)
    GUICtrlSetData($Label, "Server gestartet")
    GUICtrlSetState($Button1, $GUI_ENABLE)
    GUICtrlSetState($Button2, $GUI_DISABLE)
    FileDelete("serverip.ini")
    FileWrite("serverip.ini", @IPAddress1)
    EndIf
    EndSwitch
    $TempSocket = TCPAccept($socket)
    If $TempSocket <> -1 Then
    ReDim $sClient[UBound ($sClient)+1][4]
    $sClient[UBound($sClient)-2][0] = $TempSocket
    Do
    $rec = TCPRecv($sClient[UBound($sClient)-2][0], 2048)
    Until $rec = "listen"
    Do
    $sClient[UBound($sClient)-2][3] = TCPConnect (@IPAddress1,65431)
    Until $sClient[UBound($sClient)-2][3] <> -1
    Do
    $rec = TCPRecv($sClient[UBound($sClient)-2][0], 2048)
    Until $rec <> ""
    EndIf
    For $i = 0 To UBound($sClient) - 1
    $rec = TCPRecv($sClient[$i][0], 2048)
    If $rec <> "" Then
    If StringInStr($rec, "#Name:") Then
    Do
    TCPSend ($sClient[$i][0],"ok")
    $rec2 = TCPRecv($sClient[$i][0], 2048)
    Until $rec2 <> "back"
    $sClient[$i][1] = StringReplace($rec, "#Name:", "")
    GUICtrlCreateListViewItem ($sClient[$i][1],$ListView1)
    MsgBox (0,"","senden")
    TCPSend ($sClient[$i][0],"test")
    ElseIf StringInStr($rec, "#Exit:") Then
    ;_GUICtrlListView_GetItemCount
    Else
    GUICtrlCreateListViewItem (@HOUR & ":" & @MIN & "|" & $sClient[$i][1] & "|" & $rec,$ListView2)
    ;MsgBox(0, $sClient[$i][1], $rec)
    EndIf
    EndIf
    Next
    WEnd

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

    ;~ Local $start = TimerInit()
    ;~ Do
    ;~ $ConnectedSocket = TCPAccept($socket)
    ;~ Until $ConnectedSocket <> -1 Or (TimerDiff($start) > 25000)
    ;~ $sClient[0][0] = $ConnectedSocket

    [/autoit]
  • Danke für das Video, mache das grade halbwegs nach, habe aber irgent ein Fehler das der Client nichts bekommt vom TCPSend :(

    Client
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiIPAddress.au3>
    #RequireAdmin

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

    Global $iSocket, $iRecv, $iPacketlaenge, $login=0

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

    TCPStartup()

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Client", 664, 334, 241, 111)
    $Group1 = GUICtrlCreateGroup("Benutzer", 4, 0, 197, 241)
    $ListView1 = GUICtrlCreateListView("", 10, 14, 186, 222)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Chat", 208, 2, 453, 329)
    $Edit1 = GUICtrlCreateEdit("", 214, 16, 442, 286)
    $Input1 = GUICtrlCreateInput("", 216, 306, 387, 21)
    $Button1 = GUICtrlCreateButton("Senden", 608, 306, 47, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group3 = GUICtrlCreateGroup("Login", 4, 242, 197, 89)
    $Label1 = GUICtrlCreateLabel("ServerIP:", 12, 258, 48, 17)
    $IPAddress1 = _GUICtrlIpAddress_Create($Form1, 62, 254, 130, 21)
    _GUICtrlIpAddress_Set($IPAddress1, FileRead("serverip.ini"))
    $Button2 = GUICtrlCreateButton("Login", 12, 280, 179, 25)
    $Label = GUICtrlCreateLabel("Login Status", 14, 308, 179, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    TCPSend ($iSocket,GUICtrlRead ($Input1))
    Case $Button2
    $iSocket = TCPConnect (_GUICtrlIpAddress_Get ($IPAddress1),100)
    If @error Then
    MsgBox (0,"Fehler","Server läuft ist nicht.")
    Else
    GUICtrlSetState($Button1, $GUI_ENABLE)
    GUICtrlSetState($Button2, $GUI_DISABLE)
    $login = 1
    EndIf
    EndSwitch
    If $login = 1 Then
    Server_Recv ($iSocket)
    EndIf
    WEnd

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

    Func Server_Recv($iSocket)
    $iRecv &= BinaryToString (TCPRecv ($iSocket,2048,1))
    $iPacketlaenge = StringInStr ($iRecv,@CRLF & @CRLF,1)
    If $iPacketlaenge Then
    $sPacket = StringLeft ($iRecv,$iPacketlaenge-1)
    $iRecv = StringTrimLeft ($iRecv,$iPacketlaenge+3)
    MsgBox (0,"",$sPacket & @CRLF & $iRecv)
    GUICtrlSetData ($Edit1,$sPacket & @CRLF & GUICtrlRead ($Edit1))
    EndIf
    EndFunc

    [/autoit]
    Server
    [autoit]

    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiIPAddress.au3>

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

    Global $iSocket, $iClient_Socket[1]
    $iClient_Socket[0] = 0

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

    TCPStartup()

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Server", 664, 334, 241, 111)
    $Group1 = GUICtrlCreateGroup("Benutzer", 4, 0, 197, 241)
    $ListView1 = GUICtrlCreateListView("Computername ", 10, 14, 186, 222)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Chat", 208, 2, 453, 329)
    $Edit1 = GUICtrlCreateEdit("", 214, 16, 442, 286)
    $Input1 = GUICtrlCreateInput("", 216, 306, 387, 21)
    $Button1 = GUICtrlCreateButton("Senden", 608, 306, 47, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group3 = GUICtrlCreateGroup("Login", 4, 242, 197, 89)
    $Label1 = GUICtrlCreateLabel("ServerIP:", 12, 258, 48, 17)
    $IPAddress1 = _GUICtrlIpAddress_Create($Form1, 62, 254, 130, 21)
    _GUICtrlIpAddress_Set($IPAddress1, @IPAddress1)
    $Button2 = GUICtrlCreateButton("Server starten", 12, 280, 179, 25)
    $Label = GUICtrlCreateLabel("Server Status", 14, 308, 179, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    For $i = 1 To $iClient_Socket[0]
    $test = TCPSend ($iClient_Socket[$i],GUICtrlRead ($Input1))
    Next
    Case $Button2
    $iSocket = TCPListen(@IPAddress1, 100, 100)
    If $iSocket = -1 Then
    MsgBox(0, "Fehler", "Server konte nicht gestartet werden.")
    Exit
    Else
    GUICtrlSetState($Button1, $GUI_ENABLE)
    GUICtrlSetState($Button2, $GUI_DISABLE)
    FileDelete("serverip.ini")
    FileWrite("serverip.ini", @IPAddress1)
    EndIf
    EndSwitch
    _Client_Suche($iSocket)
    WEnd

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

    Func _Client_Suche($iSocket)
    Local $sClient
    $sClient = TCPAccept($iSocket)
    If $sClient <> -1 Then
    _ArrayAdd($iClient_Socket, $sClient)
    $iClient_Socket[0] += 1
    $test = TCPSend ($iSocket,_packet ("Connection","Accept"))
    EndIf
    EndFunc ;==>_Client_Suche

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

    Func _Client_Rec($iSocket)

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

    EndFunc ;==>_Client_Rec

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

    Func _packet($iAktion,$iMsg ="")
    $iPacket = "time=[" & @HOUR & ":" & @MIN & ":" & @MIN & "]=" & @CRLF & _
    "aktion=[" & $iAktion & "]=" & @CRLF & _
    "msg=[" & $iMsg & "]=" & @CRLF & @CRLF
    Return $iPacket
    EndFunc ;==>_packet

    [/autoit]
  • daten vom server kannst du nicht über den listenen-socket schicken :)
    du musst den client_socket nutzten...
    also in deinem beispiel:
    zeile 61:

    [autoit]

    $test = TCPSend ($iClient_Socket[$iClient_Socket[0]],_packet ("Connection","Accept")) ;Wählt den zuletzt connecteden clientsocket und sendet das packet... später musst du dann anstatt $iClient_Socket[$iClient_Socket[0]] halt den index des clients nutzen: $iClient_Socket[3] oder wie ichs gemacht haber per for-schleife: $iClient_Socket[$iIndex]

    [/autoit]


    oder das hier:

    [autoit]

    $test = TCPSend ($sClient,_packet ("Connection","Accept")) ;$sClient ist die lokale ClientSocket Variable. kannst also die nur in der funktion und auch nur für diesen client der gerade connected ist nutzten^^

    [/autoit]