CRC32 CheckSum Problem bei UDP

Mahlzeit.

Ich habe ein kleines Programm geschrieben zur Datenübertragung via UDP.
Genauer gesagt war das eine Aufgabe innerhalb meines Studiums, daher DatagramSocket bzw. DatagramPacket, später also nicht wundern ;)
(Die lib sorgt für Fehler bei der Übertragung (PacketLoss, Bitfehler, Verzögerung...))

Die Aufgab lautet genauer, eben jene Fehler zu behandeln und trotzdem eine zuverlässige Übertragung umzusetzen.

Rahmenverluste und Verzögerung wurden bereits behandelt, Bei der Prüfsumme zur Bitfehlerbehandlung tritt ein Problem auf:

Das letzte Packet will einfach nicht rüber ;)

Spekulationen:
Das letzte Packet hat zumeist eine andere Länge als die übrigen.
- Die länge übergebe ich jedoch mit und sollte daher kein Problem sein.

Ablauf:
Das Packet besteht aus 3 Teilen:
Sequenznummer[1] + Daten[momentan[59] + CRC32[4] = 64byte
Client sendet Packet,
Server empfängt Packet,
Server erstellt eigene CRC32,
Server vergleicht eigene CRC32 mit mitgesendeter CRC32
True: Ack zurücksenden, False: kein Ack zurücksenden und TimeOut löst Neuversand aus.

Code:
Client (Sender):
Java:
package prak2;

import java.net.*; // we use Sockets
import java.util.zip.*;

public class FileTransferClientUDPjlibcnds {
    static int timeDelay = 1000;
    static long sendStamp = 0;
    static long receiveStamp = 0;
    static int highestDelay = 0;
    static int fails = 0;
    static int packetLossWindow = 20;

    public static void main(String args[]) throws Exception{
        System.out.println("Client:");

        // Arguments: Server name & port & filename to transfer
        String srvName = "localhost"; // server Name
        int srvPort = Integer.parseInt("23556"); // server UDP port
        String filename = "source.txt"; // file Name

	// Open datagramm socket
	javax.net.DatagramSocket dtgSock;
        dtgSock = new javax.net.DatagramSocket();
        InetSocketAddress srvSockAddr = new InetSocketAddress(srvName, srvPort);
        dtgSock.connect(srvSockAddr);
        dtgSock.setSoTimeout(timeDelay);
        
        byte[] puff = new byte[15];
        byte[] buf = new byte[45];
        byte sn = 0;
        byte[] checkSum = new byte[4];
        CRC32 cs = new CRC32();

	java.io.FileInputStream fr = new java.io.FileInputStream(filename);

	int len; // number of bytes written from the file
        int seq = 1;
        long startTime = System.currentTimeMillis();

	while ((len=fr.read(buf,1,buf.length-5))!= -1 && packetLossWindow != 0){
            //Sequenznummer einbinden
            sn = converter.IntegerToByte(seq);
            buf[0] = sn;

            //CheckSum einbinden
            cs.reset();
            cs.update(buf, 0, buf.length-4);
            checkSum = converter.convertIntToByteArray((int)cs.getValue());
            buf[buf.length-4] = checkSum[0];
            buf[buf.length-3] = checkSum[1];
            buf[buf.length-2] = checkSum[2];
            buf[buf.length-1] = checkSum[3];

            DatagramPacket packet = new DatagramPacket(buf, len+5);
            send(packet,puff,dtgSock);
            seq++;
            if(seq==100) seq = 1;
        }
	// Send an empty packet to the server to indicate end of file
        DatagramPacket packet = new DatagramPacket(buf, 0);
       	dtgSock.send(packet);
        dtgSock.close();	// Close the Socket
        System.out.println("Elapsed Time: "+(double)((System.currentTimeMillis()-startTime)/1000)+" Sekunden");
        System.out.println("Lost Packets: "+fails);
    }

    public static void send(DatagramPacket p, byte[] puff, DatagramSocket dtgSock){
        try{
            sendStamp = System.currentTimeMillis();
            dtgSock.send(p);
            //System.out.print("*");
            DatagramPacket ackpacket = new DatagramPacket(puff, puff.length);
            dtgSock.receive(ackpacket);
            receiveStamp = System.currentTimeMillis();
            if((receiveStamp-sendStamp)>highestDelay){
                highestDelay = (int)(receiveStamp-sendStamp);
                dtgSock.setSoTimeout(highestDelay*2);
            }
            //System.out.println("SN: " + converter.FetchSn(ackpacket.getData()));
            //System.out.println("Timer: " + dtgSock.getSoTimeout() + " ms");
            packetLossWindow = 20;
        } catch(Exception e){
            //System.out.println("packetloss...");
            fails++;
            packetLossWindow--;
            if(packetLossWindow==0) System.out.println("disconnect...");
            else send(p, puff, dtgSock);
        }
    }
}

Server (Empfänger):
Java:
package prak2;

import java.net.*; // we use Sockets
import java.util.zip.*;

public class FileTransferServerUDPjlibcnds {

    public static void main(String args[]) throws Exception{
        System.out.println("Server:");

        // Arguments: port & filename
        int srvPort = Integer.parseInt("23556"); // server UDP port
        String filename = "dest/sink.txt"; // file Name

	// Open datagramm socket
	javax.net.DatagramSocket dtgSock;
        dtgSock = new javax.net.DatagramSocket(srvPort);

        byte[] buf = new byte[4000];
        int seq = 0;
        byte[] seqArr = new byte[1];
        byte[] checkSum = new byte[4];
        CRC32 cs = new CRC32();
        int lastSeq = 0;

	java.io.FileOutputStream fw = new java.io.FileOutputStream(filename);

	DatagramPacket packet = new DatagramPacket(buf, buf.length);

        while(true){
            dtgSock.receive(packet);
            if(packet.getLength()!=0){
                checkSum[0] = packet.getData()[packet.getLength()-4];
                checkSum[1] = packet.getData()[packet.getLength()-3];
                checkSum[2] = packet.getData()[packet.getLength()-2];
                checkSum[3] = packet.getData()[packet.getLength()-1];
                cs.reset();
                cs.update(packet.getData(), 0, packet.getLength()-4);
                //if für checkSummen vergleich
                if((int)cs.getValue()==converter.convertByteArrayToInt(checkSum)){
                    seq = converter.FetchSn(packet.getData());
                    //if für Sequenznummern vergleich
                    if(converter.FetchSn(packet.getData()) != lastSeq){
                        fw.write(packet.getData(),1,packet.getLength()-5);
                        //System.out.print("*");
                        seqArr[0] = converter.IntegerToByte(seq);
                        DatagramPacket ackpacket = new DatagramPacket(seqArr, 1, packet.getAddress(), packet.getPort());
                        dtgSock.send(ackpacket);
                        lastSeq = converter.FetchSn(ackpacket.getData());
                    } else {
                        //System.out.println("duplicate...");
                        seqArr[0] = converter.IntegerToByte(seq);
                        DatagramPacket ackpacket = new DatagramPacket(seqArr, 1, packet.getAddress(), packet.getPort());
                        dtgSock.send(ackpacket);
                        lastSeq = converter.FetchSn(ackpacket.getData());
                    }
                } else {
                    //System.out.println("damaged packet...");
                }
            } else break;
        }
	fw.flush();
	fw.close();
	dtgSock.close();	// Close the Socket
    }
}

Zur Info: Ich möchte hier nicht die Lösung für mein Studium erschnorren, Das Programm wurde bereits abgenommen und ich konnte meinen Fehler tarnen. ;)

