TCP Frage einfaches senden :o

  • Huhu
    Ja ich weis beim besten Willen nicht wie ich es lösen soll.
    Ich möchte einfach das ich mit mehreren Kumpels mir ein Programm aufn PC mache und wenn 1ner auf einen Button klickt soll bei den anderen ne kurze MsgBox kommen welchen Button er geklickt hat.
    Das eine was ich habe ist des Grundgerüst :o
    Ich hoffe ihr könnt mir vielleicht helfen.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 358, 294, 192, 124)
    $b1 = GUICtrlCreateButton("1", 24, 24, 81, 41)
    $b3 = GUICtrlCreateButton("3", 21, 212, 81, 41)
    $b2 = GUICtrlCreateButton("2", 238, 22, 81, 41)
    $b4 = GUICtrlCreateButton("4", 241, 214, 81, 41)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $b1
    Button1()
    Case $b2
    Button2()
    Case $b3
    Button3()
    Case $b4
    Button4()
    EndSwitch
    WEnd

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

    Func Button1()
    TCPStartup

    TCPShutdown
    EndFunc

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

    Func Button2()
    TCPStartup

    TCPShutdown
    EndFunc

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

    Func Button3()
    TCPStartup

    TCPShutdown
    EndFunc

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

    Func Button4()
    TCPStartup

    TCPShutdown
    EndFunc

    [/autoit]

    Grüße

  • Mal über die Forensuche nach TCPSend suchen. Da gibt es viele Beispiele die funktionieren.
    Nur so als Tipp du Brauchst nen Server und nen Client oder nen Client der senden und empfangen kann.

    MfG
    Der_Doc

  • Also hab das jetzt mal versucht.
    Achtet auf den unteren Teil^^

    Spoiler anzeigen

    Client

    [autoit]

    Opt('MustDeclareVars', 1)

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

    ;==============================================
    ;==============================================
    ; CLIENT! Startet mich, nachdem der Server gestartet wurde!!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================

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

    Example()
    Clientrecv()

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

    Func Example()
    ; Richte einige wiederverwendbare Informationen ein.
    ;--------------------------
    Local $ConnectedSocket, $szDatam, $daten, $szData, $MainSocket
    ; Set $szIPADDRESS Wir ändern den PC-Namen in eine IP-Adresse.
    ; Local $szServerPC = @ComputerName
    ; Local $szIPADDRESS = TCPNameToIP($szServerPC)
    Local $szIPADDRESS = "192.168.0.43"
    Local $nPORT = 33891

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

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

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

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

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

    ; Versucht, zu einem Server mit der IP und dem PORT 33891 zu verbinden.
    ;=======================================================
    $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)

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

    ; Falls es einen Fehler gibt, wird er angezeigt
    If @error Then
    MsgBox(4112, "Fehler", "TCP-Connect schlug mit folgendem WSA-Fehler fehl: " & @error)
    ; Wenn es keinen Fehler gibt, dann erscheint wiederholt eine Inputbox zur Eingabe von Daten, die zum Server gesendet werden sollen.
    Else
    ; Fragt fortwährend nach Daten, die zum Server gesendet werden sollen.
    $szData = InputBox("Daten für den Server", @LF & @LF & "Gib Daten ein, die zum Server transferiert werden sollen:")
    While 1
    ; Wenn die Inputbox geschlossen wird oder leer bleibt, wird die Schleife beendet.
    If @error Then ExitLoop

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

    ; Wir sollten Daten in $szData haben... Lasst uns versuchen, sie durch unseren verbundenen Socket zu versenden.
    TCPSend($ConnectedSocket, $szData)

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

    ; Wenn das Senden mit @error fehlgeschlagen ist, dann ist der Socket getrennt.
    ;----------------------------------------------------------------
    If @error Then ExitLoop
    $daten = TcpRecv($ConnectedSocket, 2048)
    Sleep(500)
    MsgBox(0,"Daten", $daten)
    WEnd
    EndIf
    EndFunc ;==>Example

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

    Func Clientrecv()

    EndFunc

    [/autoit]
    Spoiler anzeigen

    Server

    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt('MustDeclareVars', 1)

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

    ;==============================================
    ;==============================================
    ; SERVER!! Startet mich zuerst !!!!!!!!!!!!!!!
    ;==============================================
    ;==============================================

    [/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 = "192.168.0.43"
    Local $nPORT = 33891
    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted
    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)

    [/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("Mein Server (IP: " & $szIPADDRESS & ")", 300, 200)
    $edit = GUICtrlCreateEdit("", 10, 10, 280, 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, 2048)

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

    ; Wenn der Empfang mit @error fehlschlägt, dann hat sich der Socket getrennt.
    ;----------------------------------------------------------------
    If @error Then ExitLoop

    [/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))

    WEnd
    TCPSend($MainSocket, $recv)

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

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

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

    TCPShutdown()
    EndFunc ;==>Example

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/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][/autoit]

    Es funktioniert soweit alles nur das beim Clienten dann in der MsgBox keine Daten stehn also irgendwie leer.
    Weis einer was?

  • [...]nur das beim Clienten dann in der MsgBox keine Daten stehn also irgendwie leer.
    Weis einer was?

    Der Server sendet ja nichts, also kann der Client auch nichts empfangen ;)
    Schau mal wo dein TCPSend beim Server ist, außerhalb der While-Schleife, somit kann erst dann gesendet werden, wenn die Schleife verlassen wird.
    Bring mal die TCPSend($MainSocket, $recv) in die Schleife.

    Außerdem ist $MainSocket falsch!
    Da muß $ConnectedSocket stehen. So wie bei TCPRecv ;)