TCP - Bei jeder Communikation eine neue verbindung aufbauen???

  • Hey Leute...

    kurz vorweg, ich war schon in VIELEN VIELEN Tutorials um euch nicht wieder mit den TCP-Befehlen nerven zu müssen und trotzdem fand ich einfach keine Antwort auf meine Frage die da lautet:

    muss ich für jedesmal Datenaustausch ne neue Socket-Verbindung erstellen???

    zu meinem Problem:

    Client:

    [autoit]

    TCPStartup()

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

    $so = TCPConnect ("127.0.0.1", 1234)
    If $so = -1 then Exit
    TCPSend ($so, "Hallo Leute")
    TCPCloseSocket ($so)

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

    TCPShutdown()

    [/autoit]


    Server:

    [autoit]

    TCPStartup()

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

    $ip = '127.0.0.1'
    $port = 1234

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

    $socket = TCPListen ($ip,$port)

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

    While 1
    $con = TCPAccept ($socket)
    if $con >= 0 Then
    $rec = ""
    While 1
    $rec &= TCPRecv ($con, 2048)
    If $rec <> "" Then ExitLoop
    WEnd
    MsgBox (0,"", $rec)
    EndIf
    WEnd

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

    TCPShutdown()

    [/autoit]

    diese Version hab ich im Internet gefunden und kommt nahe an das, was ich haben will...
    wie die Überschrift schon sagt ich nämlich meine Frage, ob ich jedesmal für eine "kommuntikation" einen neuen Socket öffnen und danach wieder schlie´ßen muss...
    geht es nicht, dass man den gleichen socket im ganzen Programm nutzt??


    hoffe ich habe es einigermaßen verständlich ausgedrückt..!
    vielen dank für eure antworten..

    2 Mal editiert, zuletzt von Mr_gitarre (5. April 2010 um 19:30)

  • Edit

    habs jetzt wie folgt geändert, unschön aber dafür hässlich...;)
    macht man das so??

    client:

    [autoit]

    TCPStartup()

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

    While 1
    $so = TCPConnect ("127.0.0.1", 1234)
    If $so = -1 then Exit
    TCPSend ($so, "Hallo Leute")
    TCPSend ($so, " ")

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

    MsgBox (0,"","HIER")
    WEnd
    ;TCPShutdown()

    [/autoit]

    Server:

    [autoit]

    TCPStartup()

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

    $ip = '127.0.0.1'
    $port = 1234

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

    $socket = TCPListen ($ip,$port)

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

    While 1
    $con = TCPAccept ($socket)
    if $con >= 0 Then
    $rec = ""
    While 1
    $rec &= TCPRecv ($con, 2048)
    If $rec <> " " Then ExitLoop
    WEnd
    MsgBox (0,"", $rec)
    EndIf
    WEnd

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

    TCPShutdown()

    [/autoit]
  • ok, hier mein OriginalProgramm:

    und mein problem ist wie gesagt der zu wechselnde socket!:(

    host:

    [autoit]

    $HIP = "127.0.0.1"

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

    TCPStartup()
    $mainsocket = TCPListen ($HIP, "1234")

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

    While 1

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

    $connectedsocket = TCPAccept ($mainsocket)
    If $connectedsocket >= 0 Then
    While 1
    $sendedItem = TCPRecv ($connectedsocket, 2048 )
    If @error Then ExitLoop ;hier weiß ich nich, was hinkommen muss um zu sagen, dass das alles vom senden war..., die nachricht wird erst geöffnet, wenn der Client geschlossen wird
    WEnd
    MsgBox (0,"",$sendedItem)
    EndIf
    WEnd

    [/autoit]

    Connecter:

    [autoit]

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

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

    TCPStartup()

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

    $Form1 = GUICreate("Form1", 338, 160, 192, 114)
    $L_IP = GUICtrlCreateInput("127.0.0.1", 32, 24, 201, 21)
    $B_Connect = GUICtrlCreateButton("Connect!", 248, 24, 81, 25, $WS_GROUP)
    $L_Status = GUICtrlCreateInput("", 0, 136, 337, 21)
    $B_Message = GUICtrlCreateButton("Message-Service", 0, 88, 161, 25, $WS_GROUP)
    $B_Run = GUICtrlCreateButton("RUN-Service", 168, 88, 169, 25, $WS_GROUP)

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

    GUICtrlSetState($L_Status, $GUI_DISABLE)
    GUISetState(@SW_SHOW)

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

    Global $connected = "0"
    Global $mainsocket

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $B_Connect
    connecting ()
    Case $B_Message
    If $connected = "0" Then
    MsgBox (0,"","You arn`t connected")
    Else
    message ()
    EndIf
    EndSwitch
    WEnd

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

    Func connecting ()
    MsgBox (0,"","Connecting to " & GUICtrlRead ($L_IP))
    Do
    If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
    $mainsocket = TCPConnect (GUICtrlRead ($L_IP), 1234)
    Until $mainsocket <> "-1"
    Global $connected = "1"
    Global $ConnectedIP = GUICtrlRead ($L_IP)
    MsgBox (0,"","Connected to " & GUICtrlRead ($L_IP))

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

    EndFunc

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

    Func message()

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

    $Form1 = GUICreate("Form1", 409, 111, 192, 114)
    $B_MessageSend = GUICtrlCreateButton("Send!", 232, 80, 161, 25, $WS_GROUP)
    $L_Message = GUICtrlCreateInput("Message", 8, 32, 385, 21)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $B_MessageSend
    MsgBox (0,"", "Connected IP: " & $ConnectedIP)
    MsgBox (0,"", "Send Message: " & GUICtrlRead ($L_Message))
    TCPSend ($mainsocket, GUICtrlRead ($L_Message))
    ; TCPCloseSocket ($mainsocket)
    EndSwitch
    WEnd

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

    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit]
  • ok, zu deinem Client:

    Wenn du mal genau schaust...

    Was macht er?
    Wenn er in der 2. While drinnen ist macht er folgendes: Er Empfängt ständig Daten und wenn das @error-Makro gesetzt wird, dann geht er aus der Schleife hinaus (@error wird gesetzt wenn die Verbindung unterbrochen wird zb TCPCloseSocket beim Server)

    und er DANN zeigt er an was der empfangen hat..

    ich schreib dir kurz ein BSP-Skript..

    EDIT:
    Hier ein kurzes BSP skript für einen Client:


    [autoit]

    ; CLIENT!!!

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

    $IP = '...'
    $PORT = '...'

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

    If MsgBox(4,"Verbinden?","Verbinden zu IP: " & $IP & ":" & $PORT & " ?") = 7 Then Exit

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

    TCPStartup()

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

    $SERVERSOCKET = TCPConnect($IP,$PORT)
    If $SERVERSOCKET = -1 Then
    MsgBox(48,"ERROR","Verbindung zu " & $IP & ":" & $PORT & " nicht möglich!" & @LF & "Listening Socket auf dem Server sicher vorhanden und gestartet?")
    Exit
    EndIf

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

    While 1
    $sMSG = InputBox("Nachricht","Was soll an den Server gesendet werden?" & @LF & "Abbrechen drücken um das Skript zu verlassen!") ; Nachricht eingeben dir geschickt werden soll
    If @error Then ExitLoop ; Abbrechen button wurde gedrückt
    If TCPSend($SERVERSOCKET,$sMSG) = 0 Then MsgBox(48,"ERROR","Daten konnten nicht an den Server verschickt werden!") ; Siehe Hilfe, TCPSend gibt 0 zurück falls erfolglos -> Errormeldung das die Daten nicht geschickt werden konnten
    Sleep(100) ; Um den Prozessor zu schonen, eigentlich nicht nötig, da die Inputbox die Schleife anhält
    WEnd
    TCPShutdown()

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

    und hier ein kurzes Server-BSP-Skript, hab eigentlich alles notwendige kommentiert, falls du was nicht verstehst einfach fragen:

    [autoit]

    ; SERVER!!!

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

    TCPStartup()

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

    $IP = @IPAddress1
    $PORT = '...'

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

    TrayTip("","Warte auf eingehende Verbindungen..",1)

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

    $MAINSOCKET = TCPListen($IP,$PORT) ; Listening socket erzeugen

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

    Do
    $TEMPSOCKET = TCPAccept($MAINSOCKET)
    Sleep(100)
    Until $TEMPSOCKET <> -1 ; Warten bis sich ein Client verbunden hat

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

    TrayTip("","CLIENT VERBUNDEN!",1)

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

    $MYCLIENTSOCKET = $TEMPSOCKET ; Socket umdefiniern (nicht zwingend notwendig)
    $TEMPSOCKET = ''

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

    While 1 ; Endlos-empfangs-schleife
    $TEMPRECV = TCPRecv($MYCLIENTSOCKET,8192) ; Probieren Daten zu empfangen
    If $TEMPRECV <> '' Then ; Falls erfolgreich, sprich Daten wurde empfangen -> Daten darstellen
    If MsgBox(4,"DATEN EMPFANGEN","Daten vom Client: " & @LF & $TEMPRECV & @LF & "Verbindung beenden?") = 6 Then ExitLoop ; Daten darstellen und gleichzeitig fragen, ob die Verbindung beendet werden soll
    ; Falls Verbindung beendet werden soll -> mit Exitloop aus schleife raus -> außerhalb von Schleife, Verbindung schließen und beenden
    EndIf
    Sleep(100)
    WEnd

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

    TCPCloseSocket($MYCLIENTSOCKET)
    TCPShutdown()

    [/autoit]


    Wichtig ist, dass du während des empfangens schon die Daten darstellst (MsgBox, TrayTip, Edit, Input was auch immer)MsgBox ist eigentlich nicht so gut, da es die Schleife anhält, es werden zwar Daten weiterhin empfangen, aber nicht sofort dargestellt. .

  • wofür brauchsten das:

    [autoit]

    $MYCLIENTSOCKET = $TEMPSOCKET ; Socket umdefiniern (nicht zwingend notwendig)
    $TEMPSOCKET = ''

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

    und wie schafft man es, dass er mittendrin erkennt, dass die Verbindung unterbrochen ist und damit wieder zur Hauptschleife "Warte auf Verbindung" kommt?

  • also ich habs jetzt so:

    Connecter:

    [autoit]

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

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

    TCPStartup()

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

    $Form1 = GUICreate("Form1", 338, 160, 192, 114)
    $L_IP = GUICtrlCreateInput("127.0.0.1", 32, 24, 201, 21)
    $B_Connect = GUICtrlCreateButton("Connect!", 248, 24, 81, 25, $WS_GROUP)
    $L_Status = GUICtrlCreateInput("", 0, 136, 337, 21)
    $B_Message = GUICtrlCreateButton("Message-Service", 0, 88, 161, 25, $WS_GROUP)
    $B_Run = GUICtrlCreateButton("RUN-Service", 168, 88, 169, 25, $WS_GROUP)

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

    GUICtrlSetState($L_Status, $GUI_DISABLE)
    GUISetState(@SW_SHOW)

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

    Global $connected = "0"
    Global $mainsocket

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $B_Connect
    connecting ()
    Case $B_Message
    If $connected = "0" Then
    MsgBox (0,"","You arn`t connected")
    Else
    message ()
    EndIf
    EndSwitch
    WEnd

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

    Func connecting ()
    MsgBox (0,"","Connecting to " & GUICtrlRead ($L_IP))
    Do
    If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
    $mainsocket = TCPConnect (GUICtrlRead ($L_IP), 1234)
    Until $mainsocket <> "-1"
    Global $connected = "1"
    Global $ConnectedIP = GUICtrlRead ($L_IP)
    MsgBox (0,"","Connected to " & GUICtrlRead ($L_IP))

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

    EndFunc

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

    Func message()

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

    $Form1 = GUICreate("Form1", 409, 111, 192, 114)
    $B_MessageSend = GUICtrlCreateButton("Send!", 232, 80, 161, 25, $WS_GROUP)
    $L_Message = GUICtrlCreateInput("Message", 8, 32, 385, 21)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $B_MessageSend
    MsgBox (0,"", "Connected IP: " & $ConnectedIP)
    MsgBox (0,"", "Send Message: " & GUICtrlRead ($L_Message))
    TCPSend ($mainsocket, GUICtrlRead ($L_Message))
    ; TCPCloseSocket ($mainsocket)
    EndSwitch
    WEnd

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

    EndFunc

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

    Host:

    [autoit]

    $HIP = "127.0.0.1"

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

    TCPStartup()
    $mainsocket = TCPListen ($HIP, "1234")

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

    While 1
    $connectedsocket = TCPAccept ($mainsocket)
    If $connectedsocket >= 0 Then
    While 1
    $sendedItem = TCPRecv ($connectedsocket, 2048 )
    If $sendedItem <> '' Then
    MsgBox (0,"",$sendedItem)
    EndIf
    WEnd
    EndIf
    WEnd

    [/autoit]

    und ich bekomm es nich hin, zur Hauptschleife "Höre auf neue Verbindung" zu kommen, wenn die Verbindung wieder verlohren gegangen ist...!

    2 Mal editiert, zuletzt von Mr_gitarre (4. April 2010 um 00:25)

  • EDIT:

    Problem gelöst;)

    [autoit]

    $HIP = "127.0.0.1"

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

    TCPStartup()
    $mainsocket = TCPListen ($HIP, "1234")

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

    While 1
    $connectedsocket = TCPAccept ($mainsocket)
    If $connectedsocket >= 0 Then
    While 1
    $sendedItem = TCPRecv ($connectedsocket, 2048 )
    If @error then ExitLoop ;Für eventuelle neuverbindung verantwortlich
    If $sendedItem <> '' Then
    MsgBox (0,"",$sendedItem)
    EndIf
    WEnd
    EndIf
    WEnd

    [/autoit]
  • warum ich das umdefiniert habe?

    reines schönheitsmakel xD
    nach her ist es ja kein "Temporärer Socket" mehr sondern ein fixer..

    zu deinem Problem:
    Schön das dus alleine geschafft hast :D

    Aber wie bereits erwähnt, MsgBox ist nicht so klug, da das Skript dann nicht weiterläuft. TCP hat zwar einen Buffer der trotzdem alles empfängt aber naja, ich würd da an deiner Stelle entweder gleich mit einem LogFile oder eben mit einem Edit/Input arbeiten

    [autoit]

    GuiCtrlCreateEdit

    [/autoit]

    bzw

    [autoit]

    GuiCtrlCreateInput

    [/autoit]

    ..
    Aber ist Geschmacksache ;)

    PS: Ein Sleep(100) in der TCPAccept-schleife könnte auch nicht schaden, ansonsten: CPU Auslastung > 50% ^^