Example #1
0
void* threadChild(void *arg) {
    /* Child Thread */

    while (parentExit == 0) {
        /* Listening XON XOFF signal */

        if ( recvfrom(sockfd, res, MaxResponseLength, 0, (struct sockaddr *)&targetAddr, &addrLen) == -1 )
            perror("recvfrom");

        Response R;
        R.GetDecompiled(res);
        if ( R.GetType() == ACK ) {
            W.setACK(R.GetNumber());
            printf("ACK received from Frame %d\n", R.GetNumber());
        } else {
            printf("NAK received from Frame %d\n", R.GetNumber());

            string temp = ((W.getFrame(R.GetNumber())).GetCompiled());

            sprintf(bufs, "%s", temp.c_str());
            if (sendto(sockfd, bufs, MaxFrameLength, 0, (struct sockaddr *)&targetAddr, addrLen)==-1) {
                printf("err: sendto\n");
            } else {
                printf("Mengirim Frame %d [NAK]\n", R.GetNumber());
            }
        }

    }

    printf("Exiting Child\n");
    return NULL;
}
Example #2
0
void* threadChild(void *arg) {
	/* Child Thread */
	char* chck;
	int i = 0;
	int length = 0;
	int start = 0;
	bool canBeConsumed = false;
	Frame Ftemp[100];
	int temp[100];
	int tempLength = 0;

	/* Sampai program diakhiri, konsumsi terus byte yang ada pada buffer*/
	while (parentExit != 1) {	
		chck = q_get(sockfd, &buffer);
		if ( chck != NULL ) {
			Frame F;
			F.GetDecompiled(chck);

			// Set frame number dan checksum pada Response
			R.SetNumber(F.GetNumber());
			R.SetChecksum(F.GetChecksum());

			// Checks checksum
				cout << F.GenerateChecksumCRC(chck) << endl;
				cout << F.GetChecksum() << endl;
			if ( F.GenerateChecksumCRC(chck) != F.GetChecksum() ) {
				printf("Invalid Checksum. Send NAK.\n");
				R.SetType(NAK);

				--receivedByte;
			} else {
				R.SetType(ACK);	
			}

			int num = R.GetNumber();
			
			if (tempLength < ( R.GetNumber() + 1 )) {
				tempLength = R.GetNumber() + 1;
			}

			if (R.GetType() == ACK)
			{
				if (num < i)
				{
					temp[num] = num;
					Ftemp[num] = F;
				}
				else {
					temp[i] = i;
					Ftemp[i] = F;
					if ( i > 0 ) { length++; }
				}
			}	
			else {
				//NAK
				if (num < i)
					temp[num] = -1;
				else
					temp[i] = -1;
			}

			int j = Rw.getLength();

			while ( ( temp[j] != -1 ) && ( j < tempLength ) ) {

				Rw.insertFrame(Ftemp[j], j);
				cout << "Mengkonsumsi frame ke-" << j << " [" << Rw.getFrame(j).GetMessage() << "] Mencoba mengirim ACK" << endl;
				
				++consumedByte;
				Rw.slideWindow();
				++j;
			}
			i++;


			sprintf(res, "%s", (R.GetCompiled()).c_str());
			if (sendto(sockfd, res, MaxResponseLength, 0, (struct sockaddr *)&targetAddr, addrLen) == -1) {
				perror("sendto");
			}

			if ( ( getEOF != 0 ) && ( (getEOF + 1) == consumedByte ) ) {
				parentExit = 1;
			}

		}
		
	}

	Rw.iterateFrames();
	printf("Exiting Parent\n");
	return NULL;
}