Пример #1
0
void
edit_typeset_rep::set_data (new_data data) {
  set_style (data->style);
  set_init  (data->init);
  set_fin   (data->fin);
  set_att   (data->att);
  notify_page_change ();
  add_init (data->init);
  notify_change (THE_DECORATIONS);
  typeset_invalidate_env ();
}
Пример #2
0
int main(int argc, char *argv[])
{
    int sockfd;
    int portno, n_char;
    int slen;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    char *hostname, *filepath;

    double p_loss, p_corrupt;
    p_loss = 0.0;
    p_corrupt = 0.0;

    int expect_seq_num;
    struct packet snd_pkt, rcv_pkt;

    FILE* file;

    if (argc < 4)
    {
        fprintf(stderr, "Usage: %s hostname port filepath [loss ratio] [corrupt ratio]\n", argv[0]);
        exit(0);
    }

    switch (argc)
    {
        case 6:
            p_corrupt = atof(argv[5]);
        case 5:
            p_loss = atof(argv[4]);
        default:
            filepath = argv[3];
            portno = atoi(argv[2]);
            hostname = argv[1];
            break;
    }

    sockfd = socket(AF_INET, SOCK_DGRAM, 0); // Using UDP!

    if (sockfd < 0)
    {
        error("Error opening socket");
    }

    server = gethostbyname(hostname);
    if (server == NULL)
    {
        fprintf(stderr, "Error: no such host\n");
        exit(0);
    }

    bzero((char *)&serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
    serv_addr.sin_port = htons(portno);

    // Create the initial packet
    expect_seq_num = 1;
    snd_pkt = make_packet();

    set_syn(&snd_pkt);
    snd_pkt.seq_num = 0;
    set_data(&snd_pkt, filepath, strlen(filepath));

    slen = sizeof(serv_addr);

    char str[100] = "copy_";

    char *dirc, *basec, *dname, *bname;
    dirc = strdup(filepath);
    basec = strdup(filepath);
    dname = dirname(dirc);
    bname = basename(basec);

    file = fopen(strcat(str, bname), "wb");

    // Send the initial packet
    msg("Sending file request to sender...\n");
    n_char = sendto(sockfd, &snd_pkt, sizeof(snd_pkt), 0, (struct sockaddr*)&serv_addr, slen);
    if (n_char < 0)
    {
        error("Error sending packet");
    }

    // Go-Back-N FSM
    while (1)
    {
        // Wait to receive a message
        // if (rcv_pkt)
        // {
        //     free(rcv_pkt);
        // }

        rcv_pkt = make_packet();

        n_char = recvfrom(sockfd, &rcv_pkt, sizeof(rcv_pkt), 0, (struct sockaddr*)&serv_addr, (socklen_t*)&slen);

        if (check_none(&rcv_pkt))
        {
            msg("No such file exists on the sender side\n");
            fclose(file);
            remove(str);
            teardown(NULL, sockfd);
        }

        if (check_fin(&rcv_pkt)) // server closing connection
        {
            msg("-> FIN\n");
            msg("<- FIN-ACK ...\n");

            //free(&snd_pkt);
            snd_pkt = make_packet();
            set_fin(&snd_pkt);

            n_char = sendto(sockfd, &snd_pkt, sizeof(snd_pkt), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
            if (n_char < 0)
            {
                error("Error sending FIN-ACK");
            }

            //free(&rcv_pkt);
            //free(&snd_pkt);
            teardown(file, sockfd);
            break;
        }

        if (n_char < 0)
        {
            msg("Packet from sender LOST\n");
        }
        else if (chance() < p_loss)
        {
            msg("Packet from sender LOST\n");
        }
        else if (chance() < p_corrupt)
        {
            msg("Packet from sender CORRUPT\n");
            
            msg("<- RE-ACK: SEQNUM %d ...\n", snd_pkt.seq_num);
            int n_char;
            n_char = sendto(sockfd, &snd_pkt, sizeof(snd_pkt), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

            if (n_char < 0)
            {
                error("Error acking packet\n");
            }
        }
        else if (rcv_pkt.seq_num == expect_seq_num)
        {
            msg("-> DATA: SEQNUM %d\n", rcv_pkt.seq_num);

            fwrite(rcv_pkt.data, 1, rcv_pkt.d_length, file);
            expect_seq_num++;

            //free(&snd_pkt);
            snd_pkt = make_packet();
            set_ack(&snd_pkt);
            snd_pkt.seq_num = rcv_pkt.seq_num;

            send_ack(sockfd, snd_pkt, serv_addr);
        }
        else if (rcv_pkt.seq_num < expect_seq_num)
        {
            msg("-> DATA: SEQNUM %d\n", rcv_pkt.seq_num);

            //free(&snd_pkt);
            snd_pkt = make_packet();
            set_ack(&snd_pkt);
            snd_pkt.seq_num = rcv_pkt.seq_num;

            msg("<- RE-ACK: SEQNUM %d ...\n", snd_pkt.seq_num);
            int n_char;
            n_char = sendto(sockfd, &snd_pkt, sizeof(snd_pkt), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

            if (n_char < 0)
            {
                error("Error acking packet\n");
            }
        }
        else
        {
            msg("-> DATA: SEQNUM %d\n", rcv_pkt.seq_num);
            
            msg("<- RE-ACK: SEQNUM %d ...\n", snd_pkt.seq_num);
            int n_char;
            n_char = sendto(sockfd, &snd_pkt, sizeof(snd_pkt), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

            if (n_char < 0)
            {
                error("Error acking packet\n");
            }
        }
    }
}
Пример #3
0
int main(int argc, char *argv[])
{
    int cwnd;
    cwnd = 4000; // default cwnd

    timeout = 0;

    int WINDOW_SIZE;

	double p_loss, p_corrupt;
    p_loss = 0.0;
    p_corrupt = 0.0;
    
    struct sockaddr_in serv_si, cli_si;
	struct packet snd_pkt, rcv_pkt;

    FILE *file;
    struct stat file_stat;
    int n_packets;
    int readlength;
     
    int portno, sockfd, i, recv_len, send_len;
    int slen = sizeof(cli_si);

    if (argc < 2)
    {
        fprintf(stderr, "Usage: %s port [cwnd] [loss ratio] [corrupt ratio]\n", argv[0]);
        exit(0);
    }

    switch (argc)
    {
        case 5:
            p_corrupt = atof(argv[4]);
        case 4:
            p_loss = atof(argv[3]);
        case 3:
            cwnd = atoi(argv[2]);
        default:
            portno = atoi(argv[1]);
            break;
    }

    WINDOW_SIZE = cwnd / PACKET_SIZE;

    //create a UDP socket
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
    {
        die("socketfd error", sockfd);
    }
     
    // zero out the structure
    memset((char *) &serv_si, 0, sizeof(serv_si));
     
    serv_si.sin_family = AF_INET;
    serv_si.sin_port = htons(portno);
    serv_si.sin_addr.s_addr = htonl(INADDR_ANY);
     
    //bind socket to port
    if(bind(sockfd , (struct sockaddr*)&serv_si, sizeof(serv_si)) == -1)
    {
        die("error in bind\n", sockfd);
    }

    rcv_pkt = make_packet();
    
    msg("Waiting for file request...\n");
    if ((recv_len = recvfrom(sockfd, &rcv_pkt, sizeof(rcv_pkt), 0, (struct sockaddr *) &cli_si, (socklen_t*)&slen)) == -1)
	{
        die("error receive syn", sockfd);
	}

    snd_pkt = make_packet();
    
    if (check_syn(&rcv_pkt)) {
        msg("Received file request for %s\n", rcv_pkt.data);

    	file = fopen(rcv_pkt.data, "rb");

        if (file == NULL) // no file exists
        {
            msg("No such file, sending NONE packet...\n");

            set_none(&snd_pkt);
            if ((send_len = sendto(sockfd, &snd_pkt, sizeof(snd_pkt), 0, (struct sockaddr*)&cli_si, slen)) == -1)
            {
                die("Error sending NONE", sockfd);
            }

            teardown(file, sockfd);
        }
    }

    stat(rcv_pkt.data, &file_stat);
    n_packets = file_stat.st_size / DATA_SIZE;
    if (file_stat.st_size % DATA_SIZE)
    {
        n_packets++;
    }
    
    int base, next_seq, last_ack = 1;

    base = 1;
    next_seq = 1;
    last_ack = 0;

    int pktindex;

    struct packet pkt_win[WINDOW_SIZE];
    char buf[PACKET_SIZE];

    struct sigaction act;
    memset (&act, '\0', sizeof(act));
    act.sa_sigaction = &handle_sigalrm;
    act.sa_flags = 0;
    sigaction(SIGALRM, &act, NULL); //sets timeout handler

    // Send initial packets
    for (i = 0; i < min(WINDOW_SIZE, n_packets); i++) {
        memset(buf, 0, PACKET_SIZE);

        snd_pkt = make_packet();
        snd_pkt.seq_num = i + 1;

        readlength = fread(buf, sizeof(char), DATA_SIZE, file);
        set_data(&snd_pkt, buf, readlength);

        pkt_win[i] = snd_pkt;

        msg("<- DATA: SEQNUM %d ...\n", snd_pkt.seq_num);

        if (sendto(sockfd, &snd_pkt, sizeof(snd_pkt), 0, (struct sockaddr *)&cli_si, slen) < 0)
        {
            error("ERROR on sending");
        }

        next_seq++;
    }

	while (base <= n_packets) {
        if (timeout) {
            int n_char;
            int resend_base = base;

            msg("TIMEOUT: resending packets %d - %d\n", resend_base, min(resend_base + WINDOW_SIZE - 1, n_packets));
            
            while (resend_base < next_seq) {
                pktindex = (resend_base - 1) % WINDOW_SIZE;
                send_len = sendto(sockfd, &pkt_win[pktindex], sizeof(pkt_win[pktindex]), 0, (struct sockaddr*)&cli_si, slen);
                if (send_len < 0)
                {
                    die("Error sending packet during timeout", sockfd);
                }
                msg("Retransmitting DATA with SEQNUM %d ...\n", resend_base);
                resend_base++;
            }

            timeout = 0;
            alarm(TO_SEC);
        }

		rcv_pkt = make_packet();

		if ((recv_len = recvfrom(sockfd, &rcv_pkt, sizeof(rcv_pkt), 0, (struct sockaddr *) &cli_si, (socklen_t*)&slen)) == -1)
		{
	        // Timed out, recvfrom unblocked. 
            // Continue, let loop hit timeout block above
            continue;
		}
        else if (chance() < p_loss)
        {
            msg("Packet from receiver LOST\n");
        }
		else if (chance() < p_corrupt)
		{
			msg("Packet from receiver CORRUPT\n");
		}
		else if (check_fin(&rcv_pkt)) {
			msg("-> FIN-ACK\n");
			teardown(file, sockfd);
		}
		else if (rcv_pkt.seq_num == base) {
			// Correct ACK received, stop timer
            alarm(0);

            msg("-> ACK: SEQNUM %d\n", rcv_pkt.seq_num);
            last_ack = rcv_pkt.seq_num;
            base = rcv_pkt.seq_num + 1;

            // Send packets
            if (next_seq <= min(base + WINDOW_SIZE, n_packets + 1)) {
                memset(buf, 0, PACKET_SIZE);

                if ((readlength = fread(buf, sizeof(char), DATA_SIZE, file)) == 0) {
                    // struct packet fin_pkt = make_packet();

                    // set_fin(fin_pkt);
                    // fin_pkt.seq_num = next_seq;

                    
                    // if ((send_len = sendto(sockfd, &finpkt, sizeof(finpkt), 0, (struct sockaddr*)&cli_si, slen)) < 0) {
                    //     die("Error sending packet during fin", sockfd);
                    // }
                    // else {
                    //     msg("<- FIN ...\n");
                    //     alarm(TO_SEC);
                    // }
                    alarm(TO_SEC);
                }
                else {
                    snd_pkt = make_packet();

                    set_data(&snd_pkt, buf, readlength);
                    snd_pkt.seq_num = next_seq;

                    pktindex = (next_seq - 1) % WINDOW_SIZE;
                    pkt_win[pktindex] = snd_pkt;

                    msg("<- DATA: SEQNUM %d ...\n", next_seq);

                    if ((send_len = sendto(sockfd, &pkt_win[pktindex], sizeof(pkt_win[pktindex]), 0, (struct sockaddr*)&cli_si, slen)) < 0) {
                        die("Error sending packet during data", sockfd);
                    }

                    if (next_seq == base) {
                        alarm(TO_SEC);
                    }

                    if (next_seq <= n_packets)
                    {
                        next_seq++;
                    }
                }
            }
		}
		else {
			// Incorrect ACK received, restart timer
            alarm(TO_SEC);
		}
	}

    // Send FIN
    snd_pkt = make_packet();
    set_fin(&snd_pkt);
    msg("<- FIN ...\n");

    if ((send_len = sendto(sockfd, &snd_pkt, sizeof(snd_pkt), 0, (struct sockaddr*)&cli_si, slen)) < 0) {
        die("Error sending packet during teardown", sockfd);
    }

    rcv_pkt = make_packet();

    if ((recv_len = recvfrom(sockfd, &rcv_pkt, sizeof(rcv_pkt), 0, (struct sockaddr *) &cli_si, (socklen_t*)&slen)) > 0)
    {
        if (check_fin(&rcv_pkt)) {
            msg("-> FIN-ACK\n");
            teardown(file, sockfd);
        }
    }

    teardown(file, sockfd);
    return 0;
}