Beispiel #1
0
Reliapack::Reliapack(char * data, int dataLength, int seqNum, Datapack *resp) {
  
  numPackets = (dataLength + MAX_DATA_LENGTH - 1) /MAX_DATA_LENGTH;
  numPackets = (numPackets == 0) ? 1 : numPackets; //can't have a length of 0
  packets = new char *[numPackets];
  lengths = new int[numPackets];
  sequenceNum = seqNum;
      
  int dataOffset = 0; //be careful with this variable
  int bufLength = MAX_DATA_LENGTH + HEADER_LENGTH;
  //this can be done to all packets
  for(int i=0; i<numPackets; i++) {
    if(i == (numPackets - 1)) //if this is the last packet, change the buffer length
      bufLength = dataLength - dataOffset + HEADER_LENGTH;
    int oldDataOffset = dataOffset;
         
    //copy into buffer in DatagramPacket
    packets[i] = new char[bufLength];
    lengths[i] = bufLength;
    for(int bufPlace=HEADER_LENGTH; bufPlace < bufLength; ) 
      packets[i][bufPlace++] = data[dataOffset++];
      
    setSeqNum(packets[i], seqNum);
    setRetryNum(packets[i], 0);
    setResponseSeqNum(packets[i], resp == 0 ? 0 : resp->getSequenceNumber());
    setResponseRetryNum(packets[i], 0); //the retry number should only be set for ack packets
    setOffset(packets[i], oldDataOffset);
    setTotalLength(packets[i], dataLength);
  }
  memcpy(&address, resp->getAddress(), sizeof(struct sockaddr_in));
  ftime(&lastEventTime);
}
Beispiel #2
0
enum event getEvent(ack_t* ack){
//	int   seq_num;
	uint32_t seq_num;
//	int   buf_len;
	uint32_t buf_len;
//	long  tot_bytes;
	uint32_t tot_bytes;
//	off_t offst;
	uint32_t offst;

        if (ack == NULL)
		return INVALID_EVT;

	if( timerEvent == TIMEOUT) {
	      timerEvent = INVALID_EVT;
	      return TIMEOUT;
	}
	else if(cWnd >= ssThresh)
	{
		return CNWD_GR_SSTHR;
	}
	else if(dupAckCount == 3)
	{
      		pthread_mutex_lock(&m);
		file_off_to_read = offset_just_seen;
      		pthread_mutex_unlock(&m);
		setSeqNum(prev_ack.sequencenumber+1);

		return DUPACKCNT_3;
	}
	else
	{
		seq_num   = ntohl(ack->sequencenumber);
		buf_len   = ntohl(ack->buf_len);
		offst     = ntohl(ack->f_offset);
		tot_bytes = ntohl(ack->tot_bytes);

		if((prev_ack.sequencenumber == seq_num) &&
		   (prev_ack.tot_bytes == tot_bytes) &&
		   (prev_ack.f_offset == offst) &&
		   (prev_ack.buf_len == buf_len))
		{
			return DUPACK;
		}

		prev_ack.sequencenumber = seq_num;
		prev_ack.buf_len = buf_len;
		prev_ack.tot_bytes = tot_bytes;
		prev_ack.f_offset = offst;

		offset_just_seen = offst;
		bytesReceivedByClient = tot_bytes;
		reset_totalBytes();
		return NEW_ACK;
	}

	return INVALID_EVT;

}
Beispiel #3
0
void FileStore::setNextTargetMsgSeqNum( int value ) throw ( IOException )
{
  m_cache.setNextTargetMsgSeqNum( value );
  setSeqNum();
  
}
Beispiel #4
0
void FileStore::incrNextTargetMsgSeqNum() throw ( IOException )
{
  m_cache.incrNextTargetMsgSeqNum();
  setSeqNum();
  
}
PushHistoryItem::PushHistoryItem(const QString &itemId, int seqNum)
{
    setItemId(itemId);
    setSeqNum(seqNum);
}