Удп стоп-а-жди не работает - PullRequest
1 голос
/ 15 марта 2012

Я пытаюсь реализовать протокол UDP Stop-and-Wait. Мне удалось получить отправителя и получателя UDP успешно передать файл изображения. Сейчас я пытаюсь реализовать ACK.

Когда мой отправитель заканчивает отправку пакета, он ждет, пока получатель отправит ACK. Получатель отправляет ACK, как только он получил пакет от отправителя. Вот код в отправителе, который ожидает ACK: где seqNum - это номер пакета, который отправитель только что отправил получателю, а sendPacket - это только что отправленный пакет. Я добавляю это в качестве параметра на случай, если отправителю потребуется отправить его повторно.

private static void receiveACK(int seqNum, DatagramPacket sendPacket) throws IOException {
        byte[] ack = new byte[2];
        boolean received = false;
        int recSeqNum = -1;
        ByteArrayInputStream bais = new ByteArrayInputStream(ack);
        DataInputStream dis = new DataInputStream(bais);
        DatagramPacket receivePacket = new DatagramPacket(ack, ack.length);
        while(!received) {
            try {
                clientSocket.setSoTimeout(50);
                clientSocket.receive(receivePacket);
                recSeqNum = dis.readShort();
                System.out.println("ACK: " + ack );
            } catch (SocketTimeoutException e) {
                System.out.println("Timed out: Still waiting for ACK");
            }
            System.out.println(recSeqNum);
            if(recSeqNum == seqNum) {
                received = true;
            } else {
                clientSocket.send(sendPacket);
            }
        }
    }

Вот код в приемнике, который отправляет ACK:

private static void sendACK(int seqNum, InetAddress returnAddress) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(baos);
        dos.writeShort(seqNum);
        dos.flush();
        System.out.println("send: " + seqNum);
        byte[] sendArray = baos.toByteArray();
        DatagramPacket sendPacket = new DatagramPacket(sendArray, sendArray.length, returnAddress, port );
        receieverSocket.send(sendPacket);
    }

Проблема в том, что получатель просто постоянно пытается отправить первый пакет, а отправитель просто отключается.

Отправитель и получатель находятся на одном компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...