1

Web ページへの HTTP 要求と応答を実行するために libcurl を使用しています。しかし、応答を取得するときに、完全なサーバー応答が得られません。応答行はある時点で切り捨てられます。例えば

10-25 15:53:22.264: XXX(14847): Security.8021x:true
10-25 15:53:22.264: XXX(14847): Event.AlarmInput:true
10-25 15:53:22.264: XXX(14847): Event.AlarmInput.Notification.HTTP.CGI:true
10-25 15:53:22.264: XXX(14847): Event.AlarmInput.Notification.HTTP.CGI.SingleSession:true
10-25 15:53:22.264: XXX(14847): Event.AlarmInpu   .............

注: これはカスタム android ログです。出力行と混同しないでください

応答にはさらに約 10 行ありますが、現在のログには、「Event.AlarmInpu」の後に出力がないことが示されています。

curl コマンド ライン オプションを指定すると

curl http://www.google.com > output.txt   

ファイル内の完全な出力行を見つけることができます。

curl コマンド ライン ツールを使用して応答を出力ファイルに移動すると、応答データ全体が表示されました。したがって、curl コマンドが応答全体を適切に取得していることに同意できます。応答全体を取得しましたが、応答がバッファー長よりも長いため、切り捨てられています。

完全な応答行を取得するためにバッファの長さを増やす方法を教えてください。
コード スニペットを以下に示します。

typedef struct pageInfo_t {
    char *data;
    int  len;
} pageInfo_t;

static size_t HTTPData(void *buffer, size_t size, size_t nmemb, void *userData)
{
    int len = size * nmemb;
    pageInfo_t *page = (pageInfo_t *)userData;
    page->data = realloc(page->data,page->len + len +1);
    memcpy(&page->data[page->len], buffer, len);
    page->len += len;
    page->data[page->len] = 0;
    return len;
}

//Inteface funciton that will recieve web page fom Java
jstring Java_com_samsung_jnitest_MainActivity_JNIGetWebpage( JNIEnv* env,jobject entryObject,jstring webpageJStr)
{
    pageInfo_t page;
    CURL *curl;
    CURLcode res;
    char *buffer;

    int memorysize = 19189;
    page.data = (char *)malloc(16 * memorysize);
    page.len = 0;

    if (page.data)
        memset(page.data, 32, 16 * memorysize);

    buffer = (char *)malloc(memorysize);

    curl = curl_easy_init();
    if(curl)
    {
        curl_easy_setopt(curl, CURLOPT_URL, webpage);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HTTPData);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &page);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        (*env)->ReleaseStringUTFChars(env, webpageJStr, webpage);
        if(response_code == 200) 
        {
            if (buffer) 
            {
                page.data[page.len] = '\0';
                sprintf(buffer, "%ld:%s \n", response_code, page.data);
                return (*env)->NewStringUTF(env, buffer);
            }
        }
    }
} 

完全な応答行を保持するためにバッファ サイズを増やす方法を教えてください。
コードを複雑にしすぎている場合はお知らせください

4

2 に答える 2

0

bufferサイズがmemorysize(19189バイト)になるように割り当てます。

ただし、 が指すバッファーはpage.data、HTTP 要求によって返されるデータの量に応じて増加します。ただし、 が十分に大きいかどうかpage.dataに関係なく、 が指す null で終了する文字列をコピーします。bufferbuffer

おそらく、関連するすべてのコードを取り除き、次のbufferような方法で関数を終了する必要があります。

jstring retval = (*env)->NewStringUTF(env, page.data);
free(page.data);
return retval;

の場合は、適切にクリーンアップすることを忘れないでくださいresponse_code != 200

その他のコメント:

  • webpageどのように設定または宣言されているかわかりません-GetStringUTFChars()実際のコードで省略された呼び出しがあると思いますか?
  • 私は JNI に詳しくないので、jstring上記の提案の結果を適切に処理していない可能性があります。
  • 興味深いのですが、curl コマンド ライン ツールを使用して HTTP 応答をファイルに配置すると、最終的にファイルのサイズはどれくらいになりますか?
于 2013-11-12T07:20:15.617 に答える