2017-02-28 13 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())); - 画像にnull(ゼロ)バイトが含まれている可能性がありますか? Cスタイルの文字列として扱うのは良い考えではありません。

生データを送信し、そのデータのサイズを書き込む必要があります.ではなく、最初のヌルバイトまでです。

+0

生データがこの行から送られてこないのですか? 'bytes_written = write(fd、fileContents、fileLength);'? –

+0

'vrsn'は文字列です。これはHTTP/1.1文字列の1.1部分です。 –

+1

@MahmudAdam:HTTP応答を間違って送信しています。私の答えを見てください。 –

関連する問題