2013-12-16 2 views
0

Я пытаюсь отправить файлы с помощью TCP от клиента окна к серверу Linux в C.Файл частично отправлен в с

Размер буфера я использую для передачи данных 65535. Если размер файл превышает это значение, я получаю сообщение об ошибке «сброс соединения с помощью одноранговой сети» или код ошибки 10054. Когда размер файла меньше 65535 байт, сервер получает только часть его (обычно 2760 байт).

Я просто хочу отправить файлы с максимальным размером 50 МБ.

Это часть клиента окон, которые я использую для отправки данных:

char *fileName;  // pointer to filename 
    char buf[65535];  // buffer 
    int fileSize; // # bytes to send 

    for(i = 0; i < ARRAYSIZE; i++) { 
     if(selectList[i] != NULL) { 
      // select file 
      fileName= selectList[i];      // get path and filename from selectList 
      printf("=============================================\nSending: %s\n", fileName); 
      filefd = fopen(fileName, "rb");     // open file 
      if(filefd == NULL) { 
       printf("File %s not found\n", fileName); 
       exit(1); 
      } 

      // read and send file 
      memset(buf, '\0', 65535); 
      while((fileSize= fread(buf, sizeof(char), 65535, filefd)) > 0) {   // read file 
       if((numberOfBytes = send(sockfd, buf, fileSize, 0)) < 0) {        // send buffer 
        printf("send: %s (Error: %d)\n", filename, WSAGetLastError()); 
        break; 
       } 
       printf("#bytes = %i \n", numberOfBytes); 
       memset(buf, '\0', 65535); 
      } 
      printf("File %s send!\n", filename); 

      // close file after sending it 
      if(fclose(filefd) < 0) { 
       printf("fclose: %i", WSAGetLastError()); 
      } 
     } else if(selectList[0] == NULL) { 
      printf("no files selected"); 
     } 
    } 

SelectList содержит несколько строк, например: C: \ Windows \ test.txt

Recieve часть сервер Linux:

char* fr_name = "/home/MtFS/UploadedFiles/public/testFile.gif"; 
    FILE *fr = fopen(fr_name, "wb"); 

    if(fr == NULL) 
     printf("[Open_File]file %s cannot be created\n", fr_name); 
    else { 
     bzero(revbuf, LENGTH); 
     int fr_block_sz = 0; 

     while((fr_block_sz = recv(nsockfd, revbuf, LENGTH, 0)) > 0) { 
      int write_sz = fwrite(revbuf, sizeof(char), fr_block_sz, fr); 
      if(write_sz < fr_block_sz) { 
       error("[Write] error\n"); 
      } 
      bzero(revbuf, LENGTH); 
      if (fr_block_sz == 0 || fr_block_sz != 512) { 
       break; 
      } 
     } 

     if(fr_block_sz < 0) { 
      if (errno == EAGAIN) { 
       printf("[Receive] time out\n"); 
      } 
      else { 
       printf("[Receive] error\n"); 
       exit(1); 
      } 
     } 

     printf("[Receive] succesfull\n"); 
     fclose(fr); 
    } 

Что я делаю неправильно?

ответ

0

Ваша проблема в том, что эти 3 строки кода. Это не правильный способ узнать, что все готово:

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

Также вы проверяете 512 вместо LENGTH. Но только 0 означает, что вы закончили (при условии, что ваше соединение не НЕ НЕОБХОДИМО.)

В качестве примечания: вам не нужно очищать буферы (bzero, memset) перед их использованием с чтением с момента чтения/recv будет перезаписывать содержимое буферов в любом случае.

+0

Спасибо за ответы, я изменил, если-заявление если (fr_block_sz == 0) размер файла ПОЛУЧАЛ правильно, но сам файл пуст/поврежден. Любые подсказки? – EJN

+0

Спасибо, что это работает сейчас, я случайно изменил что-то еще. if (fr_block_sz == 0). – EJN

+0

Ошибки обнаруживаются с -1, read/recv возвращает -1 и устанавливает переменную errno. Для получения дополнительной информации попробуйте 'man 2 read' и' man 2 recv' в консоли Linux. –

0

Я думаю, что виновником является эта линия на сервере

if (fr_block_sz == 0 || fr_block_sz != 512) { 

fr_block_sz кабины быть что-нибудь между 1 до 65535 - блок размера, который вы послали.

В вашем коде, если его не 512, так что ваш сервер завершает соединение.

+0

Спасибо за ответы, я изменил if-statement на if (fr_block_sz == 0) Размер полученного файла верен, но сам файл пуст/поврежден. Любые подсказки? – EJN

Смежные вопросы