2011-12-05 42 views
2

我想在C++中開發一個小型的Web服務器,但是當我嘗試讀取圖像文件並將其寫入套接字緩衝區時出現問題。 我發現了一個用C編寫的類似函數,它完美地工作,我不明白爲什麼我的方法不起作用,當我通過瀏覽器連接到服務器並打開一個圖像文件時,我得到了這個輸出。讀取圖像文件C++並將其放在套接字上

「圖像」http://127.0.0.1:7777/myimage.jpg「無法顯示,因爲它包含錯誤。」

這是我的方法:

std::string 
Client::getFileContent(const std::string& name) 
{ 
    std::ifstream f;  f.open(name.c_str(), std::ios::binary); 
    if(!f.is_open()) { 
     return (std::string("")); 

    } else { 
     f.seekg(0, std::ios::end); 
     unsigned int length = f.tellg(); 
     f.seekg(0, std::ios::beg); 

     char* buffer = new char[length];  
     f.read(buffer, length);    

     f.close(); 

     return (std::string(buffer)); 
    } 

} 

然後,我把它寫在一個套接字緩衝區(使用NSPR插座):

void 
Socket::send(const std::string& s) 
{ 
    if(PR_Send(sock, s.c_str(), s.length(), 0, PR_INTERVAL_NO_WAIT) == -1) { 
     throw (Exception::Exception(Exception::Exception::SOCKET_SEND)); 
    } 
} 

這是我在網絡上找到的功能,我不能明白爲什麼這個完美的作品和我不工作OO:

while ((ret = read(file_fd, buffer, BUFSIZE)) > 0) { 
     (void)write(fd,buffer,ret); 

非常感謝你:)

+0

您應該使用['的sendfile(2)'](http://linux.die.net/man/2/sendfile),用於在發送文件套接字來代替 - 它更有效率,因爲它不需要在內核和用戶空間之間來回處理所有文件數據。 –

回答

5

您的問題就在這裏:

return (std::string(buffer)); 

創建從char *字符串將停止在第一個0字節,而圖像可以包含很多。而不是返回一個字符串,返回一個vector<char>

return std::vector<char>(buffer, buffer + length); 
+1

'std :: string'可以包含空字節沒有問題,但是你必須使用不同的構造函數。從char *構造'std :: string'將停在空字節上。但是你可以很好地返回'std :: string(buffer,buffer + length)'。 – 2011-12-05 19:39:51

+0

'std :: vector '不過是因爲你可以直接讀入它。它一直工作,並且C++ 03明確地允許它:'std :: vector result(length); f.read(result.data(),length);返回結果;' - 爲您保存剛剛在原始代碼中泄漏的'new char []'。以同樣的方式讀入'std :: string'是不可能的。 – 2011-12-05 19:44:15

+0

@JulianRaschke:實際上它可以讀入'std :: string'。只需使用'&string [0]'而不是'data()' – Dani

相關問題