void* threadParent(void *arg) { /* Parent Thread */ char* chck; /* Ketika belum diterima End Of Frame, teruskan listening untuk penerimaan byte */ while ( (parentExit != 1) ) { chck = rcvchar(sockfd, &buffer); if ( chck != NULL ) { Frame F; F.GetDecompiled(chck); if ( (F.GetMessage()).at(0) != 26 ) { printf("Menerima Frame ke-%d\n", F.GetNumber()); } else { printf("EOF diterima\n"); getEOF = F.GetNumber(); } } } printf("Exiting Child\n"); return NULL; }
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; }