2

私は C++ で小さなネットワーク プログラムを書いています。とりわけ、Twitter のプロフィール写真をダウンロードする必要があります。URL のリスト (stl::vector) があります。次のステップは、for ループを作成し、ソケットを介して GET メッセージを送信し、画像を別の png ファイルに保存することだと思います。問題は、最初のメッセージを送信し、回答セグメントを受信し、png データを保存すると、すべて問題ないように見えることです。しかし、次の反復で、同じソケットを介して送信された同じメッセージは、recv() 関数によって 0 受信バイトを生成します。サイクル本体にソケット作成コードを追加することで問題を解決しましたが、ソケットの概念について少し混乱しています。メッセージを送信すると、ソケットを閉じて再作成し、次のメッセージを同じサーバーに送信する必要があるようです(次の画像を取得するため)。これはソケットの正しい方法ですか '

前もって感謝します。

UPD:これは、ソケットを作成するループを含むコードです。

    // Get links from xml.
    ...
    // Load images in cycle.
    int i=0;
    for (i=0; i<imageLinks.size(); i++)
    {
        // New socket is returned from serverConnect. Why do we need to create new at each iteration?
        string srvAddr = "207.123.60.126";
        int socketImg = serverConnect(srvAddr);
        // Create a message.
        ...
        string message = "GET " + relativePart;
                message += " HTTP/1.1\r\n";
        message += "Host: " + hostPart + "\r\n";
        message += "\r\n";
        // Send a message.
        BufferArray tempImgBuffer = sendMessage(sockImg, message, false);
        fstream pFile;
        string name;
        // Form the name.
        ...
        pFile.open(name.c_str(), ios::app | ios::out | ios::in | ios::binary);
        // Write the file contents.
        ...
        pFile.close();
        // Close the socket.
        close(sockImg);
    }
4

2 に答える 2

6

反対側は接続を閉じています。それがどのように機能するかHTTP/1.0です。あなたはできる:

  • HTTP GET ごとに異なる接続を確立する
  • HTTP/1.0非公式で 使うConnection: Keep-Alive
  • を使用しHTTP/1.1ます。HTTP 1.1特に宣言されていない限り、すべての接続で永続的と見なされます。

必須の xkcd リンクサーバーのアテンション スパン

ウィキ HTTP

HTTP の元のバージョン (HTTP/1.0) は、HTTP/1.1 で改訂されました。HTTP/1.0 は、リクエストとレスポンスのトランザクションごとに同じサーバーへの個別の接続を使用しますが、HTTP/1.1 は接続を複数回再利用できます。

于 2011-05-29T11:38:26.260 に答える
3

元の形式(HTTP 1.0)のHTTPは、実際には「接続ごとに1つの要求」プロトコルです。応答が返ってきたら、反対側が接続を閉じている可能性があります。接続ごとに複数のリクエストをサポートするために、一部の実装に非公式のメカニズムが追加されましたが、それらは標準化されていませんでした。

HTTP1.1はこれを好転させます。デフォルトでは、すべての接続は「永続的」です。

これを使用するには、リクエスト行の最後に「HTTP/1.1」を追加する必要があります。の代わりに、を実行します。また、これを行うときは、必ず「Host:」ヘッダーを指定する必要があります。GET http://someurl/GET http://someurl/ HTTP/1.1

ただし、他の方法で準拠しているHTTPサーバーでさえ、持続的接続をサポートしていない場合があることに注意してください。また、接続は、実際には、ごくわずかな遅延、特定の数の要求、または単にランダムに切断される可能性があることにも注意してください。これに備えて、中断したところから再接続してリクエストの発行を再開する準備ができている必要があります。

HTTP1.1RFCも参照してください。

于 2011-05-29T11:47:17.430 に答える