2012-01-04 2 views
0

я иметь эту функцию, чтобы получить содержимое файла,C++ сокет двоичный файл

#define BUFSIZE 512 

vector<int> getContFile(char* pFile) { 
     ifstream vCin(pFile, ios::binary); 
     ifstream::pos_type size; 
     // get vLength of file: 
     vCin.seekg(0, ios::end); 
     size = vCin.tellg(); 
     vCin.seekg(0, ios::beg); 
     vector<int> vTmp; 
     for (int i = 0; i < size; i++) 
      vTmp.push_back(vCin.get()); 
     vCin.close(); 
     return vTmp; 
    } 

и это отправить на сервер

void SendFile() { 
     SendS("upFileUser"); 
     int i; 
     vector<int> vTmp = getContFile("/usr/home/alex/Desktop/eval.tar"); 
     for (i = 0; i < vTmp.size(); i += BUFSIZE) { 
      char *vBuff = new char[BUFSIZE]; 
      for (int j = i; j < BUFSIZE; j++) 
       vBuff[j] = (char(vTmp[i])); 
      SendS(vBuff); 
      } 
     if (i < (vTmp.size() - 1)) { 
      char *vBuff = new char[vTmp.size() - i]; 
      for (int j = 0; j < vTmp.size() - i; j++) 
       vBuff[j + i] = (char(vTmp[j + i])); 
      SendS(vBuff); 
     } 
     sendS("endOfFileTransmision"); 
    } 

    void SendS(char* pSir) { 
     int vLen = strlen(pSir); 
     write(pSocket, &vLen, sizeof (int)); 
     write(pSocket, pSir, vLen); 
    } 

Эта функция receve

char* reciveS() { 
     char* vTmp; 
     int vCt = 0; 
     read(pSocket, &vCt, sizeof (vCt)); 
     if (vCt != 0) { 
      vTmp = new char[vCt]; 
      read(vSocket, vTmp, vCt); 
     } else { 
      vTmp = NULL;  
     } 
     return vTmp; 
    } 

bool receveFile(void) { 
char* vReceve = reciveS(); 
    if (strcmp(vReceve, "upFileUser") == 0) 
{ 
    ofstream vCoutFile; 
    vCoutFile.open("data2.tar", ios::out | ios::binary); 
    while (true) { 
     char *vTmp = new char[BUFSIZ]; 
     vTmp = reciveS(); 
     cout<<vTmp; 
     if (strcmp(vTmp, "endOfFileTransmision") == 0) break; 
     else { 
      cout << vTmp; 
      vCoutFile << vTmp; 
     } 
    } 
    vCoutFile.close(); 
} 
} 

и результат - сломанная труба (я запускаю это для freebsd 6.4 amd с компилятором g ++), так что я пропустил, соединение хорошее, я могу передать t внутр от клиента к серверу и обратной задачи являются двоичным файлом

+0

Вы действительно должны выполнять проверку ошибок на своих вызовах 'write()' и 'read()'. –

ответ

1

Я вижу две проблемы с кодом:

  1. Вы делаете много распределений (new), но вы никогда не освободить память.
  2. В функции SendS вы берете длину строки, но данные в этой «строке» - это вектор целых чисел и является двоичным. Это означает, что данные могут содержать символ завершения строки '\0' (целое число 0).

Кроме того, я действительно не понимаю, что вы делаете. Вместо того, чтобы читать в вектор, создайте char-buffer и выделите достаточно памяти, чтобы поместить весь файл в этот буфер (char *buffer = new char[length_of_file]) и отправить его с длиной буфера.

Что-то вроде этого:

std::pair<size_t, char *> getContFile(const char *pFile) 
{ 
    ifstream vCin(pFile, ios::binary); 
    ifstream::pos_type size; 

    vCin.seekg(0, ios::end); 
    size = vCin.tellg(); 
    vCin.seekg(0, ios::beg); 

    char *buffer = new char[size]; 

    vCin.read(buffer, size); 

    return std::make_pair(static_cast<size_t>(size), buffer); 
} 

void SendFile() 
{ 
    SendS("upFileUser", strlen("upFileUser")); 
    std::pair<size_t, char *> vTmp = getContFile("/usr/home/alex/Desktop/eval.tar"); 

    SendS(vTmp.second, vTmp.first); 

    delete [] vTmp.second; 
} 

void SendS(char *buffer, size_t length) 
{ 
    // Send the length 
    size_t tmp = htonl(length); 
    write(pSocket, &tmp, sizeof(tmp)); 

    // Send the buffer 
    while (length > 0) 
    { 
     ssize_t sent = write(pSocket, buffer, length); 
     if (sent <= 0) 
     { 
      // Some kind of error 
      break; 
     } 

     buffer += sent; 
     length -= sent; 
    } 
} 

ли что-то подобное на приемной стороне.

+0

Я пробую подобное, но '\ 0' - проблема, потому что он переносит первые 18 байт и останавливается – xnl96