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); }
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; }
void FileStore::setNextTargetMsgSeqNum( int value ) throw ( IOException ) { m_cache.setNextTargetMsgSeqNum( value ); setSeqNum(); }
void FileStore::incrNextTargetMsgSeqNum() throw ( IOException ) { m_cache.incrNextTargetMsgSeqNum(); setSeqNum(); }
PushHistoryItem::PushHistoryItem(const QString &itemId, int seqNum) { setItemId(itemId); setSeqNum(seqNum); }