2017-02-28 43 views
0

我試圖通過套接字將所有類型的文件發送到C++中的瀏覽器。我能夠發送。 txt.html文件通過套接字很好,但是當我嘗試發送JPEG時,出現錯誤The image "localhost:8199/img.jpg" cannot be displayed because it contains errors。我不知道爲什麼我的程序可以正常發送文本文件,但無法處理圖像。這是我讀文件,並將其寫入到客戶端:當在C++中通過套接字發送圖像時,「圖像無法顯示錯誤」

int fileLength = read(in, buf, BUFSIZE); 
    buf[fileLength] = 0; 
    char *fileContents = buf; 

    while (fileLength > 0) { 

     string msg = "HTTP/1.0 200 OK\r\nContent-Type:" + fileExt + "\r\n\r\n\r\nHere is response data"; 
     int bytes_written; 

     if(vrsn == "1.1" || vrsn == "1.0"){ 
      write(fd, msg.c_str(), strlen(msg.c_str()));  
      bytes_written = write(fd, fileContents, fileLength); 
     } else { 
      bytes_written = write(fd, fileContents, fileLength); 
     } 

     fileLength -= bytes_written; 
     fileContents += bytes_written; 
    } 

全部代碼是在這裏:http://pastebin.com/vU9N0gRi

如果我查一下我的瀏覽器的網絡控制檯響應報頭,我看到Content-Typeimage/jpeg所以我不確定我做錯了什麼。

圖像文件的處理方式與普通文本文件不同嗎?如果是這樣,爲了處理將圖像文件發送到瀏覽器,我必須做些什麼?

+1

損壞頭和壞的長度(圖片不是字符串)。 –

回答

3

string msg =「HTTP/1.0 200 OK \ r \ nContent-Type:」+ fileExt +「\ r \ n \ r \ n \ r \ n這裏是響應數據。

這是對二進制數據(如圖像)無效的HTTP響應。在HTTP頭尾部\r\n\r\n終止後,之後的所有內容都是消息正文數據。所以,你發送\r\nHere is response data作爲你的圖像的頭幾個字節,破壞它們。您需要將其完全刪除,即使對於您的txthtml文件也是如此。

更糟的是,你在每次循環發送msg,所以你的文件數據的每一個緩衝區前與您的HTTP響應字符串,徹底破壞進一步的圖像數據。

此外,您的回覆缺少Content-LengthConnection: close響應標頭。

嘗試一些更喜歡這個:

int sendRaw(int fd, const void *buf, int buflen) 
{ 
    const char *pbuf = static_cast<const char*>(buf); 
    int bytes_written; 

    while (buflen > 0) { 
     bytes_written = write(fd, pbuf, buflen); 
     if (written == -1) return -1; 
     pbuf += bytes_written; 
     buflen -= bytes_written; 
    } 

    return 0; 
} 

int sendStr(int fd, const string &s) 
{ 
    return sendRaw(fd, s.c_str(), s.length()); 
} 

... 

struct stat s; 
fstat(in, &s); 
off_t fileLength = s.st_size; 

char buf[BUFSIZE]; 
int bytes_read, bytes_written; 

if ((vrsn == "1.1") || (vrsn == "1.0")) { 
    ostringstream msg; 
    msg << "HTTP/1.0 200 OK\r\n" 
     << "Content-Type:" << fileExt << "\r\n" 
     << "Content-Length: " << fileLength << "\r\n" 
     << "Connection: close\r\n" 
     << "\r\n"; 
    sendStr(fd, msg.str()); 
} 

while (fileLength > 0) { 
    bytes_read = read(in, buf, min(fileLength, BUFSIZE)); 
    if (bytes_read <= 0) break; 
    if (sendRaw(fd, buf, bytes_read) == -1) break; 
    fileLength -= bytes_read; 
} 

close(fd); 
2

write(fd, msg.c_str(), strlen(msg.c_str())); - 你認爲圖像可能包含空(零)字節?所以把它當作C風格的字符串並不是一個好主意。

您應該發送您的原始數據並寫入該數據的大小 - 即而不是,直到第一個空字節爲止。

+0

原始數據不是由這一行發送的:'bytes_written = write(fd,fileContents,fileLength);'? –

+0

'vrsn'是一個字符串。它是HTTP/1.1字符串的1.1部分。 –

+1

@MahmudAdam:你發送的HTTP響應都是錯誤的。看到我的答案。 –

相關問題