TCP - Client <--> Server / Wie erhält der Client eine Antwort vom Server, wenn er etwas gesendet hat?

  • Liebe Entwickler,

    irgendwie sitze ich nun seit Jahren an meinem Bürostuhl, suche mich wund, aber dieses im Grunde ja einfaches Problem lässt sich mir nicht lösen:

    TCP ist ja ein Verbindungsprotokoll. So soll in beide Richtungen - mit einer Verbindung - kommuniziert werden können.

    Wenn ich nun mit meinem Clienten an meinen Server (Perl) ein Datenpaket versende, antwortet der Server:

    PHP
    print $client 'All fine, I\'ve got your info!';

    Senden tue ich das natürlich mit diesem AutoIt-Befehl:

    PHP
    TCPSend($socket, 'Hello World!')

    Das Paket kommt beim Server an und der Server antwortet auch (geprüft). Wenn ich per PHP's fsockopen() etwas hinschicke, erhalte ich auch die Antwort.

    Wie kann ich denn in AutoIt die Antwort erhalten?

    Irgendwie habe ich bisher nichts davon gefunden, bzw. habe ich das Prinzip in AutoIt nicht verstanden. Schließlich möchte ich mit meinem Server ja telefonieren (TCP) und keine Briefe verschicken (UDP).

    Vielen Dank!

  • Wenn du beim Client etwas empfangen willst benutzt du den Befehl

    [autoit]

    Tcprecv

    [/autoit]

    ,
    dazu benutzt du das zurückgegebene Handle von

    [autoit]

    Tcpconnect

    [/autoit]

    .

  • Funktioniert leider nicht.

    Wenn ich per TCPConnect() eine Verbindung öffne und ein Paket mittels TCPSend() absende, will ich per TCPRecv() auch gleich die Antwort erhalten. Ist das denn nicht möglich? Ich erhalte nämlich keine Antwort.

    Mache ich das ganze in PHP per fsockopen() und fread(), erhalte ich auch gleich die Antwort.

    Ergebnis:

    PHP
    Ja

    Dasselbe möchte ich auch in AutoIt machen. Ein Paket, z. B. ein Passwort absenden und dann danach die Antwort erhalten, ob dieses richtig ist.

  • Weiß niemand wie das geht? Oder verstehe ich das TCP-Protokoll falsch? Ich verstehe das so, dass man damit telefoniert. Daher auch nur eine Verbindung, wo beide, also Client und Server kommunizieren können.

    Weshalb kann man dann mit AutoIt nicht die Antwort auf meine Frage erhalten? (Also z. B. "Ist das Passwort 'abc' richtig?" <=> "Ja").

  • Wenn du mit TCPAccept eine Verbindung aufgenommen hast, kriegst du ein Handle zurück.
    Dieses Handle musst du dann für TCPSend oder TCPRecv verwenden.
    In deinem Fall ist das Problem, dass er nicht wartet, sondern sofort schaut ob eine Antwort da ist oder nicht. (wenn man den PHP code als AutoIt interpertieren würde)

    Du musst eine Schleife einbauen, die sich so lange wiederholt bis auch etwas ankommt ;)
    Also in etwa so:

    [autoit]


    Do
    $temp = TCPRecv($socket,1028)
    Sleep(10)
    Until $temp <> ""
    MsgBox(0,"",$temp)

    [/autoit]
  • In der Hilfe ist doch ein kleine Beispiel für einen Server und einen Clienten