Ich wüsste halt nur verdammt gern warum warum warum :D

LG und vielen Dank schon jetzt.
 
Ausgabe des Clients (Sender):
[Sequenznummer + "Daten" + gesendeteCRC32 + Paketlänge]
run:
Client:
1 [Daten] 1313384350 45
2 [Daten] 789571407 45
3 [Daten] -683701755 45
3 [Daten] -683701755 45
3 [Daten] -683701755 45
3 [Daten] -683701755 45
4 [Daten] -777161796 45
4 [Daten] -777161796 45
5 [Daten] 1437930061 45
5 [Daten] 1437930061 45
6 [Daten] -1381923692 45
7 [Daten] -897509245 45
8 [Daten] 2143160664 45
8 [Daten] 2143160664 45
9 [Daten] 2076285063 45
10 [Daten] 1085477085 45
11 [Daten] 640070658 45
12 [Daten] -974424225 45
12 [Daten] -974424225 45
12 [Daten] -974424225 45
13 [Daten] 1465363744 45
14 [Daten] -1765424586 45
14 [Daten] -1765424586 45
14 [Daten] -1765424586 45
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
15 [Daten] 707406378 15
disconnect...
Elapsed Time: 14.0 Sekunden
Lost Packets: 30

Ausgabe des Servers (Empfänger):
[Sequenznummer + "Daten" + empfangeneCRC32 + errechneteCRC32 + Paketlänge]
run:
Server:
1 [Daten] 1313384350 1313384350 45
2 [Daten] 789571407 789571407 45
3 [Daten] -683701755 959572777 45
2 [Daten] -683701755 1059592868 45
3 [Daten] -683701755 -683701755 45
4 [Daten] -777161796 -777161796 45
5 [Daten] 1437930061 1437930061 45
5 [Daten] 1437930061 1437930061 45
6 [Daten] -1381923692 -1381923692 45
7 [Daten] -897509245 -897509245 45
8 [Daten] 2143160664 528049848 45
8 [Daten] 2143160664 2143160664 45
9 [Daten] 2076285063 2076285063 45
10 [Daten] 1085477085 1085477085 45
11 [Daten] 640070658 640070658 45
12 [Daten] -974424225 2081467575 45
12 [Daten] -974424225 -974424225 45
12 [Daten] -974424225 -974424225 45
13 [Daten] 1465363744 1465363744 45
14 [Daten] -1765424586 230041826 45
14 [Daten] -1765424586 -1765424586 45
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707668522 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -1581572171 15
15 [Daten] 707406378 -681091547 15
15 [Daten] 707406378 -681091547 15

