2014-01-10 87 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

那么我该怎么做才能使其工作 –

相关问题