Fehler im Script (TCP)

  • Hi,
    ich habe irgendwo einen/zwei Fehler im Script, die ich beim besten Willen nicht finde :(.

    Ich habe zwei Scripte:
    Das 1. soll einen Befehl zum 2. senden und das soll dann, wenn der Befehl angekommen ist, sowas wie "OK" zurück zum 1. senden.

    Script 1
    [autoit]

    ;Includes:
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    #include <GuiIPAddress.au3>
    #include <ButtonConstants.au3>
    ;Options:
    Opt("GUIOnEventMode", 1)
    ;--------
    BefehlEingeben()

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

    Func BefehlEingeben()
    Opt("GUIOnEventMode",0)
    $BForm1 = GUICreate("Befehl eingeben", 344, 110)
    $BLabel1 = GUICtrlCreateLabel("Bitte gebe die IP-Adresse ein, an die der Befehl gesendet werden soll:", 0, 0, 332, 17)
    $BIPAddress1 = _GUICtrlIpAddress_Create($BForm1, 8, 16, 130, 21)
    _GUICtrlIpAddress_Set($BIPAddress1, "127.0.0.1")
    $BLabel2 = GUICtrlCreateLabel("Bitte gebe den zu Sendenen Befehl ein:", 0, 40, 192, 17)
    $BInput1 = GUICtrlCreateInput("Connect|Parameter", 8, 56, 329, 21)
    $BButton1 = GUICtrlCreateButton("Abbrechen", 264, 80, 75, 25, $WS_GROUP)
    $BButton2 = GUICtrlCreateButton("Senden", 184, 80, 75, 25,$BS_DEFPUSHBUTTON)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE,$BButton1
    GUIDelete($BForm1)
    Opt("GUIOnEventMode",1)
    ExitLoop
    Case $BButton2
    $IP=_GUICtrlIpAddress_Get($BIPAddress1)
    $Text=GUICtrlRead($BInput1)
    GUIDelete($BForm1)
    Opt("GUIOnEventMode",1)
    SendSth($IP,$Text)
    ExitLoop
    EndSwitch
    WEnd
    EndFunc
    ;------------------

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

    ;-------Funktionen---------
    Func CreateStatus($Message,$Type=4)
    ;Eigendlich mehr, der Übersicht halber aber weggelassen ;)
    MsgBox(0,"",$Message)
    EndFunc

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

    Func SendSth($IP,$Befehl,$Call="",$Parameter="")
    TCPStartup()
    $socket=TCPConnect($IP,4321)
    If $socket=-1 Then
    CreateStatus("Fehler: Verbindung zu "&$IP&" konnte nicht hergestellt werden!",3)
    TCPCloseSocket($socket)
    TCPShutdown()
    Else
    $sendedBytes=TCPSend($socket,$Befehl)
    CreateStatus("'"&$Befehl&"' -> '"&$IP&"'",1)
    If $sendedBytes=0 Then
    CreateStatus("Befehl konnte nicht gesendet werden",3)
    TCPCloseSocket($socket)
    TCPShutdown()
    Else
    TCPCloseSocket($socket)
    TCPShutdown()
    GetSth($IP,$Call,$Parameter)
    EndIf
    EndIf
    EndFunc

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

    Func GetSth($IP,$Call="",$Parameter="")
    ;Auf Antwort warten
    TCPStartup()
    $mainsocket=TCPListen($IP,4321)
    While 1
    $acceptedSocket = TCPAccept($mainsocket)
    If $acceptedSocket<>-1 Then ;Etwas empfangen
    $Data = TCPRecv($acceptedSocket, 2048) ;$Data = Empfangener Text
    MsgBox(0,"1","Antwort erhalten: "&$Data)
    EndIf
    TCPCloseSocket($acceptedSocket)
    TCPShutdown()
    WEnd
    TCPShutdown()
    ToolTip("")
    EndFunc

    [/autoit]
    Script 2
    [autoit]

    ;TCP starten
    TCPStartup()

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

    Global $mainsocket
    $mainsocket = TCPListen("127.0.0.1",4321)
    AdlibRegister("WaitForMsg",100)

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

    While 1
    Sleep(2000)
    WEnd

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

    Func WaitForMsg()
    Global $Data
    $acceptedSocket = TCPAccept($mainsocket)
    If $acceptedSocket<>-1 Then ;Etwas empfangen
    MsgBox(0,"2","Etwas empfangen...")
    $Data = TCPRecv($acceptedSocket, 2048) ;$Data = Empfangener Text
    $Data=StringSplit($Data,"|")
    If $Data[1]="Connect" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Then ;Überprüfen, ob Funktion existiert
    Call($Data[1])
    EndIf
    TCPCloseSocket($acceptedSocket)
    EndIf
    TCPShutdown()
    EndFunc

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

    Func Connect()
    Answer("Jo, hat geklappt!")
    EndFunc

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

    Func Answer($Text)
    AdlibUnRegister("WaitForMsg")
    Sleep(100)
    TCPStartup()
    $socket=TCPConnect("127.0.0.1",4321)
    If $socket=-1 Then
    MsgBox(16,"2","Nicht gefunden")
    TCPCloseSocket($socket)
    TCPShutdown()
    Else
    MsgBox(0,"","ANTWORT")
    $sendedBytes=TCPSend($socket,$Text)
    If $sendedBytes=0 Then
    MsgBox(16,"2","Nichts gesendet")
    TCPCloseSocket($socket)
    TCPShutdown()
    Else
    TCPCloseSocket($socket)
    TCPShutdown()
    EndIf
    EndIf
    AdlibRegister("WaitForMsg",100)
    EndFunc

    [/autoit]


    Ursprünglich konnte man noch die Nachricht zum 2. Script senden, nur das hat nicht geantwortet. Aber irgendwie hab ich das bei der Fehlersuche jetzt so verbaut, dass nichtmal mehr das funktioniert :S .

    Wäre nett, wenn jemand helfen könnte, der sich damit auskennt.

  • Abend,

    In deinem Script 1 folgenden Part liegen Fehler vor

    [autoit]

    Func GetSth($IP,$Call="",$Parameter="")
    ;Auf Antwort warten
    TCPStartup()
    $mainsocket=TCPListen($IP,4321)
    While 1
    $acceptedSocket = TCPAccept($mainsocket)
    If $acceptedSocket<>-1 Then ;Etwas empfangen
    $Data = TCPRecv($acceptedSocket, 2048) ;$Data = Empfangener Text
    MsgBox(0,"1","Antwort erhalten: "&$Data)
    EndIf
    TCPCloseSocket($acceptedSocket)
    TCPShutdown()
    WEnd
    TCPShutdown()
    ToolTip("")
    EndFunc

    [/autoit]

    Du übergibst dieser Funktion die selbe IP um nach der Antwort zu lauschen, wie die IP des Befehl's Empfänger's !
    In der Endlosschleife, schliesst du immer den Sockel auch wenn keiner vorhanden ist und beim ersten Durchgang wird auch gleich TCP heruntergefahren.

    Lg, Fabian

    Edit:
    Hast du dem Script 1 als Befehl "Connect" übergeben, weil sonstige Befehle führen beim Empfänger in's leere ;)

    2 Mal editiert, zuletzt von Fabian (10. September 2010 um 22:24)

  • Danke, jetzt funktioniert wenigstens wieder in die eine Richtung. Aber mein eigendliches Hauptproblem besteht immernoch, ich kann nichts zurücksenden :(
    Ich habe das eine TCPShutdown jetzt entfernt. Und was du mit der IP-Adresse meinst, weiß ich nicht, aber im moment will ich ja sowieso überall nur 127.0.0.1 verwenden.
    Nur leider erhalte ich immernoch keine Antwort von dem 2. Script :(

    Der Code ist nun folgener:

    Script 1
    [autoit]

    ;Includes:
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    #include <GuiIPAddress.au3>
    #include <ButtonConstants.au3>
    ;Options:
    Opt("GUIOnEventMode", 1)
    ;--------
    BefehlEingeben()

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

    Func BefehlEingeben()
    Opt("GUIOnEventMode",0)
    $BForm1 = GUICreate("Befehl eingeben", 344, 110)
    $BLabel1 = GUICtrlCreateLabel("Bitte gebe die IP-Adresse ein, an die der Befehl gesendet werden soll:", 0, 0, 332, 17)
    $BIPAddress1 = _GUICtrlIpAddress_Create($BForm1, 8, 16, 130, 21)
    _GUICtrlIpAddress_Set($BIPAddress1, "127.0.0.1")
    $BLabel2 = GUICtrlCreateLabel("Bitte gebe den zu Sendenen Befehl ein:", 0, 40, 192, 17)
    $BInput1 = GUICtrlCreateInput("Connect|Parameter", 8, 56, 329, 21)
    $BButton1 = GUICtrlCreateButton("Abbrechen", 264, 80, 75, 25, $WS_GROUP)
    $BButton2 = GUICtrlCreateButton("Senden", 184, 80, 75, 25,$BS_DEFPUSHBUTTON)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE,$BButton1
    GUIDelete($BForm1)
    Opt("GUIOnEventMode",1)
    ExitLoop
    Case $BButton2
    $IP=_GUICtrlIpAddress_Get($BIPAddress1)
    $Text=GUICtrlRead($BInput1)
    GUIDelete($BForm1)
    Opt("GUIOnEventMode",1)
    SendSth($IP,$Text)
    ExitLoop
    EndSwitch
    WEnd
    EndFunc
    ;------------------

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

    ;-------Funktionen---------
    Func CreateStatus($Message,$Type=4)
    ;Eigendlich mehr, der Übersicht halber aber weggelassen ;)
    MsgBox(0,"",$Message)
    EndFunc

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

    Func SendSth($IP,$Befehl,$Call="",$Parameter="")
    TCPStartup()
    $socket=TCPConnect($IP,4321)
    If $socket=-1 Then
    CreateStatus("Fehler: Verbindung zu "&$IP&" konnte nicht hergestellt werden!",3)
    TCPCloseSocket($socket)
    TCPShutdown()
    Else
    $sendedBytes=TCPSend($socket,$Befehl)
    ;~ CreateStatus("'"&$Befehl&"' -> '"&$IP&"'",1)
    If $sendedBytes=0 Then
    CreateStatus("Befehl konnte nicht gesendet werden",3)
    TCPCloseSocket($socket)
    TCPShutdown()
    Else
    TCPCloseSocket($socket)
    TCPShutdown()
    GetSth($IP,$Call,$Parameter)
    EndIf
    EndIf
    EndFunc

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

    Func GetSth($IP,$Call="",$Parameter="")
    ;Auf Antwort warten
    TCPStartup()
    $mainsocket=TCPListen($IP,4321)
    While 1
    $acceptedSocket = TCPAccept($mainsocket)
    If $acceptedSocket<>-1 Then ;Etwas empfangen
    $Data = TCPRecv($acceptedSocket, 2048) ;$Data = Empfangener Text
    MsgBox(0,"1","Antwort erhalten: "&$Data)
    EndIf
    TCPCloseSocket($acceptedSocket)
    WEnd
    TCPShutdown()
    ToolTip("")
    EndFunc

    [/autoit]
    Script 2
    [autoit]

    ;TCP starten
    TCPStartup()

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

    Global $mainsocket
    $mainsocket = TCPListen("127.0.0.1",4321)
    AdlibRegister("WaitForMsg",100)

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

    While 1
    Sleep(2000)
    WEnd

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

    Func WaitForMsg()
    Global $Data
    $acceptedSocket = TCPAccept($mainsocket)
    If $acceptedSocket<>-1 Then ;Etwas empfangen
    $Data = TCPRecv($acceptedSocket, 2048) ;$Data = Empfangener Text
    $Data=StringSplit($Data,"|")
    If $Data[1]="Connect" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Then ;Überprüfen, ob Funktion existiert
    Call($Data[1])
    EndIf
    TCPCloseSocket($acceptedSocket)
    EndIf
    EndFunc

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

    Func Connect()
    Answer("Jo, hat geklappt!")
    EndFunc

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

    Func Answer($Text)
    AdlibUnRegister("WaitForMsg")
    Sleep(100)
    TCPStartup()
    $socket=TCPConnect("127.0.0.1",4321)
    If $socket=-1 Then
    MsgBox(16,"2","Nicht gefunden")
    TCPCloseSocket($socket)
    TCPShutdown()
    Else
    MsgBox(0,"","ANTWORT")
    $sendedBytes=TCPSend($socket,$Text)
    If $sendedBytes=0 Then
    MsgBox(16,"2","Nichts gesendet")
    TCPCloseSocket($socket)
    TCPShutdown()
    Else
    TCPCloseSocket($socket)
    TCPShutdown()
    EndIf
    EndIf
    AdlibRegister("WaitForMsg",100)
    EndFunc

    [/autoit]
  • Mit der IP meine ich, dass beide Scripte auf der selben IP Senden & Empfangen, dies kann zu Problemen führen.
    Ich habe deine Scripte mal soweit angepasst, damit sie jetzt auf zwei PC's im selben Netzwerk funktionieren sollten (Kann ich leider gerade nicht testen), du musst natürlich die IP und evtl. den Port anpassen. ;)

    Ich habe auch die Befehle TCPStartup & TCPShutdown aufgeräumt, weil teilweise hast du in den Funktionen TCPShutdown verwendet und somit im Hauptprogramm die TCPFunktionen ausser Kraft gesetzt.

    Script1
    [autoit]

    ;Includes:
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    #include <GuiIPAddress.au3>
    #include <ButtonConstants.au3>
    ;Options:
    Opt("GUIOnEventMode", 1)
    ;--------

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

    Global $port = 3000

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

    TCPStartup()
    BefehlEingeben()
    TCPShutdown()
    Exit

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

    Func BefehlEingeben()
    Opt("GUIOnEventMode",0)
    $BForm1 = GUICreate("Befehl eingeben", 344, 110)
    $BLabel1 = GUICtrlCreateLabel("Bitte gebe die IP-Adresse ein, an die der Befehl gesendet werden soll:", 0, 0, 332, 17)
    $BIPAddress1 = _GUICtrlIpAddress_Create($BForm1, 8, 16, 130, 21)
    _GUICtrlIpAddress_Set($BIPAddress1, "127.0.0.1")
    $BLabel2 = GUICtrlCreateLabel("Bitte gebe den zu Sendenen Befehl ein:", 0, 40, 192, 17)
    $BInput1 = GUICtrlCreateInput("Connect|Parameter", 8, 56, 329, 21)
    $BButton1 = GUICtrlCreateButton("Abbrechen", 264, 80, 75, 25, $WS_GROUP)
    $BButton2 = GUICtrlCreateButton("Senden", 184, 80, 75, 25,$BS_DEFPUSHBUTTON)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE,$BButton1
    GUIDelete($BForm1)
    Opt("GUIOnEventMode",1)
    ExitLoop
    Case $BButton2
    $IP=_GUICtrlIpAddress_Get($BIPAddress1)
    $Text=GUICtrlRead($BInput1)
    GUIDelete($BForm1)
    Opt("GUIOnEventMode",1)
    SendSth($IP,$Text)
    ExitLoop
    EndSwitch
    WEnd
    EndFunc

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

    ;-------Funktionen---------
    Func CreateStatus($Message,$Type=4)
    ;Eigendlich mehr, der Übersicht halber aber weggelassen ;)
    MsgBox(0,"",$Message)
    EndFunc

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

    Func SendSth($IP,$Befehl,$Call="",$Parameter="")
    $socket=TCPConnect($IP,$port)
    If $socket=-1 Then
    CreateStatus("Fehler: Verbindung zu "&$IP&" konnte nicht hergestellt werden!",3)
    TCPCloseSocket($socket)
    Else
    $sendedBytes=TCPSend($socket,$Befehl)
    If $sendedBytes=0 Then
    CreateStatus("Befehl konnte nicht gesendet werden",3)
    TCPCloseSocket($socket)
    Else
    TCPCloseSocket($socket)
    GetSth(@IPAddress1,$Call,$Parameter) ;Du musst auf deiner IP-Lauschen
    EndIf
    EndIf
    EndFunc

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

    Func GetSth($IP,$Call="",$Parameter="")
    ;Auf Antwort warten
    ConsoleWrite("IP"&@TAB&$IP&@CRLF)
    ConsoleWrite("Call"&@TAB&$Call&@CRLF)
    ConsoleWrite("Parameter"&@TAB&$Parameter&@CRLF)
    $mainsocket=TCPListen($IP,$port)
    While 1
    $acceptedSocket = TCPAccept($mainsocket)
    If $acceptedSocket <> -1 Then ;Etwas empfangen
    $Data = TCPRecv($acceptedSocket, 2048) ;$Data = Empfangener Text
    MsgBox(0,"","Antwort erhalten: "&$Data)
    TCPCloseSocket($acceptedSocket)
    ExitLoop
    EndIf
    WEnd
    ToolTip("")
    EndFunc

    [/autoit]
    Script2
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <Array.au3>

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

    ;TCP starten
    TCPStartup()

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

    Global $MyIp = @IPAddress1
    Global $YourIp = "127.0.0.3" ;IP des Gegenübers
    Global $port = 3000
    Global $mainsocket = TCPListen($MyIp,$port)

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

    AdlibRegister("WaitForMsg",100)
    OnAutoItExitRegister("_Exit")

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

    While 1
    Sleep(2000)
    WEnd

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

    Func WaitForMsg()
    Global $Data
    $acceptedSocket = TCPAccept($mainsocket)
    If $acceptedSocket<>-1 Then ;Etwas empfangen
    $Data = TCPRecv($acceptedSocket, 2048) ;$Data = Empfangener Text
    $Data=StringSplit($Data,"|")
    _ArrayDisplay($Data)
    If $Data[1]="Connect" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Then ;Überprüfen, ob Funktion existiert
    TCPCloseSocket($acceptedSocket)
    Call($Data[1])
    EndIf
    EndIf
    EndFunc

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

    Func Connect()
    Answer("Jo, hat geklappt!")
    EndFunc

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

    Func Answer($Text)
    AdlibUnRegister("WaitForMsg")
    Sleep(100)

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

    $socket=TCPConnect($YourIp,$port)
    If $socket=-1 Then
    MsgBox(16,"2","Nicht gefunden")
    TCPCloseSocket($socket)
    Else
    $sendedBytes=TCPSend($socket,$Text)
    If $sendedBytes=0 Then
    MsgBox(16,"2","Nichts gesendet")
    TCPCloseSocket($socket)
    Else
    MsgBox(0,"","Gesendet")
    TCPCloseSocket($socket)
    EndIf
    EndIf
    AdlibRegister("WaitForMsg",100)
    EndFunc

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

    Func _Exit()
    TCPShutdown()
    Exit
    EndFunc

    [/autoit]

    Lg, Fabian

  • Da musst du nur die Funktionen erneut aufrufen und evtl. einbischen anpassen ;)
    Solltest du hinkriegen ne?

    Lg, Fabian

  • Ja. Müsste ich. Aber reate mal, was die Realität ist :thumbdown: .

    Also, ich habe das jetzt fröhlich erweitert. Um zum Befehl senden-Fenster zu gelangen, klicke oben auf "Erweitert".

    Script 1
    [autoit]

    ;~ TCPStartup() ; TCP wird initialisiert

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

    ;Includes:
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include <GuiListView.au3>
    #include <GuiImageList.au3>
    #include <GuiIPAddress.au3>
    #include <ButtonConstants.au3>
    ;Options:
    Opt("GUIOnEventMode", 1)
    ;--------
    TCPStartup()

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

    ;Fenster -Start-
    $FForm1 = GUICreate("Fenstertitel", 626, 443)
    ;Menü
    $FMen1=GUICtrlCreateMenu("&Netzwerk")
    $FMen2=GUICtrlCreateMenu("Einstellungen")
    $FMen3=GUICtrlCreateMenu("Erweitert")
    $FMenu5=GUICtrlCreateMenuItem("Befehl eingeben...",$FMen3)
    GUICtrlSetOnEvent($FMenu5,"BefehlEingeben")
    ;Status-Liste
    $FStatusBox = GUICtrlCreateListView("|", 0, 0, 625, 97,BitOr($LVS_NOCOLUMNHEADER,$LVS_SHOWSELALWAYS,$LVS_SINGLESEL))
    _GUICtrlListView_SetColumnWidth($FStatusBox,0,620)
    _GUICtrlListView_SetColumnWidth($FStatusBox,1,0)
    $hImage = _GUIImageList_Create(16, 16, 5, 3)
    _GUIImageList_AddIcon($hImage,@ScriptDir&"\images\status_send.ico")
    _GUIImageList_AddIcon($hImage,@ScriptDir&"\images\status_receive.ico")
    _GUIImageList_AddIcon($hImage,@ScriptDir&"\images\status_error.ico")
    _GUIImageList_AddIcon($hImage,@ScriptDir&"\images\status_info.ico")
    _GUICtrlListView_SetImageList($FStatusBox, $hImage, 1)

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

    CreateStatus("Das Programm wurde gestartet")

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "Close")
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(1000)
    WEnd
    ;-------Button-Funktionen---------
    Func Close()
    TCPShutdown()
    Exit
    EndFunc
    Func BefehlEingeben()
    Opt("GUIOnEventMode",0)
    $BForm1 = GUICreate("Befehl eingeben", 344, 110)
    $BLabel1 = GUICtrlCreateLabel("Bitte gebe die IP-Adresse ein, an die der Befehl gesendet werden soll:", 0, 0, 332, 17)
    $BIPAddress1 = _GUICtrlIpAddress_Create($BForm1, 8, 16, 130, 21)
    _GUICtrlIpAddress_Set($BIPAddress1,"127.0.0.1");"192.168.1.11")
    $BLabel2 = GUICtrlCreateLabel("Bitte gebe den zu Sendenen Befehl ein:", 0, 40, 192, 17)
    $BInput1 = GUICtrlCreateInput("Connect|Parameter", 8, 56, 329, 21)
    $BButton1 = GUICtrlCreateButton("Abbrechen", 264, 80, 75, 25, $WS_GROUP)
    $BButton2 = GUICtrlCreateButton("Senden", 184, 80, 75, 25,$BS_DEFPUSHBUTTON)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE,$BButton1
    GUIDelete($BForm1)
    Opt("GUIOnEventMode",1)
    ExitLoop
    Case $BButton2
    $IP=_GUICtrlIpAddress_Get($BIPAddress1)
    $Text=GUICtrlRead($BInput1)
    GUIDelete($BForm1)
    Opt("GUIOnEventMode",1)
    SendSth($IP,$Text)
    ExitLoop
    EndSwitch
    WEnd
    EndFunc
    ;------------------

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

    ;-------Funktionen---------
    Func CreateStatus($Message,$Type=4)
    _GUICtrlListView_AddItem($FStatusBox,$Message,$Type-1)
    _GUICtrlListView_Scroll($FStatusBox,0,_GUICtrlListView_GetItemCount($FStatusBox)*16)
    EndFunc

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

    Func SendSth($IP,$Befehl,$Call="",$Parameter="")
    $socket=TCPConnect($IP,4321)
    If $socket=-1 Then
    CreateStatus("Fehler: Verbindung zu "&$IP&" konnte nicht hergestellt werden!",3)
    TCPCloseSocket($socket)
    Else
    $sendedBytes=TCPSend($socket,$Befehl&"|"&@IPAddress1)
    CreateStatus("'"&$Befehl&"' -> '"&$IP&"'",1)
    If $sendedBytes=0 Then
    CreateStatus("Befehl konnte nicht gesendet werden",3)
    TCPCloseSocket($socket)
    Else
    TCPCloseSocket($socket)
    GetSth(@IPAddress1,$Call,$Parameter)
    EndIf
    EndIf
    EndFunc

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

    Func GetSth($IP,$Call="",$Parameter="")
    ;Auf Antwort warten
    $Timer=TimerInit()
    $mainsocket=TCPListen($IP,4321)
    While 1
    $acceptedSocket = TCPAccept($mainsocket)
    If $acceptedSocket<>-1 Then ;Etwas empfangen
    $Data = TCPRecv($acceptedSocket, 2048) ;$Data = Empfangener Text
    CreateStatus("'"&$Data&"' <- '"&$IP&"'",2)
    TCPCloseSocket($acceptedSocket)
    ExitLoop
    EndIf
    If TimerDiff($Timer)>9000 Then ;Damit nicht unendlich lange versucht wird, was zu empfangen
    CreateStatus("Zeitüberschreitung der Anforderung",3)
    TCPCloseSocket($acceptedSocket)
    ExitLoop
    EndIf
    WEnd
    EndFunc

    [/autoit]
    Spoiler anzeigen
    [autoit]

    Global $OtherIP

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

    ;TCP starten
    ;~ TCPStartup()

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

    StartTCP()

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

    While 1
    Sleep(2000)
    WEnd

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

    Func StartTCP()
    TCPShutdown()
    MsgBox(0,"","Starte Schleife")
    TCPStartup()
    Global $mainsocket
    $mainsocket = TCPListen("127.0.0.1",4321);@IPAddress1,4321)
    AdlibRegister("WaitForMsg",100)
    EndFunc

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

    Func WaitForMsg()
    ToolTip("WaitForMsg",0,0)
    Global $Data
    $acceptedSocket = TCPAccept($mainsocket)
    If $acceptedSocket<>-1 Then ;Etwas empfangen
    ;~ MsgBox(0,"","Etwas empfangen")
    $Data = TCPRecv($acceptedSocket, 2048) ;$Data = Empfangener Text
    $Data=StringSplit($Data,"|")
    $OtherIP=$Data[$Data[0]]
    If $Data[1]="Connect" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Then ;Überprüfen, ob Funktion existiert
    ToolTip("")
    AdlibUnRegister("WaitForMsg")
    TCPCloseSocket($acceptedSocket)
    Call($Data[1])
    EndIf
    EndIf
    EndFunc

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

    Func Connect()
    Answer("Zumindest dieser Versuch hat geklappt ;)")
    EndFunc

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

    Func Answer($Text)
    Sleep(100)

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

    $socket=TCPConnect($OtherIP,4321) ;ServerIP
    If $socket=-1 Then
    MsgBox(16,"2","x")
    TCPCloseSocket($socket)
    Else
    $sendedBytes=TCPSend($socket,$Text)
    If $sendedBytes=0 Then
    MsgBox(16,"2","x")
    TCPCloseSocket($socket)
    Else
    ;~ MsgBox(0,"","ANTWORT")
    TCPCloseSocket($socket)
    EndIf
    EndIf
    StartTCP()
    EndFunc

    [/autoit]
  • Hallo,

    Kann das ganze leider immer noch nicht austesten, aber Script 1 sollte eigentlich funktionieren.
    Script 2 habe ich einbischen angepasst, sollte nun auch funktionieren.

    Script2
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    OnAutoItExitRegister("_Exit")

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

    Global $OtherIP
    Global $mainsocket
    Global $Data

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

    StartTCP()

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

    While 1
    Sleep(20)
    WaitForMsg()
    WEnd

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

    Func StartTCP()
    MsgBox(0,"","Starte Schleife")
    TCPStartup()
    $mainsocket = TCPListen("127.0.0.1",4321);@IPAddress1,4321)
    EndFunc

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

    Func WaitForMsg()
    Local $acceptedSocket = TCPAccept($mainsocket)
    If $acceptedSocket<>-1 Then ;Etwas empfangen
    $Data = TCPRecv($acceptedSocket, 2048) ;$Data = Empfangener Text
    $Data=StringSplit($Data,"|")
    $OtherIP=$Data[$Data[0]]
    If $Data[1]="Connect" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Or $Data[1]="Test" Then ;Überprüfen, ob Funktion existiert
    ToolTip("")
    TCPCloseSocket($acceptedSocket)
    Call($Data[1])
    EndIf
    EndIf
    EndFunc

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

    Func Connect()
    Answer("Zumindest dieser Versuch hat geklappt ;)")
    EndFunc

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

    Func Answer($Text)
    $socket=TCPConnect($OtherIP,4321) ;ServerIP
    If $socket=-1 Then
    MsgBox(16,"2","x")
    TCPCloseSocket($socket)
    Else
    $sendedBytes=TCPSend($socket,$Text)
    If $sendedBytes=0 Then
    MsgBox(16,"2","x")
    TCPCloseSocket($socket)
    Else
    TCPCloseSocket($socket)
    EndIf
    EndIf
    EndFunc

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

    Func _Exit()
    TCPShutdown()
    Exit
    Endfunc

    [/autoit]

    Lg, Fabian

  • Danke für deine Bemühungen, ist aber leider nicht besser als vorher :(

    Was klappt den nicht?
    Brauche eine gute Fehlerbeschreibung, da ich es momentan nicht selber ausprobieren kann ;)

  • Wenn ich das erste Mal etwas sende, empfange ich auch wieder was und wenn ich nochmal was sende, bekomme ich keine Antwort :(.

    Genauere Problembeschreibung folgt, bin aber gerade in der Schule und hab das Script nicht.


    Edit: Also, nochmal detailreich:
    Normal = Server
    Kursiv = Client

    Client starten
    In der Schleife "WaitForMsg"
    Server starten
    Befehl senden
    Befehl erhalten
    Antwort senden
    Antwort erhalten
    Benutzer sendet wieder einen Befehl
    Befehl erhalten
    Antwort senden

    -Ende-

  • Hallo,

    In Script 1 habe ich folgende Funktion angepasst

    GetSth
    [autoit]


    Func GetSth($IP,$Call="",$Parameter="")
    ;Auf Antwort warten
    $Timer=TimerInit()
    $mainsocket=TCPListen($IP,4321)
    While 1
    $acceptedSocket = TCPAccept($mainsocket)
    If $acceptedSocket<>-1 Then ;Etwas empfangen
    $Data = TCPRecv($acceptedSocket, 2048) ;$Data = Empfangener Text
    CreateStatus("'"&$Data&"' <- '"&$IP&"'",2)
    TCPCloseSocket($acceptedSocket)
    ExitLoop
    EndIf
    If TimerDiff($Timer)>9000 Then ;Damit nicht unendlich lange versucht wird, was zu empfangen
    CreateStatus("Zeitüberschreitung der Anforderung",3)
    TCPCloseSocket($acceptedSocket)
    ExitLoop
    EndIf
    WEnd
    TCPCloseSocket($mainsocket) ;hinzugefügt
    EndFunc

    [/autoit]

    Ich denke es könnte daran liegen, das bereits ein Abhör-Anschluss auf der IP & port vorhanden war und somit beim zweiten Durchgang eine Komplikation zwischen den Abhör-Anschluss enstanden ist. Deshalb habe ich am Ende der Funktion, den Sockel jetzt geschlossen.

    Lg, Fabian