Hier sieht man, dass die Empfängerseitig berechnete CRC32 richtig ist, solange die Paketlänge die gleiche bleibt.
 
ClientSeitig beim einlesen geht was schief:
Java:
    while ((len=fr.read(buf,1,buf.length-5))!= -1 && packetLossWindow != 0){
    ...

fr.read gibt die anzahl der gelesenen Zeichen zurück.
der wert in len ist also der Richtige.
Allerdings wird die komplette Länge des Arrays buf aufgefüllt.
len ist also z.B. 15, obwohl in buf 45 byte aufgefüllt sind

zur Lösung:
Java:
    byte[] tmp = new byte[len+5];
    System.arraycopy(buf, 1, tmp, 1, len);

und dann eben mit tmp weiterarbeiten statt mit buf
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Prüfsumme mit CRC32 Netzwerkprogrammierung 9
S CRC32 check von website Netzwerkprogrammierung 3
I Socket Problem mit den WebSocket Antworten der Discord API Netzwerkprogrammierung 0
K Java Websocketserver Problem | Android to Pi Netzwerkprogrammierung 1
C RMI Produzent-Verbraucher-Problem - Code review Netzwerkprogrammierung 12
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
S Problem bei dem Bluetoothverbindungsaufbau Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
M Netty - TCP Problem Netzwerkprogrammierung 4
L Socket Problem mit Server Netzwerkprogrammierung 1
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
M Socket CDI, Websocket reference Problem ! Netzwerkprogrammierung 2
Shams Problem mit Eventbus in Verbindung mit Server Netzwerkprogrammierung 0
G apache httpClient Problem. Netzwerkprogrammierung 5
H Problem mit ObjectStreams Netzwerkprogrammierung 3
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
D Socket BufferedWriter/Reader Problem Netzwerkprogrammierung 1
Maxim6394 Problem mit Socks5 Implementierung Netzwerkprogrammierung 0
C Handle Connection Problem Netzwerkprogrammierung 3
E HttpUrlConnection Cookie Problem Netzwerkprogrammierung 0
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
O 4Gewinnt Multiplayer - Netzwerk Problem (TCP) Netzwerkprogrammierung 1
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
E einfaches Problem: Session-Handling bei Servlets Netzwerkprogrammierung 5
G Problem mit einem FileWatcher Netzwerkprogrammierung 7
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
B Client/Server Connection Problem Netzwerkprogrammierung 2
G Problem mit STATIC-Verständnis Netzwerkprogrammierung 8
S Umstellung AS400 auf Postgre - Problem beim Arbeiten mit Metadaten Netzwerkprogrammierung 2
J Facelets Include Rendered Problem Netzwerkprogrammierung 2
J Socket Problem mit C++/Java Netzwerkprogrammierung 20
P Problem mit Datagram-Sockets Netzwerkprogrammierung 2
G Socket NIO2 Problem mit AsynchronousSocketChannel beim Schließen Netzwerkprogrammierung 3
G Cookie Verwaltungs Problem nach Login auf InetSeite (Wo utma-Cookie?) Netzwerkprogrammierung 18
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 7
B Socket Problem mit Netzwerkchat Netzwerkprogrammierung 21
D RMI Problem beim shutdown von verteilter CORBA-Anwendung Netzwerkprogrammierung 6
Maxim6394 ipv6 Problem Netzwerkprogrammierung 2
Maxim6394 Proxyserver Performance Problem Netzwerkprogrammierung 11
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 5
B RMI und Problem mit rmic-Tool Netzwerkprogrammierung 3
C FTP storeFileStream Problem Netzwerkprogrammierung 3
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
D JavaMail - Mailsabrufen Problem (imap) Netzwerkprogrammierung 12
J HTTP Übersetzung yahoo babelfish - Zeichensatz-Problem Netzwerkprogrammierung 6
D Apache CXF, JAX-WS Problem bei Arrays - einfacher Server Netzwerkprogrammierung 2
M Problem beim Datenempfang Netzwerkprogrammierung 2
X Problem mit Server-Client-Kommunikation Netzwerkprogrammierung 14
M Problem mit Socket-Verbindung Netzwerkprogrammierung 2
N NIO Problem beim speziellen Behandeln von einzelnen Benutzern Netzwerkprogrammierung 13
D Thread problem Netzwerkprogrammierung 3
T Servlets JSP: Tomcat Problem Netzwerkprogrammierung 4
K Client - Server Problem Netzwerkprogrammierung 16
T RMI Problem Client-Server Netzwerkprogrammierung 2
P RMI Stub Problem Netzwerkprogrammierung 3
D Socket UDP Übertragungs Problem Netzwerkprogrammierung 7
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 2
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 6
D Problem mit ObjectInputStreams Netzwerkprogrammierung 10
D Socket Problem mit InputStreamReader Netzwerkprogrammierung 3
V Java Mail Api - IMAP Problem Netzwerkprogrammierung 6
P RMI Problem Netzwerkprogrammierung 4
I Problem bei Outputstreamerzeugung in anderer Klasse als Socket Netzwerkprogrammierung 5
S Socket Problem mit Objektübertragung Netzwerkprogrammierung 16
Shoox Reader / Writer Problem Netzwerkprogrammierung 2
S Problem mit 2 Serversockets unter Win XP Netzwerkprogrammierung 7
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12
M RMI - Connection Problem Netzwerkprogrammierung 7
J Socket Client - Server Problem Netzwerkprogrammierung 4
M Socket Chat-Client-Problem Netzwerkprogrammierung 8
D Client Server Problem, Methode readline() löst SocketException "Connection reset" aus Netzwerkprogrammierung 8
E HTTP Problem beim Auslesen von Websiten Netzwerkprogrammierung 6
T Problem bei Findung der richtigen Architektur Netzwerkprogrammierung 3
AlexSpritze Authentication Problem bei WebServices Netzwerkprogrammierung 4
J Socket Problem -Proxies Netzwerkprogrammierung 2
R HTTP Problem bei Authentifizierung über (Http)UrlConnection Netzwerkprogrammierung 2
F Konzept Problem Netzwerkprogrammierung 12
G NIO Sockets Architektur Problem Netzwerkprogrammierung 2
H Neues NIO problem nachricht an alle clients Netzwerkprogrammierung 3
J Client server problem Netzwerkprogrammierung 3
S Problem bzgl. Sockets / Server-Client-Struktur Netzwerkprogrammierung 3
W RMI Problem Netzwerkprogrammierung 4
M Problem mit Server Netzwerkprogrammierung 5
N Socket Java server c# client problem Netzwerkprogrammierung 7
Y Problem mit ObjectInputStream beim lesen vom Socket Netzwerkprogrammierung 10
R RMI Hibernate Problem Netzwerkprogrammierung 4
Z RMI Problem Netzwerkprogrammierung 11
F RMI problem mit RMI Netzwerkprogrammierung 3
H Object Cast Problem nach Übertragung mit Log4j Netzwerkprogrammierung 5
H Log4j SocketAppender Problem Netzwerkprogrammierung 2
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
P Problem mit JOscarLib Netzwerkprogrammierung 6
0din SMTP Client - readline problem Netzwerkprogrammierung 4
C komisches Problem / ObjectInputStream erstellt sich nicht Netzwerkprogrammierung 5
W vista / win server 2003 netzlaufwerk problem Netzwerkprogrammierung 4
W Problem mit HTTP-Dateiübertragung Netzwerkprogrammierung 6
E Problem: netbeans 6.5 und webanwendung Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben