sean
sean

Reputation: 146

client server in c- file transfer issue for larger files

The below code works fine for smaller files where the last packet contains data less than maximum length, the function exit properly by displaying file received. How ever if the last packet or buffer of file being transmitted contains exact number as the size of receiving buffer array 512 in my case. then th program keeps waiting for next packet.

All files with size multiple of 512 in my case stuck. Below is the code:

CLIENT code for receiving:

void receiveFile() {
printf("inside receiveFile method\n");
char* fr_name = "final.txt";
int i;
FILE *fr = fopen(fr_name, "a");
int LENGTH = 512;
int fileLength=0;
char revbuf[LENGTH];
if (fr == NULL) {
    printf("File %s Cannot be opened.\n", fr_name);
} else {
    printf("starting to write the file\n");
    bzero(revbuf, LENGTH);
    int fr_block_sz = 0;
    i=0;

    while ((fr_block_sz = recv(4, revbuf, LENGTH, 0)) > 0) {
        fileLength+=fr_block_sz;
        i++;
        printf("Received buffer: %d, %d\n",fr_block_sz,i);

        int write_sz = fwrite(revbuf, sizeof(char), fr_block_sz, fr);

        if (write_sz < fr_block_sz) {
            error("File write failed.\n");
        }
        bzero(revbuf, LENGTH);
        if (fr_block_sz == 0 || fr_block_sz != 512) {
            break;
        }

    }
    if (fr_block_sz < 0) {
        if (errno == EAGAIN) {
            printf("recv() timed out.\n");
        } else {
            fprintf(stderr, "recv() failed due to errno = %d\n", errno);
        }
    }
    printf("FILE RECEIVED....Total Bytes received:%d \n",fileLength);
}
fclose(fr);

}

Server for Receiving the file:

void sendFile() {
printf("inside sendFile method\n");
char* fs_name = "mb.txt";
int LENGTH = 512;
int sfileLength=0;
char sdbuf[LENGTH];
int i=0;
printf("[Client] Sending %s to the Server... \n", fs_name);
FILE *fs = fopen(fs_name , "r");
if (fs == NULL) {
    perror("ERROR: File  not found.\n");
    exit(1);
}

bzero(sdbuf, LENGTH);
int fs_block_sz;
while ((fs_block_sz = fread(sdbuf, sizeof(char), LENGTH, fs)) > 0) {
    i++;
    printf("Sent:%d , %d \n", fs_block_sz,i);
    sfileLength+=fs_block_sz;
    if (send(4, sdbuf, fs_block_sz, 0) < 0) {

        fprintf(stderr, "ERROR: Failed to send file %s. (errno = %d)\n",
                fs_name, errno);
        break;
    }
    bzero(sdbuf, LENGTH);
}
printf("File sent.... Total Bytes:%d\n", sfileLength);
fclose(fs);

}

Upvotes: 0

Views: 851

Answers (1)

user207421
user207421

Reputation: 310850

if (fr_block_sz == 0 || fr_block_sz != 512) {
     break;
}

Remove this code. The first part of the test can never be true due to the 'while' condition, and the second part is unnecessary for the same reason.

Upvotes: 2

Related Questions