/* typedef struct { uint16_t number; uint8_t data[2]; uint8_t crc[2]; char end; } packet_t; long M = 2147483647; void AddCongestion(char *data, double p) { char c, *pointer = data; int i; while (*pointer != '\0') { c = 0x01; for ( i = 0; i < 8; i++) { if ((double)random()/M <= p) *pointer ^= c; c <<= 1; } pointer++; } } */ int main(int argc, char *argv[]) { packet_t* packet; packet->number = 0; packet->data[0] = 'a'; packet->data[1] = 'b'; uint16_t crc = calculate_CCITT16((uint8_t *) packet, 4, GENERATE_CRC); packet->crc[0] = (uint8_t)(crc >> 8); packet->crc[1] = (uint8_t)(crc & 0xFF); packet->end = '\0'; printf("Packet before introducing error: %d %c%c %02x%02x\n", packet->number, packet->data[0], packet->data[1], packet->crc[0], packet->crc[1]); double ber = 1.0; AddCongestion((char *) packet, ber); packet->data[0] = 'x'; printf("Packet after introducing error: %d %c%c %02x%02x\n", packet->number, packet->data[0], packet->data[1], packet->crc[0], packet->crc[1]); if (!calculate_CCITT16((char *) packet, 6, CHECK_CRC)) printf("No error!\n"); else printf("Error!\n"); }
int main(int argc, char** argv) { int fd, s, SenderAddr2Len, do_i_take; int n = 0; int ack_num = 0; double probability; socklen_t SenderAddrLen; char* buff[8]; char* ack_pack = malloc(3 * sizeof(char)); if(argc == 1) { probability = 0.001; } else { probability = atof(argv[1]); } //Configure struct for the sender SenderAddr.sin_family = AF_INET; SenderAddr.sin_port = htons(54841); SenderAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); SenderAddrLen = sizeof(SenderAddr); //Bind the sender struct to a port to listen fd = socket(AF_INET, SOCK_STREAM, 0); bind(fd, (struct sockaddr*)&SenderAddr, SenderAddrLen); //Listen on the new port if(DEBUG) printf("Listening\n"); listen(fd, 2); s = accept(fd, (struct sockaddr*)&SenderAddr2, &SenderAddr2Len); if(DEBUG) printf("Accepted\n"); int i = 0; for(;;) { n = read(s, buff, 8); buff[n]=""; if(DEBUG) printf("%s\n", buff); if(AddCongestion(probability)==1) { if(DEBUG) printf("nope\n"); } else if(AddCongestion(probability)==0) { sleep(1); sprintf(ack_pack, "%d", ack_num); printf("%s\n", ack_pack); write(s, ack_pack, sizeof(ack_pack)); ack_num++; } } close(fd); close(s); return 0; }