Ejemplo n.º 1
0
  private int getAck(TcpSegment segment) {
    int retval;

    // The ack # depends on the segment's flags.
    switch (segment.getFlags()) {
      case TcpSegment.FIN:
      case TcpSegment.SYN:
      case TcpSegment.FIN_ACK:
      case TcpSegment.SYN_ACK:
        retval = segment.getSequenceNumber() + 1;
        break;

      case TcpSegment.PSH:
      case TcpSegment.PSH_ACK:
        retval = segment.getSequenceNumber() + segment.getDataSize();
        break;

      case TcpSegment.ACK:
      default:
        retval = segment.getSequenceNumber();
        break;
    }

    return (retval);
  }
Ejemplo n.º 2
0
  public final void handleReceive(DatagramPacket packet, AsyncDatagramSocket dgram_socket) {
    synchronized (this) {
      try {
        TcpSegment segment = new TcpSegment(packet);
        Object[] args = new Object[1];

        // Generate the appropriate transition based on
        // the header flags.
        args[0] = segment;

        // DEBUG
        //                 System.out.println(
        //                     "Receive event from " +
        //                     packet.getAddress() +
        //                     ":" +
        //                     Integer.toString(packet.getPort()) +
        //                     ":\n" +
        //                     segment);

        // REFLECTION
        // Uncomment the following line to output
        // transitions.
        // _outputTransitions();

        _transition_table[segment.getFlags()].invoke(_fsm, args);
      } catch (Exception jex) {
        System.err.println(jex);
        jex.printStackTrace();
      } finally {
        this.notify();
      }
    }

    return;
  }