2

ページのコンテンツをヘッダー付きで取得しようとしています...しかし、サイズ 1024 のバッファーは、通過する情報の最後のパケットに対して大きすぎるか小さすぎるようです...私はしたくありませんそれが理にかなっていれば、多すぎたり少なすぎたりします。これが私のコードです。すべての情報で問題なくページを印刷していますが、それが正しいことを確認したいと思います。

//Build HTTP Get Request
std::stringstream ss;
ss << "GET " << url << " HTTP/1.0\r\nHost: " << strHostName << "\r\n\r\n";
std::string req = ss.str();

// Send Request
send(hSocket, req.c_str(), strlen(req.c_str()), 0);

// Read from socket into buffer.
do
{
     nReadAmount = read(hSocket, pBuffer, sizeof pBuffer);
     printf("%s", pBuffer);

}
while(nReadAmount != 0);
4

2 に答える 2

2
 nReadAmount = read(hSocket, pBuffer, sizeof pBuffer);
 printf("%s", pBuffer);

これは壊れています。%s書式指定子は、C スタイル (ゼロで終了) の文字列に対してのみ使用できます。printf印刷するバイト数を知るにはどうすればよいですか? その情報は にnReadAmountありますが、使用しません。

printfまた、失敗しても呼び出しreadます。

最も簡単な修正:

 do
 {
     nReadAmount = read(hSocket, pBuffer, (sizeof pBuffer) - 1);
     if (nReadAmount <= 0)
         break;
     pBuffer[nReadAmount] = 0;
     printf("%s", pBuffer);
 } while(1);
于 2013-01-20T02:37:45.997 に答える
2

HTTP 応答を読み取る正しい方法は、応答コードとバージョンを含む完全な - 区切り行 (公式の仕様では を使用するように指定されていてもLF一部のサーバーは使用します) を受信するまで読み取り、LF 区切り行を読み続けることです。これはヘッダーであり、ヘッダーの終わりを示す長さ 0 の行に遭遇するまで、ヘッダーを分析して残りのデータがどのようにエンコードされているかを把握し、それを読み取る適切な方法と方法を知る必要があります。終了します。いくつかの異なる可能性があります。実際のルールについては、RFC 2616 セクション 4.4を参照してください。bare LFCRLF

つまり、コードでは代わりにこの種の構造を使用する必要があります (疑似コード)。

// Send Request
send(hSocket, req.c_str(), req.length(), 0);

// Read Response
std::string line = ReadALineFromSocket(hSocket);
int rescode = ExtractResponseCode(line);
std::vector<std::string> headers;
do
{
     line = ReadALineFromSocket(hSocket);
     if (line.length() == 0) break;
     headers.push_back(line);
}
while (true);

if (
    ((rescode / 100) != 1) &&
    (rescode != 204) &&
    (rescode != 304) &&
    (request is not "HEAD")
)
{
    if ((headers has "Transfer-Encoding") && (Transfer-Encoding != "identity"))
    {
        // read chunks until a 0-length chunk is encountered.
        // refer to RFC 2616 Section 3.6 for the format of the chunks...
    }
    else if (headers has "Content-Length")
    {
       // read how many bytes the Content-Length header says...
    }
    else if ((headers has "Content-Type") && (Content-Type == "multipart/byteranges"))
    {
        // read until the terminating MIME boundary specified by Content-Type is encountered...
    }
    else
    {
        // read until the socket is disconnected...
    }
}
于 2013-01-20T03:50:25.260 に答える