質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

Q&A

0回答

1353閲覧

libcurl: データをPOSTしたい

Ykkykk

総合スコア140

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

0グッド

0クリップ

投稿2020/01/08 08:25

libcurlを使用してデータをPOSTしたいのですが、うまくいっていません。

C

1curl_easy_setopt(curl, CURLOPT_POST, 1L); 2curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data->req_data);

上記のようにすればとりあえず送ること自体はできるのですが、req_dataに1024Bを超える大きさの文字列を入れるとコアダンプになってしまいました。
そのため、READFUNCTIONというオプションを使用してみているのですが、READFUNCTIONだとデータが送信できなくなってしまいました。

C

1curl_easy_setopt(curl, CURLOPT_READFUNCTION, send_request_body); 2curl_easy_setopt(curl, CURLOPT_READDATA, data);

上記のようにコールバック関数とデータの構造体を登録しています。コールバック関数は下記のようになっています。

C

1size_t send_request_body(void *ptr, size_t size, size_t nmemb, void *userdata) 2{ 3 struct *data = userdata; 4 size_t buffer_size = size * nmemb; 5 6 if (data->req_data_len){ 7 size_t copy_this_much = data->req_data_len; 8 if (copy_this_much > buffer_size){ 9 copy_this_much = buffer_size; 10 } 11 memcpy(ptr, data->req_data, copy_this_much); 12 13 data->req_data += copy_this_much; 14 data->req_data_len -= copy_this_much; 15 return copy_this_much; 16 } 17 return 0; 18}

HTTP通信自体は成功しており、200が返ってくるのですが、POSTしたいデータはサーバまで届いておらず空のデータが届いています。
libcurlで大きなデータを送信するにはどのようにすればよいのでしょうか?
ファイルなどではなく文字列を想定しております。
ご教示いただけますと幸いです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/01/08 08:31

data->req_dataのバッファサイズが1024以下でオーバーフローしてるってことはないですか?
Ykkykk

2020/01/08 08:38

一応文字列の長さ分バッファを確保しているので、多分大丈夫だと思います。。 curlの仕様的には1024を超えていてもCURLOPT_POSTFIELDSで送信できるのでしょうか??
amura

2020/01/08 10:06

意図とは異なるかもしれませんが送受信だけをやってみました。これはできた。   curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/cur_post_tst.php"); char *data = "data=..... ...."; //実際1105バイトです curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
Ykkykk

2020/01/09 02:02

検証していただきありがとうございます。 私もコマンドラインからであれば大きなデータでも問題なく送信できることを確認いたしました。 他の処理に問題がありそうですね。。
amura

2020/01/09 02:17 編集

CURLOPT_POSTFIELDSなので内容には"key=data"の形を要求されでいて、key名の長さ制限では? key=が無いと送ませんでした
Ykkykk

2020/01/09 03:01

上記で提示しているコードのdata->req_dataにキーを含めずに'Hello World'とだけ入れた場合、サーバで受信できており、通信自体も200で返ってくるのですが、キーのみが送信されていると解釈されているのでしょうか?
amura

2020/01/09 03:10

CURLOPT_POSTFIELDSでの内容はkey名称とデータ項目が=で分かれていて、keyの名前の長さは1024を制限としてデータ項目のデータキャパは大いのかなと思っております。KEY名称が1024バイト取れるのがすごい、ちなみに先頭に=付けただけだと送れませんでした。
Ykkykk

2020/01/09 03:34

https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html 上記ドキュメントを見ると、Exmapleの箇所でただのcharを送っているように思われるのですが、これも同様にキーとして解釈され1024バイトまでは送ることができるということでしょうか???
amura

2020/01/09 05:11

You must make sure that the data is formatted the way you want the server to receive it. の受け取れる形と言っている部分を調査中 httpdログではステータス200で13バイトを受け取ったと出ています。
amura

2020/01/09 05:34

サーバ側の受取りをCで作成したら問題なく受け取れました。エラーとしているのは受取のプログラムの仕様の様です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問