Контрольная сумма реализации проекта RDT, Ack - PullRequest
0 голосов
/ 22 ноября 2018

Мне нужно реализовать надежную передачу данных с использованием контрольных сумм, ACK, порядковых номеров и таймеров обратного отсчета и реализовать следующие функции.

  public static int compute_checksum(String message) {}

  public static boolean isCorrupt(rdtPacket packet) {}

  public static boolean isACK(rdtPacket packet) {}

  public static boolean inOrder(rdtPacket packet, int seqno) {} // has_seq()

И добавить таймер обратного отсчета в сокет при ожидании ACK.

Кроме того, формат пакета будет:

порядковый номер контрольной суммы сообщения

Наконец, ACK будут отправлены с использованием сообщения "ACK"

Это то, что ядо сих пор:

import java.io.*;
import java.net.*;

class RDTClient {
  private static DatagramSocket clientSocket;
  private static InetAddress IPAddress;
  private static final int serverPort = 9876;

  public static void main(String args[]) throws Exception {
    try {
      String serverHostname = new String("127.0.0.1");

      if (args.length > 0) {
        serverHostname = args[0];
      }

      BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));

      clientSocket = new DatagramSocket();

      IPAddress = InetAddress.getByName(serverHostname);
      System.out.println("Attemping to connect to " + IPAddress + ") via UDP port " + serverPort);

      System.out.print("Enter Message: ");
      String message = inFromUser.readLine();

      rdt_send(message);

      // String response = rdt_rcv();
      // System.out.println("Received response: " + response);

      clientSocket.close();
    } catch (UnknownHostException ex) {
      System.err.println(ex);
    } catch (IOException ex) {
      System.err.println(ex);
    }
  }

  private static String make_pkt(String message) {
    System.out.println("[RDTClient:make_pkt] " + message);
    return message;
  }

  private static void rdt_send(String message) {
    System.out.println("[RDTClient:rdt_send] " + message);
    String packet = make_pkt(message);
    udt_send(packet);
  }

  private static void udt_send(String message) {
    // compute the message checksum and create the segment rdt_send and make_pkt
    try {
      byte[] sendData = new byte[1024];
      sendData = message.getBytes();
      DatagramPacket sendPacket =
      new DatagramPacket(sendData, sendData.length, IPAddress, serverPort);
      clientSocket.send(sendPacket);
      System.out.println("[RDTClient:udt_send] Message sent");
    } catch (IOException ioe) {
      System.out.println("Failed to send");
    }
  }

  private static String rdt_rcv() {
    try {
      byte[] receiveData = new byte[1024];
      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
      clientSocket.setSoTimeout(10000);
      clientSocket.receive(receivePacket);
      String message = new String(receivePacket.getData());
      IPAddress = receivePacket.getAddress();
      int port = receivePacket.getPort();

      System.out.println("[RDTClient:rdt_rcv] Received packet from: " + IPAddress + ":" + port);
      return message;
    } catch (IOException ioe) {
      System.out.println("Failed to read from port");
    }
    return "";
  }
}
...