2014-01-10 129 views
0

我有一個C++ linux服務器,帶有基本的服務器套接字。下面是我使用的服務器png圖片內容:在C++服務器上提供圖像

string ms = "HTTP/1.0 200 OK\r\nContent-type: image/png\r\n\r\n"; 
ifstream myfile("xampl.png", ios::in|ios::binary|ios::ate); 
string line; 
char* memblock; 
streampos size; 
if(myfile.is_open()){ 
    size = myfile.tellg(); 
    memblock = new char [size]; 
    myfile.seekg (0, ios::beg); 
    myfile.read (memblock, size); 
    myfile.close(); 
} 
ms.append(string(memblock)); 
cout << "\"" << ms << "\"" << endl; 
char* msg = new char[ms.size()+1]; 
copy(ms.begin(), ms.end(), msg); 
msg[ms.size()] = '\0'; 
int len; 
ssize_t bytes_sent; 
len = strlen(msg); 
bytes_sent = send(new_sd, msg, len, 0); 

我知道我嘗試讀取PNG文件作爲二進制文件,但我不知道做什麼。當我telnet到這個服務器時,我得到了一個奇怪的字符,這讓我相信我已經服務過這個文件,但是當我在瀏覽器中查看它時,我在所有瀏覽器中都找到了圖像未找到的圖標。請幫助...

+1

轉儲文件到一個MEM塊,然後到一個字符串,然後到一個C字符串不僅是一個複雜的做事方式,它也是越野車。 C字符串將在遇到的第一個'\ 0'字符處結束,所以你的代碼對於文本文件可以正常工作,但會在二進制文件中窒息。 –

+0

所以我應該讀它作爲一個文本文件? –

+0

不!作爲一個二進制文件,進入一個內存塊,在您發送所需的頭文件後,它將直接傳遞到輸出套接字。 –

回答

1

OK,讓我們開始爲等價的PHP代碼,以擺脫爛攤子這是應該做同樣的事情在C++

// send required headers as plain text 
header("Content-type: image/png"); 

// read the image as a binary block 
$img_data = file_get_contents("xample.png"); 

// send it 
echo $img_data; 

C++等價的:

string headers = "HTTP/1.0 200 OK\r\nContent-type: image/png\r\n\r\n"; 
send (new_sd, headers.data(), headers.length(), 0); 

ifstream f("xampl.png", ios::in|ios::binary|ios::ate); 
if(!f.is_open()) error ("bloody file is nowhere to be found. Call the cops"); 
streampos size = f.tellg(); 
char* image = new char [size]; 
f.seekg (0, ios::beg); 
f.read (image, size); 
f.close(); 

send (new_sd, image, size, 0); 
+0

讓我試試..... –

+0

不,評論,只接受..! –

+0

和一個+1的課程!非常感謝! –

1

memblock轉換爲字符串不會工作,如果它嵌入了空字符,它幾乎肯定會這樣做,並且您不通過長度。我不確定你爲什麼要用char* s和std::string s來完成所有這些工作,但是一旦你有了memblocksize,就可以將它們用於send。如果你想給響應字符串加上前綴,那麼就是send

+0

那麼我該怎麼做才能使其工作 –

相關問題