Muss empfangende Daten bestätigen, verstehe aber nicht wie.



  • Hallo Leute,
    ich schreibe gerade einen IRC Client der auch Daten per DCC empfangen kann. Das klappt eigentlich auch. Das blöde ist man muss die Empfangen Daten bestätigen sonst schließt der Sender die Verbindung nicht.

    Ich bin mir nicht sicher obs an meinem Englisch liegt aber ich weiss nicht wie ich das tun soll. Das hier wird verlangt.

    The recipient should acknowledge each packet by transmitting
    the total number of bytes received as an unsigned, 4 byte
    integer in network byte order. The sender should not continue
    to transmit until the recipient has acknowledged all data
    already transmitted. Additionally, the sender should not
    close the connection until the last byte has been
    acknowledged by the recipient.

    Lesen und schreiben tue ich hiermit. Beispiel ohne Puffer.

    for (int len; (len = inputStream.read()) != -1; ) {
      fileOutputStream.write(len);
    }
    

    -1 kommt aber erst wenn alle Daten bestätigt sind. Oder wenn eben nur die letzten Daten bestätigt sind?

    Ich verstehe nicht was ein "4 byte integer in network byte order" sein soll? Die Daten die in len stehen und so rüberkommen sehen so aus.

    108
    20
    252
    5
    22
    179
    251
    101
    29
    80

    Hoffe mir kann da Jemand auf die Sprünge helfen.



  • - Du antwortest auf jedes Paket mit einem unsigned int (der Größe 4 Byte) der die Anzahl an empfangenen Bytes enthält

    - Der unsigned int muss in Network order sein: http://en.wikipedia.org/wiki/Network_byte_order#Endianness_in_networking

    - Du musst das immer gleich nach dem Paket senden, da der Sender dazu angehalten ist, kein Paket zu senden bis nicht das derzeitige Paket bestätigt ist

    - Du musst auch noch nach dem letzten Paket die Länge senden, da der Sender die Verbindung nicht schließt

    MfG SideWinder



  • SideWinder schrieb:

    - Du antwortest auf jedes Paket mit einem unsigned int (der Größe 4 Byte) der die Anzahl an empfangenen Bytes enthält

    - Der unsigned int muss in Network order sein: http://en.wikipedia.org/wiki/Network_byte_order#Endianness_in_networking

    - Du musst das immer gleich nach dem Paket senden, da der Sender dazu angehalten ist, kein Paket zu senden bis nicht das derzeitige Paket bestätigt ist

    - Du musst auch noch nach dem letzten Paket die Länge senden, da der Sender die Verbindung nicht schließt

    MfG SideWinder

    Erstmal danke für deine Hilfe. So ganz verstanden habe ich das nicht.

    Zu Punkt 1 und 2.
    So habe ich das auch verstanden. Wobei ich dir über den Link dankbar bin. Leider weiss ich nicht wie ich ein Paket mache das die Anzahl der Bytes enthält.

    Wie du in meinem Beispiel oben siehst kommt zb. als erstes die 108. Ich nehme mal an das stellt das Paket dar welches ich bekomme. Was mache ich jetzt damit?

    Punkt 3 seht wohl so drin stimmt aber nicht 😃 . Es kommt auch ohne Antwort alles an.

    Punkt 4 woher soll ich wissen das letzte Paket ist?



  • "Ein Paket senden" heißt nichts anderes als etwas zu senden. Du schickst also ganz einfach 4 Bytes an den Empfänger. Hast also irgendwo outputStream.write(blubb); und dann outputStream.flush();

    Nein 108 stellt das erste Zeichen eines Paketes dar. Du liest mit read() nur ein einzelnes Zeichen aus anstatt das gesamte Paket. Verwende also besesr read() mit den drei Parametern um ein ganzes Paket auszulesen. Dann bekomm tdu die Länge als Return-Wert der Funktion zurück. Diesen Wert kannst du dann zurücksenden und der Gegenüber kann kontrollieren ob du auch das gesamte Paket in seiner vollen Länge erhalten hast.

    Punkt 4: Du erhältest beim read() mit drei Parametern -1 als Rückgabewert, wenn das ende erreicht ist.

    MfG SideWinder



  • Vielen Dank für deine Hilfe. Jetzt hat auch der Sender mitbekommen das der Download zu ende ist.

    Übertragung vollständig (3820 KB, 2 min 9.440 sec, 29.5 KB/sec, md5sum: 880bd855711ab37684b74d342e3b4557)


Log in to reply