2011-10-21 10 views
9

私は、HTTP POST要求でデータを受け取ったアプリケーションを持っています。私はlibcurlを使用してこのアプリケーションへのリクエストを開き、データを送信し、アプリケーションから返信を返そうとしています。これは、基本的にサーバーに接続libcurl HTTPS POSTデータが送信されますか?

int main(void) 
{ 
    CURL *curl; 
    CURLcode res; 

    curl = curl_easy_init(); 
    if(curl) 
    { 
     const int timeout = 30000; 
     char outputmessage[]="VGhpcyBpcyBqdXN0IGEgbWVzc2FnZSwgaXQncyBub3QgdGhlIHJlYWwgdGhpbmc="; 

     curl_easy_setopt(curl, CURLOPT_URL, "https://somehost.com/someapp"); 
     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); 
     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); 
     curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.5"); 
     curl_easy_setopt(curl, CURLOPT_POSTFIELDS, outputmessage); 
     curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(outputmessage)); 
     curl_easy_setopt(curl, CURLOPT_POST, 1L); 
     curl_easy_setopt(curl, CURLOPT_TIMEOUT, timeout/1000); 

     res = curl_easy_perform(curl); 
     if(CURLE_OK != res) 
     { 
      printf("Error: %s\n", strerror(res)); 
      return 1; 
     } 

     // now what? 

     // cleanup when done 
     curl_easy_cleanup(curl); 
    } 
    return 0; 
} 

、私はcurl_easy_perform()にOKを得る:これは私がこれまで持っているコードです。私はWiresharkでの接続を見ることができます。

つの質問:

1)これはPOSTを介してデータを送信するのが正しい方法であり、
2)どのように私は、アプリケーションからの応答を取得します。

私はcurl_easy_recv()を使用する必要があると思っていましたが、私はどのように見えません。どのサンプルコードも歓迎します。おかげさまで

答えて

4

を返すようにしてください:

cres = curl_easy_setopt(handle, CURLOPT_HEADERFUNCTION, HandleHeader); 
それは、これがあれば、Webサービスを設計していることかもしれ

アプリケーションが使用するために、その応答はヘッダーのみの応答であり、応答データはありません。

あなたが探している主なものは、要求がOKだったと言って 200コードです
HTTP/1.1 200 OK ... 

:ヘッダは、以下のようなデータが含まれています。

ヘッダーまたは応答のいずれかからデータを処理する関数は、void *を取る必要があります。文字列として使用する場合は、NULL終了する必要があります。簡潔にするため削除取り扱い

static size_t CurlHandleResponse(
    void *Ptr, 
    size_t Size, 
    size_t NoElements, 
    void* Data) 
{ 
    memcpy(&(gData[gDataLen]), Ptr, (Size * NoElements)); 
    gDataLen += (Size * NoElements); 
    gData[ gDataLen ] = '\0'; 
    return (Size * NoElements); 
} 

... 
ConvertUnprintable(gData, PrintStr); 
... 

エラー: - 情報については、これは私が入ってくるデータを(レスポンスボディは、単にログファイルになり、この場合、私は自分のアプリケーションにリターンコードを使用して)扱う方法です!

+0

アプリケーションから返されるデータは、200 OKの直後です。私は、要求がOKになったかどうかを確認するためにヘッダーを読む必要がありますが、その後にデータがあります。何か案は?そしてファイルにするのではなくchar * –

+0

情報についてはchar * ptrではなくvoid * ptrでなければなりませんが、レスポンスの処理に使用しているコードで回答を編集します。 – asc99c

+0

ありがとう、ありがとう。今私はすべての情報を解析する必要があります。助けてくれてありがとう –

1

受信機能を呼び出す必要はありません。制御が書き込み完了コールバックに渡されると、受信した応答が返されます。コールバックを次のように設定します。

curl_res = curl_easy_setopt(handle、CURLOPT_WRITEFUNCTION、RecvResponseCallback);

前に実行します。

次のようにコールバックを定義します。

size_t 
RecvResponseCallback (char *ptr, size_t size, size_t nmemb, char *data) { 
    // handle received data 
    return size * nmemb; 
} 

応答データはデータのarg(あなたは時に見たいと思う何か他のものであるない PTRの引数によって指されますあなたはこれを働かせます)。

あなたがRecvResponseCallbackを終了すると、私はあなたにもレスポンスヘッダのハンドラを追加することを検討すべきだと思う(size_t) size * nmemb

+0

すべての引数をRecvResponseCallback()で宣言する必要があります –

+0

これを設定して実行すると、エラーが発生します:システム内に開いているファイルが多すぎます –

+0

実行中のシステムは何ですか?私はlibcurlが受信ソケット用に別のファイルをオープンしなければならないと思います。どのくらいのファイルがあなたのプログラムで開いていますか? –

関連する問題