It sends actually all bytes and files successfully. The problem is when it is received on the server-side. It receives the whole data byte but It is not receiving the whole packet data. Help me, please Here is my code.
What I have tried:
Sender side
while (!feof(fp))
{
int read_len = fread(buffer, 1, block_size, fp);
printf("rd len %d\n", read_len);
read_size += read_len;
memcpy(data[i], buffer, s);
if (i == k - 1 || read_size == file_size)
{
enc_data = xorENC(data, k, s);
for (j = 0; j <= k; j++)
{
packet.num = j;
if ((file_size - read_size + 1) <= PACKLEN)
packet.len = file_size - read_size + 1;
else
packet.len = PACKLEN;
if (j < k)
packet.type = 0;
else
packet.type = 1;
memcpy(packet.data, enc_data[j], s);
sendto(sockfd, &packet, sizeof(packet), 0, (struct sockaddr *)&ser_addr, sizeof(struct sockaddr_in));
}
for (j = 0; j < k; j++)
{
memset(data[j], 0, s);
}
}
i = (i + 1) % k;
}
Receiver side
while (recv_blocks <= total_blocks)
{
int counter = 0;
recvfrom(sockfd, &packet, sizeof(packet), 0, (struct sockaddr *)&server_addr, &addr_size);
printf("recv_blocks= %d ################### \n",recv_blocks);
recv_packet[packet.num] = 1;
memcpy(enc_data[packet.num], packet.data, s);
for (i = 0; i <= k; i++)
{
printf("recv_packet[%d]=%d \n", i, recv_packet[i]);
if (recv_packet[i] == 1)
counter++;
}
printf("packet.num=%d, k=%d, counter=%d \n", packet.num, k, counter);
if (packet.num == k || counter == k + 1)
{
idx = k;
printf("lost idx =%d ####\n", idx);
if (counter < k + 1)
{
for (i = 0; i <= k; i++)
{
if (!recv_packet[packet.num])
{
idx = i;
printf("lost idx =%d ##############\n", idx);
break;
}
}
}
xorDEC(enc_data, idx, k, s);
for (i = 0; i < k; i++)
fwrite(enc_data[i], s, 1, fp);
for (i = 0; i < k+1; i++)
recv_packet[i] = 0;
recv_blocks++;
}
}