TCPSend()

  • Hallo,

    ich habe mir die Frage gestellt, wie TCPSend() erkennen möchte, ob das Senden erfolgreich war:
    Wenn ich TCPSend() aufrufe, dann möchte ich ja sofort im Code weiter laufen - benötige also auch sofort einen Rückgabewert.
    Zu diesem Zeitpunkt hat das Senden vielleicht schon geklappt - vielleicht aber auch nicht (TCP wird es ja vermutlich öfters probieren).

    Also ausprobieren:
    Und tatsächlich: Zum Versuch habe ich eine Verbindung zwischen 2 Rechner aufgebaut und sende alle 500ms ein Zeichen.
    Wenn ich nun die Verbindung (WLAN) trenne, dann dauert es ca. 10 - 40s bis der Sender @error meldet.
    Warum das so stark schwankt, weiß ich nicht. Konkret heißt das aber, dass ich im Extremfall 40s lang munter Sende, ohne dass es beim Empfänger ankommt - und ohne dass irgendjemand was merkt. So habe ich mir das mit dem TCP nicht vorgestellt.
    Den Empfänger kriege ich dazu, dass er über Timeout merkt, dass nichts mehr ankommt und die Verbindung trennt bzw. neu aufbauen möchte - da aber ja keine Verbindung mehr zum Sender besteht, kriegt der das nicht mit und sendet munter weiter, ohne sich zu beklagen.
    Erst nach max. 40s gibt es einen Fehler - ich kann eine neue Verbindung aufbauen und alles läuft wieder.

    Mich ärgert es aber, dass der Sender nicht mitkriegt, dass zumindest zeitweise nichts ankommt. :cursing:
    Habt ihr eine Idee, was ich da machen kann?

    Vielleicht soll der Empfänger einfach zurücksenden, was er empfangen hat - dann könnte ich beim Sender über Timeout erkennen, dass die Verbindung weg ist.
    Ich dachte aber, dass TCP bereits sowas hat...

  • Hi,
    zum gefühlten hundertsten Mal ein "klick mich, ich bin ein Link"
    ..und hier

    Das von dir beschriebene Vorgehen der "dynamischen Wartezeit" ist ein über Jahrzehnte entwickeltes, je nach Betriebssystem unterschiedlich behandeltes Procedere des TCP/IP.
    Wenn ich, wie bspw. beim Deskstream, auf direkte Antworten angewiesen bin, dann baue ich einen selbstgebauten Handshake ein.
    Also Nachricht senden und sofort auf Antwort warten.

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (26. September 2013 um 15:35)

  • alpines, gibt es, ist aber im beschriebenen Fall wirkungslos, Ursache s. Links.

  • alpines, gibt es, ist aber im beschriebenen Fall wirkungslos, Ursache s. Links.


    Ich bin wirklich froh, dass es Leute wie dich gibt, die mit Engelsgeduld immer wieder weiterhelfen. Ich meine das nicht ironisch.
    Danke.

    Das dumme ist halt, dass keiner, der sich an so ein Thema wie TCP oder UDP herantraut, vorher irgendwelche Spezifikationen liesst, wie das Zeugs überhaupt funktioniert. Wenn es in der Autoit Hilfe nicht erwähnt ist (oder in den Beispielen dort nicht auftaucht) dann macht man immer wieder solche Entdeckungen und ist "verdutzt".

    Ich bin mit einem echt großen Aufwand nun von UDP auf TCP umgestiegen, weil ich gemerkt habe, dass ich mit UDP Verluste habe, die mir "weh" tun. Nun dachte ich, dass mit TCP alles roger ist und ich mich nicht mehr darum kümmern muss, dass Pakete verloren gehen können ohne dass ich es merke.
    Jetzt lerne ich gerade schmerzvoll, dass das nicht der Fall ist und ich selber eine Sicherung einbauen muss. Dieser nun zu implementierende Sicherheitsmechanismus hätte vielleicht auch mit dem UDP Protokoll geholfen - da hätte ich mir die Arbeit sparen können.

    Aber dafür könnt ihr natürlich nichts...
    Trotzdem nochmal ein Danke. Und stelle dir das mit der Suche nicht so leicht vor, wenn man gar nicht so genau versteht, warum es nicht funktioniert ist es auch immer schwierig danach zu suchen...

  • Hi,

    Zitat

    Und stelle dir das mit der Suche nicht so leicht vor, wenn man gar nicht so genau versteht, warum es nicht funktioniert ist es auch immer schwierig danach zu suchen...

    ja, das liegt in diesem Fall nicht an dir, sondern daran, dass keiner der hunderttausenden von Leuten, wie von dir erkannt, "vorher irgendwelche Spezifikationen liesst, wie das Zeugs überhaupt funktioniert."
    Und dann werden Threads gepostet die strotzen nur so von Müll. Google hat dann zu diesem Thema 2 Millionen Treffer und davon kann man 99% vergessen...
    Ergo finden noch weniger Leute Informationen und es werden weiterhin überflüssige Threads gepostet....

    Zitat

    ielleicht soll der Empfänger einfach zurücksenden, was er empfangen hat - dann könnte ich beim Sender über Timeout erkennen, dass die Verbindung weg ist.

    genau so funktioniert ein Handshake.
    Sende deinen String und warte direkt darauf (in einer Schleife) auf die Rücksendung bspw. der ersten 10 gesendeten Bytes. Wenn nach einer bestimmten Zeitspanne "nichts" zurückgekommen ist, also im RECV-Buffer steht, dann ist die Verbindung weg.
    Das geht natürlich auch per UDP.
    Dort bietet es sich aber an, je nach Paketgröße, einen Hash der gesendeten Daten zu bilden und diesen dann zurückzusenden. Wenn vergleich positiv, dann ist das Paket (oder mehrere) korrekt angekommen. Gleichzeitig lässt sich, gewissermassen als Abfallprodukt, ein Timer setzen. Ist nach einer gewissen Zeitspanne "nichts" zurückgekommen, s.o.^^