void gen_dismat() { int i,j; float s_obs,s_rand,s_max; for(i=0;i<200;i++) for(j=0;j<200;j++) dismat[i][j] = 0; for(i=0;i<num_seq;i++) for(j=i+1;j<num_seq;j++) { s_obs=(float)scmat[i][j]; s_max=((float)(scmat[i][i]+scmat[j][j]))/2; s_rand = s_obs; while(s_rand>=s_obs || s_rand>=s_max) s_rand=seq_rand(seq[i],seq[j]); dismat[i][j]=-log((s_obs-s_rand)/(s_max-s_rand)); } }
/* The server waits for client to send its initial sequence number, send its own initial sequence number, and returns the client's initial sequence number. */ uint16_t handshake(int sockfd, struct sockaddr_in &clientaddr, socklen_t clientlen) { unsigned char handshake_buf[HEADERSIZE]; segment syn, ack; // receive syn long recv_len; if ((recv_len = recvfrom(sockfd, handshake_buf, HEADERSIZE, 0, (struct sockaddr *) &clientaddr, &clientlen)) < 8) { cerr << "syn error" << endl; return USHRT_MAX; } syn.decode(handshake_buf, HEADERSIZE); if (syn.getFlagsyn()) { server_seq = server_ack = seq_rand(MAX_SEQ_NUM); bool firstSyn = true; do {// send syn-ack segment synack; synack.setSeqnum(server_seq); setReplyAck(syn, synack, 1); client_ack = synack.getAcknum(); synack.setFlagsyn(); synack.setFlagack(); unsigned char *handshake_buf2 = synack.encode(NULL, 0); sendto(sockfd, handshake_buf2, HEADERSIZE, 0, (struct sockaddr *) &clientaddr, clientlen); if (firstSyn) { cout << "Sending packet " << server_seq << " " << cwnd << " " << ssthresh << " SYN" << endl; firstSyn = false; } else { cout << "Sending packet " << server_seq << " " << cwnd << " " << ssthresh << " Retransmission SYN" << endl; } clock_t clock_begin, clock_end; clock_begin = clock_end = clock(); double elapsed_secs = 0.0; // receive ack while ((recv_len = recvfrom(sockfd, handshake_buf, HEADERSIZE, MSG_DONTWAIT, (struct sockaddr *) &clientaddr, &clientlen)) == -1) { if (errno != EWOULDBLOCK && errno != EAGAIN) perror("recvfrom"); clock_end = clock(); elapsed_secs = double(clock_end - clock_begin) / CLOCKS_PER_SEC; if (elapsed_secs >= timeout) break; } if (elapsed_secs < timeout) { ack.decode(handshake_buf, HEADERSIZE); if (ack.getFlagsyn()) continue; else break; } } while (true); server_seq = (server_seq + 1) % MAX_SEQ_NUM; if (ack.getFlagack() && ack.getAcknum() == server_seq) { cout << "Receiving packet " << ack.getAcknum() << endl; server_ack = ack.getAcknum(); return client_ack; } else { cout << "ACK flag: " << ack.getFlagack() << endl; cout << "SYN flag: " << ack.getFlagsyn() << endl; cout << "ack num received: " << ack.getAcknum() << endl; cout << "global_seq: " << server_seq << endl; cerr << "ack flag error or acknum error" << endl; return USHRT_MAX; } } else { cerr << "syn flag error" << endl; return USHRT_MAX; } }