Exemplo n.º 1
0
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;
    }
}