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); }
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; }