2012-01-04 77 views
0

我有這個函數來獲取文件的內容,的C++ socket二進制文件

#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(); 
} 
} 

,結果是一個壞的管道(我用g ++編譯器運行這個到freebsd 6.4 amd),所以我錯過了,連接很好,我可以調用t分機從客戶端到服務器和反向的問題與二進制文件

+0

你真的應該對你的write()和read()調用進行錯誤檢查。 – 2012-01-04 16:51:09

回答

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 2012-01-04 17:10:22