C言語のcURL(カール)でネットワークプログラミングを教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Verse(UEFN), Assembler (x64,aarch64).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
cURL(カール)とは
cURL(カール)とは,さまざまなプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供するプロジェクトです.
cURLプロジェクトの成果は以下の2つです.
- curl:cURLのコマンドラインツール
- libcurl:cURLのC言語のライブラリ
curl:cURLのコマンドラインツール
curlはcURLのコマンドラインツールです.
Ubuntu 22.04 LTS(Linux)でのインストール方法は以下になります.
1 |
$ sudo apt-get install curl |
curlの使い方は,以下の記事がおすすめです!
curlと一緒に使われることが多いJSONをパースするjqをインストールする方法は以下になります.
1 |
$ sudo apt-get install jq |
jqの使い方は,以下の記事がおすすめです!
libcurl:cURLのC言語のライブラリ
C言語のcURLのライブラリ「libcurl」を紹介します.
libcurlのインストール方法は以下になります.
Ubuntu 22.04 LTSではlibcurl-devは3種類あるので,今回はlibcurl4-openssl-devをインストールします.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ sudo apt-get install curl $ sudo apt-get install libcurl-dev Reading package lists... Done Building dependency tree... Done Reading state information... Done Package libcurl-dev is a virtual package provided by: libcurl4-openssl-dev 7.81.0-1ubuntu1.2 libcurl4-nss-dev 7.81.0-1ubuntu1.2 libcurl4-gnutls-dev 7.81.0-1ubuntu1.2 You should explicitly select one to install. E: Package 'libcurl-dev' has no installation candidate # install libcurl4-openssl-dev $ sudo apt-get install libcurl4-openssl-dev |
libcurlでよく利用するAPI
libcurlでよく利用するAPIを紹介します.
curl_global_init関数
1 |
CURLcode curl_global_init(long flags); |
curl_global_init関数は,libcurlが必要とするプログラム環境をセットアップします.
ライブラリローダの拡張機能のようなものです.
curl_global_init関数は,プログラムがlibcurl の他の関数を呼び出す前に,プログラム内で少なくとも1回呼び出される必要があります.
※ここで,プログラムとは,メモリ空間を共有するすべてのコード(スレッド)のことです.
curl_global_init関数が設定する環境は,プログラムの存続期間中一定で,どのプログラムでも同じです.
なので,複数回呼び出す場合でも1回呼び出した場合と同じ効果があります.
curl_global_init関数は,成功した場合はCURLE_OKを返します.
失敗した場合はCURLE_OK以外を返します.
curl_easy_init関数
1 |
CURL *curl_easy_init(void); |
curl_easy_init関数は,最初に呼び出す関数でなければならず,イージーインターフェースの他の関数への入力として使用しなければならないCURLイージーハンドルを返します.
curl_easy_init関数は,操作が完了したときにcurl_easy_cleanup関数に対応する呼び出しを持たなければなりません.
curl_easy_setopt関数
1 |
CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter); |
curl_easy_setopt関数は,libcurlに動作を指示するために使用されます.
適切なオプションを設定することで,アプリケーションは libcurl の動作を変更することができます.
すべてのオプションは,オプションの後にパラメータを付けて設定します.
このパラメータは,特定のオプションが何を期待するかによって,long,関数ポインタ,オブジェクトポインタ,curl_off_tのいずれかにすることができます.
入力値が不適切だとlibcurlの動作がおかしくなる可能性があります.
各関数呼び出しで設定できるオプションは1つだけです.
典型的なアプリケーションでは,セットアップ段階で多くのcurl_easy_setopt関数を呼び出します.
cury_easy_perform関数
1 |
CURLcode curl_easy_perform(CURL *easy_handle); |
curl_easy_perform関数は,curl_easy_init関数と全てのcurl_easy_setopt関数呼び出しが行われた後にこの関数を呼び出すと,オプションで説明されているようにネットワーク転送を実行します.
cury_easy_perform関数は,curl_easy_init関数呼び出しが返したのと同じeasy_handleを入力として呼び出す必要があります.
curl_easy_cleanup関数
1 |
void curl_easy_cleanup(CURL *handle); |
curl_easy_cleanup関数は,イージーセッションのために呼び出される最後の関数である必要があります.
curl_easy_cleanup関数はcurl_easy_init 関数の逆で,curl_easy_init の呼び出しが返した入力と同じハンドルで呼び出される必要があります.
curl_global_cleanup関数
1 |
void curl_global_cleanup(void); |
curl_global_cleanup関数は,curl_global_init関数によって取得されたリソースを解放します.
libcurlの使用を終了した後,curl_global_init関数を呼び出すたびに,curl_global_cleanup関数を1回呼び出す必要があります.
libcurlでネットワークプログラミングするコード
libcurlでネットワークプログラミングするコードは以下になります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
/* * Author: Hiroyuki Chishiro * License: 2-Clause BSD */ #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <curl/curl.h> int main(int argc, char *argv[]) { CURL *curl; CURLcode ret; if (argc != 2) { fprintf(stderr, "%s [URL]\n", argv[0]); exit(1); } if ((ret = curl_global_init(CURL_GLOBAL_ALL)) != CURLE_OK) { fprintf(stderr, "Error: curl_global_init(): CURLcode = %d\n", ret); exit(2); } if ((curl = curl_easy_init()) == NULL) { fprintf(stderr, "Error: curl_easy_init()\n"); exit(3); } if ((ret = curl_easy_setopt(curl, CURLOPT_URL, argv[1])) != CURLE_OK) { fprintf(stderr, "Error: curl_easy_setopt(): CURLcode = %d\n", ret); exit(4); } if ((ret = curl_easy_setopt(curl, CURLOPT_NOBODY, true)) != CURLE_OK) { fprintf(stderr, "Error: curl_easy_setopt(): CURLcode = %d\n", ret); exit(5); } if ((ret = curl_easy_setopt(curl, CURLOPT_HEADER, true)) != CURLE_OK) { fprintf(stderr, "Error: curl_easy_setopt(): CURLcode = %d\n", ret); exit(6); } if ((ret = curl_easy_perform(curl)) != CURLE_OK) { fprintf(stderr, "Error: curl_easy_perform(): CURLcode = %d\n", ret); exit(7); } curl_easy_cleanup(curl); curl_global_cleanup(); return 0; } |
実行結果は以下になります.
引数に「https://www.google.com/」に指定したところ,以下のヘッダ情報が得られました.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ gcc curl.c -I/usr/include/x86_64-linux-gnu -lcurl $ a.out https://www.google.com/ HTTP/2 200 content-type: text/html; charset=ISO-8859-1 p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info." date: Sat, 11 Jun 2022 13:18:12 GMT server: gws x-xss-protection: 0 x-frame-options: SAMEORIGIN expires: Sat, 11 Jun 2022 13:18:12 GMT cache-control: private set-cookie: 1P_JAR=2022-06-11-13; expires=Mon, 11-Jul-2022 13:18:12 GMT; path=/; domain=.google.com; Secure set-cookie: AEC=AakniGO6ZI-BcD_bUV7-3zimJiEORsi5MzDXjVwYzjhcUd8PvICaJaevHQ; expires=Thu, 08-Dec-2022 13:18:12 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax set-cookie: PREF=ID=61deaf7c5d842019:FF=0:TM=1654953492:LM=1654953492:V=1:S=k-HHq4fcESn7cMNm; expires=Mon, 10-Jun-2024 13:18:12 GMT; path=/; domain=.google.com set-cookie: NID=511=HPKbn-Y0PqXsZUDomTV91yH2VsyLcGEOxGWkmaZznb99X6xuwUQ9j8rhVUucHdDq30hnP5Ht8--OCkYgHlJlbclFjPmtubj1ELxmJ_ZLAn08qKvOGNVw1VX5VYr8moRSTJzeaI60GHOz-Lj4i3upug8IwkyVWC1Lqs1ryp2cmVg; expires=Sun, 11-Dec-2022 13:18:12 GMT; path=/; domain=.google.com; HttpOnly alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43" |
curlのコマンドの実行結果は以下になります.
「set-cookie: PREF=ID=61deaf7c5d842019:FF=0:TM=1654953492:LM=1654953492:V=1:S=k-HHq4fcESn7cMNm; expires=Mon, 10-Jun-2024 13:18:12 GMT; path=/; domain=.google.com」の行がないですが,他は同様です.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ curl https://www.google.com/ -I HTTP/2 200 content-type: text/html; charset=ISO-8859-1 p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info." date: Sat, 11 Jun 2022 13:19:19 GMT server: gws x-xss-protection: 0 x-frame-options: SAMEORIGIN expires: Sat, 11 Jun 2022 13:19:19 GMT cache-control: private set-cookie: 1P_JAR=2022-06-11-13; expires=Mon, 11-Jul-2022 13:19:19 GMT; path=/; domain=.google.com; Secure set-cookie: AEC=AakniGOCtoRyRJQWXMLpatPB3wGjtjBLS4BThX3uFB0u5ntBtZDJ5SxARzU; expires=Thu, 08-Dec-2022 13:19:19 GMT; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax set-cookie: NID=511=umTKyz1mpIouhqR0lNA1YosKEGlRC73DKARnkDkXtnzdmzNgo4ufCzplEu2L2aheJtym7hZlgFQu6v1A1Vk7J1Crda3e1N7dbiCzgoItvcGGqPSSgqQcC4E8TSJ0Qel9zIIg5KCAOVIerZ_MuPEKDLvTmR-UnnW682UcLcgB5Vc; expires=Sun, 11-Dec-2022 13:19:19 GMT; path=/; domain=.google.com; HttpOnly alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43" |
まとめ
C言語のcURLでネットワークプログラミングを紹介しました.
具体的には,libcurlとcurlで実行結果を比較しました.
libcurlと一緒に使われることが多いC/C++言語のおすすめのJSONライブラリを知りたいあなたはこちらからどうぞ.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!