Exemple #1
0
 public bool isSentOut(long sequenceNumber)
 {
     return(SequenceNumber.compare(largestSentSequenceNumber, sequenceNumber) >= 0);
 }
Exemple #2
0
        protected void onDataPacketReceived(DataPacket dp)
        {
            try
            {
                long currentSequenceNumber = dp.getPacketSequenceNumber();

                //for TESTING : check whether to drop this packet
                //		n++;
                //		//if(dropRate>0 && n % dropRate == 0){
                //			if(n % 1111 == 0){
                //				logger.info("**** TESTING:::: DROPPING PACKET "+currentSequenceNumber+" FOR TESTING");
                //				return;
                //			}
                //		//}
                bool OK = session.getSocket().getInputStream().haveNewData(currentSequenceNumber, dp.getData());//解析数据包将数据存在AppData类中
                //Log.Write(this.ToString(), "receive data PacketSequenceNumber:" + currentSequenceNumber + "  length:" + dp.getData().Length);
                if (!OK)
                {
                    //need to drop packet...
                    return;
                }

                long currentDataPacketArrivalTime = Util.getCurrentTime();

                /*(4).if the seqNo of the current data packet is 16n+1,record the
                 * time interval between this packet and the last data packet
                 * in the packet pair window*/
                if ((currentSequenceNumber % 16) == 1 && lastDataPacketArrivalTime > 0)
                {
                    long interval = currentDataPacketArrivalTime - lastDataPacketArrivalTime;
                    packetPairWindow.add(interval);
                }

                //(5).record the packet arrival time in the PKT History Window.
                packetHistoryWindow.add(currentDataPacketArrivalTime);


                //store current time
                lastDataPacketArrivalTime = (int)currentDataPacketArrivalTime;


                //(6).number of detected lossed packet

                /*(6.a).if the number of the current data packet is greater than LSRN+1,
                 *      put all the sequence numbers between (but excluding) these two values
                 *      into the receiver's loss list and send them to the sender in an NAK packet*/
                if (SequenceNumber.compare(currentSequenceNumber, largestReceivedSeqNumber + 1) > 0)
                {
                    sendNAK(currentSequenceNumber);
                }
                else if (SequenceNumber.compare(currentSequenceNumber, largestReceivedSeqNumber) < 0)
                {
                    /*(6.b).if the sequence number is less than LRSN,remove it from
                     * the receiver's loss list
                     */
                    receiverLossList.remove(currentSequenceNumber);
                }

                statistics.incNumberOfReceivedDataPackets();

                //(7).Update the LRSN
                if (SequenceNumber.compare(currentSequenceNumber, largestReceivedSeqNumber) > 0)
                {
                    largestReceivedSeqNumber = (int)currentSequenceNumber;
                }

                //(8) need to send an ACK? Some cc algorithms use this
                if (ackInterval > 0)
                {
                    if (n % ackInterval == 0)
                    {
                        processACKEvent(false);
                    }
                }
            }
            catch (Exception exc)
            {
                Log.Write(this.ToString(), exc);
            }
        }
Exemple #3
0
 public bool haveAcknowledgementFor(long sequenceNumber)
 {
     return(SequenceNumber.compare(sequenceNumber, lastAckSequenceNumber) <= 0);
 }