TCP Problem bei 2 verbindungen.

  • Hi,

    Also ich versuche gerade mir ion AutoIt ein "Telnet-Ersatz" zu schreiben, ich benutze folgendes konzept:

    1. Server wird auf einem PC gestartet (feste IP).
    2. Client wird gestartet und verbindet sich mit dem Server.
    3. Der Server kann Kommandos zum Client senden.

    Wenn ich nun aber mehr als eine Verbindung zum Server herstellen will klappts nich, es kommt einfach nichts an... :thumbdown:

    Server Source
    [autoit]


    #include <GUIConstants.au3>
    #include <Process.au3>
    #include <Misc.au3>

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

    TCPStartUp()

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

    Dim $szIPADDRESS = @IPAddress1
    Dim $nPORT = 31758

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

    Dim $mGUI = GUICreate("(IP: " & $szIPADDRESS & ")",300,200)
    Dim $edit = GUICtrlCreateEdit("",10,10,280,150)
    Dim $cmdbox = GUICtrlCreateInput("", 10, 170, 215, 20)
    Dim $sendcmd = GUICtrlCreateButton("Send", 240, 170, 50, 20)
    ControlFocus($mGUI, "", $sendcmd)
    GUISetState()

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

    $MainSocket = TCPListen($szIPADDRESS,$nPORT)

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

    Dim $ConnectedSocket = -1

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

    Do
    $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1

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

    Dim $szData

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

    $acceptIP = SocketToIP($ConnectedSocket)

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

    If @error Then
    MsgBox(4112,"Error","TCPConnect failed with WSA error: " & @error)
    Else
    While 1

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

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $sendcmd
    $cmd = GUICtrlRead($cmdbox)
    TCPSend($ConnectedSocket, $cmd)
    EndSwitch

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

    If _IsPressed("0D") Then
    $cmd = GUICtrlRead($cmdbox)
    TCPSend($ConnectedSocket, $cmd)
    Sleep(800)
    EndIf

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

    $recv = TCPRecv( $ConnectedSocket, 2048 )

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

    If $recv <> "" Then GUICtrlSetData($edit, GUICtrlRead($edit) & "> " & $recv & @CRLF)

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

    If @error Then ExitLoop
    WEnd
    EndIf

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

    Func SocketToIP($SHOCKET)
    Local $sockaddr = DLLStructCreate("short;ushort;uint;char[8]")
    Local $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
    $sockaddr = 0
    Return $aRet
    EndFunc

    [/autoit]
    Client Source
    [autoit]


    #include <GUIConstants.au3>
    #include <Constants.au3>
    #include <File.au3>

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

    $IP = InputBox("Enter IP", "Enter IP")

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

    Dim $firstconnect = 1
    Dim $szIPADDRESS = $IP
    Dim $nPORT = 31758

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

    TCPStartUp()

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

    $MainSocket = TCPConnect($szIPADDRESS, $nPORT)

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

    If $MainSocket = -1 Then Exit

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

    GUICreate("(IP: " & $szIPADDRESS & ")",300,200)
    $edit = GUICtrlCreateEdit("",10,10,280,150)
    GUISetState()

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

    Dim $recv

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

    While 1

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

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch

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

    $recv = TCPRecv( $MainSocket, 2048 )

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

    If $firstconnect = 1 Then
    Local $tempip, $wanip , $cut1, $cut2, $ipfile
    InetGet ("http://checkip.dyndns.org", @TempDir & "\waniptemp.txt", 1,1)
    $ipfile= FileOpen(@TempDir & "\waniptemp.txt",0)
    $tempip = FileRead($ipfile,120 )
    FileClose($ipfile)
    FileDelete (@TempDir & "\waniptemp.txt")
    $cut1 = StringInStr($tempip, "Address:")
    $cut2 =StringInStr($tempip, "</body>")
    $wanip = StringMid($tempip, $cut1+8, $cut2-($cut1+8))

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

    Sleep(5000)

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

    TCPSend($MainSocket, $wanip & ": Connection Successfull!")
    $firstconnect = 0
    EndIf

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

    If $recv <> "" Then GUICtrlSetData($edit,"> " & $recv & @CRLF & GUICtrlRead($edit))
    WEnd

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

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

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

    TCPShutDown()

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

    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]

    Bitte um hilfe....

  • Wie bau ich das den ein?

    Ich hab bei TCPListen meine lokale IP eingegeben, wenn ich das aber bei nem Freund teste (Teamviewer) dann kann der wunderbar Connecten nur wenn ich das dann Lokal nochmal starte gehts nicht...

  • Ja und warum kommt nix an von der 2ten Verbindung weil du keine 2 te zulässt

    hier habe ich mal ein Beispiel für einen Multikonnect Server


    [autoit]


    ;By Sprenger120
    TCPStartup()
    $MaxConnections = 2

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

    $Socket = TCPListen(@IPAddress1, 1500, $MaxConnections)

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

    Dim $Verbindungen[$MaxConnections]
    For $x = 0 To UBound($Verbindungen) - 1
    $Verbindungen[$x] = -1
    Next

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

    While
    For $x = 0 To UBound($Verbindungen) - 1
    If $Verbindungen[$x] = -1 Then
    $Verbindungen[$x] = TCPAccept($Socket)
    If $Verbindungen[$x] <> -1 Then ConsoleWrite("Neuer Client verbunden" & @CRLF)
    EndIf

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

    $Resv = TCPRecv($Verbindungen[$x], 1024)
    If @error And $Verbindungen[$x] <> -1 Then
    TCPCloseSocket($Verbindungen[$x])
    $Verbindungen[$x] = -1
    ConsoleWrite("Client hat den Server verlassen" & @CRLF)
    EndIf

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

    If $Resv <> "" Then MsgBox(0, "Empfangen", $Resv)
    Next
    WEnd

    [/autoit]