TCP 2 Clients 1 Server

  • Hallo.


    Ich versuche grade Über TCP 2 Clients mit nem Server zu Verbinden.

    Ich habe nun das Problem das wenn sie sich verbunden haben
    das ich die die von den Client's per TCPRecv Daten nicht mehr beim Server ankommen.

    Wenn ich zulasse das sich nur 1 Client verbinden kann funktioniert es.

    Meine Server:

    Spoiler anzeigen
    [autoit]

    /*Inculde*/
    #include <GUIConstants.au3>
    #include <GUIListView.au3>
    #include <iNet.au3>

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

    ;/*Traymenu*/
    TraySetClick(8)
    TrayItemSetOnEvent(TrayCreateItem('Beenden'), '_close')
    TraySetOnEvent(-7, "_restore")

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

    ;/*Deklaration*/
    Global Const $TCP_IP = @IPAddress1
    Global Const $TCP_PORT = 4851
    Dim $ConnectedSocket = -1
    Dim $incoming, $socketToIP

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

    ;/*GUI*/
    $server = GUICreate('IMS', 200, 300, Default, Default, $WS_BORDER+$WS_SYSMENU)
    $userList = GUICtrlCreateListView('a', 2, 2, 192, 272, $LVS_NOCOLUMNHEADER+$LVS_SINGLESEL)
    _GUICtrlListViewSetColumnWidth($userList, 0, 180)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_minimize', $server)
    GUISetState()

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

    ;/*TCP StartUP*/
    TCPStartup()

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

    $MAINSOCKET=TCPListen($TCP_IP, $TCP_PORT)

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

    ;/*Main While*/
    While 1
    ;If $ConnectedSocket = -1 Then
    Do
    $ConnectedSocket=TCPAccept($MAINSOCKET)
    $socketToIP = _SocketToIP($ConnectedSocket)
    Until $ConnectedSocket <> -1
    If $ConnectedSocket > 0 Then
    GUICtrlCreateListViewItem(_TCPIpToName($socketToIP), $userList)
    GUICtrlCreateListViewItem($ConnectedSocket, $userList)
    EndIf
    ;
    If $ConnectedSocket <= 0 Then
    $ConnectedSocket = -1
    EndIf
    ;EndIF
    $incoming = TCPRecv($ConnectedSocket, 250)
    If $incoming <> '' Then
    GUICtrlCreateListViewItem($socketToIP & ' > ' & $incoming , $userList)
    EndIf
    Sleep(100)
    WEnd

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

    ;/*Functions*/
    Func _close()
    TCPCloseSocket($ConnectedSocket)
    TCPShutdown()
    Exit
    EndFunc
    ;//
    Func _minimize()
    GUISetState(@SW_HIDE, $server)
    EndFunc
    ;//
    Func _restore()
    GUISetState(@SW_RESTORE, $server)
    GUISetState(@SW_SHOW, $server)
    EndFunc
    ;//
    Func _SocketToIP($SHOCKET)
    Local $sockaddr = DLLStructCreate("short;ushort;uint;char[8]")

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

    Local $aRet = DLLCall("Ws2_32.dll","int","getpeername","int",$SHOCKET, _
    "ptr",DLLStructGetPtr($sockaddr),"int_ptr",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

    [/autoit]

    Was mache ich falsch bzw wie mache ich es richtig?

  • sry hab jetzt keine zeit aber kann es sein dass der server nachdem er meldung von einem client bekommt aufhört?

    • Offizieller Beitrag

    Hallo

    Bei Multichat server sieht es nochmal etwas anders aus mit dem TCP. Als erstes musst du in der Funktion die "MaxPendingConnection" eingeben. Max Pending Connection ist die Anzahl der Clients die auf den Server verbinden können. (Siehe Hilfe)
    Dazu kommt das du TCPAccept nicht einfach als eine Variable Declarieren kannst sondern da brauchst du ein Array, weil es ja mehr als 1 "ConnectedSocket" gibt.

    HIER gibt es ein Beispiel im englischen Forum und HIER hab ich auch mal ein etwas Komplexeren Multichat mit peethebee's RSA Verschlüsselung Programmiert.

    Hoffe das hilft :)

    Mfg Spider