-1

HTTP クライアントを構築しようとしています。これまでのところ、IPアドレスを取得してhttp応答を出力するものがありますが、問題ありません。しかし、その応答を取得して文字列に入れようとすると、プログラムがハングします。

したがって、これは機能します:

write(sockfd, sendBuff, strlen(sendBuff));
string s = "";

while((n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
{
    recvBuff[n] = 0;
    if(fputs(recvBuff, stdout) == EOF)
    {
        printf("\n Error : Fputs error\n");
    }
}

そして、これはしません:

write(sockfd, sendBuff, strlen(sendBuff));
string s = "";

while((n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
{
    recvBuff[n] = 0;
    s.append(recvBuff, strlen(recvBuff));
}

応答全体を解析するオブジェクトがあるため、http 応答全体を単一の文字列に入れたいと思っています。どんな助けでも大歓迎です!

4

2 に答える 2

0

出力を格納するために文字列ストリームを使用することを検討しましたか? 次のようなことができます。

write(sockfd, sendBuff, strlen(sendBuff));
stringstream s;
s.str(""); // resets the internal string

while((n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
{
    recvBuff[n] = 0;
    s << recvBuff;
}

次に、結果の文字列を処理するときに、次を使用して内部文字列バッファーを介して取得できます。

s.str();

さまざまな部分から処理するための文字列を作成する必要があるときに、これを何度も使用しました。あなたのマイレージは異なる場合があります。コンパイルして試してみてください。お役に立てば幸いです。

于 2013-04-23T01:16:06.153 に答える
0

ソケットがエラーまたは切断されるまで、連続ループでソケットから読み取っています。これは、HTTP を処理するときに行うのは完全に間違っています。1 つには、サーバーが応答の最後に接続を閉じない可能性があり、コードがデッドロックする可能性があります。

HTTP メッセージには構造がありますが、その事実を完全に無視しています。HTTP 応答を正しく読み取るには、 RFC 2616 セクション 4.4で概説されている規則に従って、応答の構造を把握する必要があります。これにより、応答の読み取り方法と、応答がいつ完了したかを知る方法が決まります。

于 2013-04-23T03:16:05.763 に答える