TCP Problem

  • hey,

    hatte das Problem, dass auf meinen Server nicht meherere Clienten connecten können.
    Zur Hilfe hat mir Sprenger120 ^^ was gebastelt ;)

    bloß habe ich das Problem, das jetzt gar nichts mehr geht. Es kommt nichts am Server an.

    Altes Script: (wo alles funktionierte :P )

    Server:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <String.au3>
    #include <Array.au3>
    Opt('MustDeclareVars', 1)

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

    ;==============================================
    ;==============================================
    ; SERVER!! Startet mich zuerst !!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================
    DirCreate("C:\Message\")

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

    Global $open
    Global Const $MAXCON = 50;

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

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

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

    Example()

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

    Func Example()
    ; Richte einige wiederverwendbare Informationen ein.
    ; Richte deine öffentliche IP Adresse (@IPAddress1) hier ein.
    ; Local $szServerPC = @ComputerName
    ; Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891
    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted, $ip, $host, $time
    Local $msg, $recv

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

    ; Startet den TCP Service
    ;==============================================
    TCPStartup()

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

    ; Erstellt einen lauschenden Port.
    ; Benutzt deine IP Adresse und den Port 33891. (Oben angegeben)
    ;==============================================
    $MainSocket = TCPListen($szIPADDRESS, $nPORT, $MAXCON)

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

    ; Wenn die Socketerstellung fehl schlägt, dann wird das Programm beendet.
    If $MainSocket = -1 Then Exit

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

    ; Erstellt eine GUI für Messages.
    ;==============================================
    $GOOEY = GUICreate("Message - Server IP: " & $szIPADDRESS, 550, 200)
    $edit = GUICtrlCreateEdit("", 10, 10, 300, 180)
    GUISetState()

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

    ; Initialisiert eine Variable um eine Verbindung anzugeben
    ;==============================================
    $ConnectedSocket = -1

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

    ; Wartet auf und akzeptiert eine Verbindung
    ;==============================================
    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1

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

    ; Bekommt die IP des verbundenen Clients
    $szIP_Accepted = SocketToIP($ConnectedSocket)

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

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

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

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

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

    ; Versucht Daten zu empfangen, bis zu 2048 bytes
    ;----------------------------------------------------------------
    $recv = TCPRecv($ConnectedSocket, 30000)

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

    ; Aktualisiert das Input-Control mit dem, was wir empfangen haben.
    ;----------------------------------------------------------------
    If $recv <> "" Then
    GUICtrlSetData($edit, _
    $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))
    $ip = _StringBetween($recv, "IP Adresse: ", " Computername:")
    $host = _StringBetween($recv, "Computername: ", " Zeit des Clienten:")
    $time = StringRight($recv, 8)
    IniWrite(@ScriptDir & "\recieved.ini", $ip[0], $host[0], $time)
    EndIf
    WEnd

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

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

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

    TCPShutdown()
    EndFunc ;==>Example

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

    Func TCPAcc()
    $hAcc = TCPAccept($MainSocket)
    If $hAcc > 0 Then _AddClient($hAcc)
    EndFunc ;==>TCPAcc
    ; Funktion um die IP Adresse eines verbundenen Sockets wiederzugeben.
    ;----------------------------------------------------------------------
    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]

    TCPStartup(); wird nur einmal aufgerufen

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

    Global $szIPADDRESS = "10.110.100.135"
    Global $nPORT = 33891
    Global $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
    AdlibRegister('_client', 5000); rufe die func _client alle 5 sec auf

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

    While 1
    Sleep(100)
    WEnd

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

    Func _client ()
    $szData = "IP Adresse: " & @IPAddress1 & " Computername: " & @ComputerName & " Zeit des Clienten: " & @HOUR & ":" & @MIN & ":" & @SEC
    TCPSend($ConnectedSocket, $szData)
    EndFunc ;==>_client

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

    Func _quit()
    TCPShutdown()
    EndFunc ;==>_quit

    [/autoit]


    Neues Script: ( mit mehrfach Verbindungen des Clients, welches nicht funktioniert^^ )

    Server:

    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    Opt("GUIOnEventMode", 1)
    TCPStartup()
    Global $IP = @IPAddress1
    Global $Port = 2134
    Global Const $MaxPendingConnection = 2 ;Maximal zugelassende Verbindungen
    Global $Socket = TCPListen($IP, $Port)

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

    Dim $Verbindungen[$MaxPendingConnection][4]

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

    For $x = 0 To UBound($Verbindungen) - 1 ;Array mit -1 befüllen
    $Verbindungen[$x][0] = -1
    $Verbindungen[$x][1] = -1
    $Verbindungen[$x][2] = -1
    $Verbindungen[$x][3] = -1
    Next

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

    $gui = GUICreate("Message - Server IP: " & $IP, 550, 200)
    GUISetOnEvent(-3, "_Exit")
    $edit = GUICtrlCreateEdit("", 10, 10, 300, 180)
    GUISetState()

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

    ;[0] = SocketID ; [1] = IP ;[2]=Timer ;[3]=PC name
    While 1
    For $x = 0 To UBound($Verbindungen) - 1
    If $Verbindungen[$x][0] = -1 Then
    $Verbindungen[$x][0] = TCPAccept($Socket)
    If $Verbindungen[$x][0] <> -1 Then
    $Timer = TimerInit()
    Do
    $Resv = TCPRecv($Verbindungen[$x][0], 1024)
    Until TimerDiff($Timer) >= 2000 Or $Resv <> ""

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

    If $Resv <> "" Then
    $Verbindungen[$x][1] = SocketToIP($Verbindungen[$x][0])
    $Verbindungen[$x][3] = $Resv

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

    ConsoleWrite("Neuer Client:" & $Verbindungen[$x][3] & @CRLF)
    Else
    TCPCloseSocket($Verbindungen[$x][0])
    $Verbindungen[$x][0] = -1
    $Verbindungen[$x][1] = -1
    $Verbindungen[$x][2] = -1
    $Verbindungen[$x][3] = -1
    EndIf
    EndIf
    EndIf

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

    $Resv = TCPRecv($Verbindungen[$x][0], 1024)
    If @error And $Verbindungen[$x][0] <> -1 Then
    ConsoleWrite("Client " & $Verbindungen[$x][3] & " hat den Server verlassen" & @CRLF)
    TCPCloseSocket($Verbindungen[$x][0])
    $Verbindungen[$x][0] = -1
    $Verbindungen[$x][1] = -1
    $Verbindungen[$x][2] = -1
    $Verbindungen[$x][3] = -1
    EndIf
    If $Resv <> "" And $Verbindungen[$x][0] <> -1 Then
    GUICtrlSetData($edit, _
    $Verbindungen[$x][1] & " > " & $Resv & @CRLF & GUICtrlRead($edit))
    $IP = $Verbindungen[$x][1]
    $host = $Verbindungen[$x][3]
    IniWrite(@ScriptDir & "\recieved.ini",$host,_Now() ,$Resv)
    EndIf
    Next
    WEnd

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

    ; Funktion um die IP Adresse eines verbundenen Sockets wiederzugeben.
    ;----------------------------------------------------------------------
    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] [autoit][/autoit] [autoit]

    Func _Exit()
    For $x = 0 To UBound($Verbindungen) - 1
    TCPCloseSocket($Verbindungen[$x][0])
    Next
    TCPShutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]


    Client:

    Spoiler anzeigen
    [autoit]

    TCPStartup(); wird nur einmal aufgerufen

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

    Global $szIPADDRESS = "10.110.100.135"
    Global $nPORT = 33891
    Global $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)

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

    TCPSend($ConnectedSocket,@ComputerName)

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

    AdlibRegister('_client', 5000); rufe die func _client alle 5 sec auf

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

    While 1
    Sleep(100)
    WEnd

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

    Func _client ()
    $szData = "IP Adresse: " & @IPAddress1 & " Computername: " & @ComputerName & " Zeit des Clienten: " & @HOUR & ":" & @MIN & ":" & @SEC
    TCPSend($ConnectedSocket, $szData)
    EndFunc ;==>_client

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

    Func _quit()
    TCPShutdown()
    EndFunc ;==>_quit

    [/autoit]

    Hoffe mal ihr könnt helfen :) wär nett

    Gruß

    Kev

  • das neue script funktioniert einwandfrei, das einzigste, was du machen MUSST ist beim clienten port überprüfen(der muss der gleiche sein, wie beim server) und ob die ip gleich ist ^^

    Mfg. PCKing


    Mein PC

    CPU: AMD FX 8350 8x4.00GHz
    Ram: 8GB DDR3
    Grafikkarte: Nvidia Geforce GTX 960 (4GB)
    Festplatten: 500GB SSD 1TB HDD
    Laufwerk: Blueray RW+ Brenner

  • shit der port, ich depp ^^ thx

    andere sache;

    bei dem alten script wird der eintrag den der server speichert, automatisch ersetzt.

    das heißt:

    pc1 sendet: Ip: 10.110.23.32. Name : pc1.test.pc : time : 12:32:33

    un wenn der gleiche pc wieder sendet

    dann ersetzt er diesen eingetragenen string in der recieved.ini mit dem andern neuenstring des gleichen pcs.
    das ist beim neuen nicht der fall why :(