コード例 #1
0
ファイル: link_layer.c プロジェクト: joaoDavidGB/RCOM
int llread(int fd, char * buffer) {

    //printf("iniciar llread \n");
    while(1) {
        info->frameTempLength = readFrame(info->frameTemp);
        char * type = NULL;
        type = verifyFrameType(info->frameTemp);
        if (type == "set") {
            buildFrame(info->flag, "ua");
            transmitirFrame(info->frameSend, info->frameSendLength);
            continue;
        }
        else if (type == "I0" || type == "I1") {
            destuffing(info->frameTemp, &info->frameTempLength);
            //fprintf(stderr,"Destuffing ");
            /*int bb;
            for(bb = 0; bb < info->frameTempLength; bb++){
              fprintf(stderr,"0x%x ", info->frameTemp[bb]);
            }
            fprintf(stderr,"\n");*/
            if (verifyFrame(info->frameTemp, info->frameTempLength, type)) {

                if(type == "I0" && !info->sequenceNumber
                        || type == "I1" && info->sequenceNumber) {
                    //printf("recebeu a trama I correspondente aos sequenceNumber %d \n", info->sequenceNumber);
                    char * typeRR = malloc(5);
                    sprintf(typeRR, "rr%d", !info->sequenceNumber);
                    //printf("criar frame de %s \n", typeRR);
                    buildFrame(info->flag, typeRR);
                    transmitirFrame(info->frameSend, info->frameSendLength);
                    free(typeRR);
                    info->sequenceNumber = !info->sequenceNumber;
                }
                else {
                    char * typeRR = malloc(5);
                    sprintf(typeRR, "rr%d", info->sequenceNumber);
                    //printf("criar frame de %s \n", typeRR);
                    buildFrame(info->flag, typeRR);
                    transmitirFrame(info->frameSend, info->frameSendLength);
                    free(typeRR);
                    continue;
                }

                int j;
                //printf("frameTempLength: %d\n", info->frameTempLength);
                //printf("dados recebidos: ");


                for(j = 0; j < (info->frameTempLength-6); j++) {
                    info->dados[j] = info->frameTemp[4+j];
                    //printf(" %x ", info->dados[j]);
                    buffer[j] = info->dados[j];
                    //printf(" %x \n", info->dados[j]);
                }
                //printf("\n");
                info->lengthDados = j;
            }
            else {
                char * typeREJ = malloc(5);
                sprintf(typeREJ, "rej%d", !info->sequenceNumber);
                //printf("criar frame de %s \n", typeREJ);
                buildFrame(info->flag, typeREJ);
                transmitirFrame(info->frameSend, info->frameSendLength);
                free(typeREJ);
                continue;
            }
        }
        break;
    }

    return 1;
}
コード例 #2
0
ファイル: dataLink.c プロジェクト: leonardo-faria/RCOM1
int llread(int fd, unsigned char** buffer) {
	int stuff_size;
	int pack_size;
	falhas = 0;
	while (1) {
		unsigned char *stuffed = malloc((PACK_SIZE + 4) * 2 + 2);
		alarm(timeoutTime);
		timeout = 0;
		stuff_size = 0;
		int start = 0;
		int stop = 0;

		while (timeout != 1 && !stop) {
			int r = read(fd, &stuffed[stuff_size], 1);
			if (r > 0) {
				if (stuff_size != 0 && stuffed[stuff_size] == F)
					stop = 1;
				else if (stuff_size == 0 && stuffed[0] == F)
					start = 1;
				if (start)
					stuff_size += r;
			}
		}
		if (timeout == 1) {
			timeout = 0;
			continue;
		}
		falhas = 0;
		alarm(0);
		unsigned char* frame;

		int frame_size = destuffing(stuffed, stuff_size, &frame);

		if (frame_size < 0) {
			//send_reject(fd);
			continue;
		}

		pack_size = infoStateMachine(frame, frame_size, buffer);

		if (pack_size < 0) {
			//send_reject(fd);
			continue;
		}

		if (pack_size >= 0) {
			unsigned char* rr;
			int missing;

			if (ns == 0)
				missing = create_control_frame(RR1, &rr);
			else
				missing = create_control_frame(RR0, &rr);

			int num = 0;

			while (missing > 0) {
				num = write(fd, rr, missing);
				rr += num;
				missing -= num;
			}
			break;
		}
	}
	if (ns == 0)
		ns = 1;
	else
		ns = 0;
	if (falhas < numRetransmissoes)
		return pack_size;
	return -1;
}