Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Cocoa勉強会 #33関東

意外に楽に使えるlibcurl
新居雅行
nii@msyk.net

2009年4月8日水曜日

1
Agenda

•
•
•

2009年4月8日水曜日

curlとlibcurlの紹介
libcurlの使い方
プログラムの実例

2
curlとlibcurlとは

•

cURL and libcurl

•
•
•
• curlコマンド
•
•
• libcurl
•

オープンソースの通信ツール
Client for URLs or Client for URL Req...
libcurlについて

•

URLを指定した通信機能を提供

•
•
•
•

•
•

スレッドセーフ、IPv6対応したライブラリ
バージョンを重ねてかなりの高機能に
ドキュメントが充実している

Mac OS Xには標準搭載
APIはC...
プロジェクトでliburlを使う

•
•

プロジェクトにlibcurlへの参照を作る
ヘッダには、以下のように記入するのみでOK

•

2009年4月8日水曜日

#import <curl/curl.h>

5
libcurlの参照

•
•

プロジェクトに新しく
ファイル加える
/usr/libにあるライブラ
リを追加

•
•
2009年4月8日水曜日

libcurl.4.dylib以外は全部
これへのシンボリックリ
ンク
いずれも4つのアーキ...
ライブラリの番号とバージョン

•

libcurl.n.dylibの「n」はライブラリの番号

•
•
•
•
•
•
•
libcurl最新版(Mac OS X 10.5.6)
•
•
•

libcurlでは、apacheのモジュールの番...
プログラムのポイント

•

基本的には何でも以下の手順でOK

(1) 初期化してハンドルを得る
(2) URLを教える
(3) その他のパラメータを設定(オプション設定)
(4) 実行する
(5) 後始末

•

データの受信

•
•

...
char *buffer;

URLへの単純なアクセス

size_t receivedCallback( void *ptr, size_t size, size_t nmemb, void *stream)	
{
	 int endPoin...
HTTPのポスト
void httpPost( const char* url, const char* postStr, char *receivedStr )	 {
	 buffer = receivedStr;
	 buffer[0] =...
SSLを使った通信
URLはhttps://…を指定
void https( const char* url, char *receivedStr )	 {
オプションの指定
	 buffer = receivedStr;
	 buffer[0...
認証が必要なWebサイト

void httpAuth( const char* url, const char* username, const char* password, char *received
	 buffer = receiv...
CURLOPT_VERBOSE

2009年4月8日水曜日

13
まとめとURL

•
•
•
•

簡単に使えるlibcurl
Cでの文字列処理はちょっと面倒
動作の原理を知ればCURLHANDLEも便利
URLs

•
•
•
•

cURL and libcurl
http://curl.haxx.se...
Upcoming SlideShare
Loading in …5
×

Cocoa勉強会#33-意外に楽に使えるlibcurl

4,613 views

Published on

Cocoa勉強会#33
2009/4/11
意外に楽に使えるlibcurl
新居雅行

Published in: Technology
  • ⇒⇒⇒WRITE-MY-PAPER.net ⇐⇐⇐ has really great writers to help you get the grades you need, they are fast and do great research. Support will always contact you if there is any confusion with the requirements of your paper so they can make sure you are getting exactly what you need.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Don't forget another good way of simplifying your writing is using external resources (such as ⇒ www.HelpWriting.net ⇐ ). This will definitely make your life more easier
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • I can advise you this service - ⇒ www.WritePaper.info ⇐ Bought essay here. No problem.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Sex in your area is here: ❶❶❶ http://bit.ly/369VOVb ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Follow the link, new dating source: ♥♥♥ http://bit.ly/369VOVb ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

Cocoa勉強会#33-意外に楽に使えるlibcurl

  1. 1. Cocoa勉強会 #33関東 意外に楽に使えるlibcurl 新居雅行 nii@msyk.net 2009年4月8日水曜日 1
  2. 2. Agenda • • • 2009年4月8日水曜日 curlとlibcurlの紹介 libcurlの使い方 プログラムの実例 2
  3. 3. curlとlibcurlとは • cURL and libcurl • • • • curlコマンド • • • libcurl • オープンソースの通信ツール Client for URLs or Client for URL Request Library MIT/X derivate license URLを与えて通信処理ができる コマンドは「カール」と発音する curlコマンドの機能をC言語のAPIから利用できる 2009年4月8日水曜日 3
  4. 4. libcurlについて • URLを指定した通信機能を提供 • • • • • • スレッドセーフ、IPv6対応したライブラリ バージョンを重ねてかなりの高機能に ドキュメントが充実している Mac OS Xには標準搭載 APIはC言語だが、さまざまな言語で利用できる • • 2009年4月8日水曜日 オープンソース 例えばPHPやJavaなど CocoaクラスのCURLHANDLE(NSURLHandleのサ ブクラス)もあるが、フルスペックではない 4
  5. 5. プロジェクトでliburlを使う • • プロジェクトにlibcurlへの参照を作る ヘッダには、以下のように記入するのみでOK • 2009年4月8日水曜日 #import <curl/curl.h> 5
  6. 6. libcurlの参照 • • プロジェクトに新しく ファイル加える /usr/libにあるライブラ リを追加 • • 2009年4月8日水曜日 libcurl.4.dylib以外は全部 これへのシンボリックリ ンク いずれも4つのアーキテ クチャをサポート 6
  7. 7. ライブラリの番号とバージョン • libcurl.n.dylibの「n」はライブラリの番号 • • • • • • • libcurl最新版(Mac OS X 10.5.6) • • • libcurlでは、apacheのモジュールの番号で管理 SONAMEとして参照されている libcurl.4.soなどをapacheが利用(Linuxなど) SONAME=1/ libcurl Ver.7.4.2(2000/11)より付ける SONAME=2/ libcurl Ver.7.7 - 2001/3/22 SONAME=3/ libcurl Ver.7.12.0 - 2004/6/12 SONAME=4/ libcurl Ver.7.16.0 - 2006/10/30 curl_version()→libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 libphp5.soやphpコマンドがlibcurl.4.dylibをロードしている 2009年4月8日水曜日 7
  8. 8. プログラムのポイント • 基本的には何でも以下の手順でOK (1) 初期化してハンドルを得る (2) URLを教える (3) その他のパラメータを設定(オプション設定) (4) 実行する (5) 後始末 • データの受信 • • 2009年4月8日水曜日 コールバック関数を規定に従って定義 関数をパラメータとして指定 8
  9. 9. char *buffer; URLへの単純なアクセス size_t receivedCallback( void *ptr, size_t size, size_t nmemb, void *stream) { int endPoint = strlen( buffer ); memcpy( buffer + endPoint, ptr, size * nmemb ); buffer[endPoint + size * nmemb + 1]=0; コールバック関数 return size * nmemb; } void simpleHTTP( const char* url, char *receivedStr ) { buffer = receivedStr; URLはhttp://…を指定 buffer[0] = 0; ❶初期化とハンドル取得 CURLcode cc = curl_global_init( CURL_GLOBAL_ALL ); if ( cc == 0 ) { ❷URLを指定する CURL *curlHandle = curl_easy_init(); curl_easy_setopt( curlHandle, CURLOPT_URL, url ); curl_easy_setopt( curlHandle, CURLOPT_WRITEFUNCTION, receivedCallback ); curl_easy_setopt( curlHandle, CURLOPT_VERBOSE, 1 ); ❸オプションの指定 CURLcode success = curl_easy_perform( curlHandle ); デバッグに if ( success != 0 ) { 便利 sprintf( receivedStr, "libcurl error: %d", success ); ❹実行 } curl_easy_cleanup( curlHandle ); } ❺後始末 } 2009年4月8日水曜日 9
  10. 10. HTTPのポスト void httpPost( const char* url, const char* postStr, char *receivedStr ) { buffer = receivedStr; buffer[0] = 0; POST用のデータを作る CURLcode cc = curl_global_init( CURL_GLOBAL_ALL ); が、URLエンコードは if ( cc == 0 ) { libcurlの関数を使う CURL *curlHandle = curl_easy_init(); curl_easy_setopt( curlHandle, CURLOPT_URL, url ); curl_easy_setopt( curlHandle, CURLOPT_WRITEFUNCTION, receivedCallback ); char *urlEncoded = curl_easy_escape( curlHandle , postStr , 0 ); char *param = "postdata"; char *postData = malloc( strlen( urlEncoded ) + strlen( param ) + 2 ); strcpy( postData, param ); strcat( postData, "=" ); strcat( postData, urlEncoded ); curl_easy_setopt(curlHandle, CURLOPT_POSTFIELDS, postData); curl_easy_setopt( curlHandle, CURLOPT_VERBOSE, 1 ); CURLcode success = curl_easy_perform( curlHandle ); if ( success != 0 ) { sprintf( receivedStr, "libcurl error: %d", success ); } free( postData ); curl_free( urlEncoded ); curl_easy_cleanup( curlHandle ); } } 2009年4月8日水曜日 10
  11. 11. SSLを使った通信 URLはhttps://…を指定 void https( const char* url, char *receivedStr ) { オプションの指定 buffer = receivedStr; buffer[0] = 0; 後者は自己署名のサイトで CURLcode cc = curl_global_init( CURL_GLOBAL_ALL ); もエラーにならなくなる if ( cc == 0 ) { CURL *curlHandle = curl_easy_init(); curl_easy_setopt( curlHandle, CURLOPT_URL, url ); curl_easy_setopt( curlHandle, CURLOPT_WRITEFUNCTION, receivedCallback ); // curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYPEER, 0L); // curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt( curlHandle, CURLOPT_VERBOSE, 1 ); CURLcode success = curl_easy_perform( curlHandle ); if ( success != 0 ) { sprintf( receivedStr, "libcurl error: %d", success ); } curl_easy_cleanup( curlHandle ); } } 2009年4月8日水曜日 11
  12. 12. 認証が必要なWebサイト void httpAuth( const char* url, const char* username, const char* password, char *received buffer = receivedStr; buffer[0] = 0; 認証情報はユーザ名とパス CURLcode cc = curl_global_init( CURL_GLOBAL_ALL ); ワードをつなげて指定 if ( cc == 0 ) { CURL *curlHandle = curl_easy_init(); curl_easy_setopt( curlHandle, CURLOPT_URL, url ); curl_easy_setopt( curlHandle, CURLOPT_WRITEFUNCTION, receivedCallback ); char *authInfo = malloc( strlen( username ) + strlen( password ) + 2 ); strcpy( authInfo, username ); strcat( authInfo, ":" ); strcat( authInfo, password ); curl_easy_setopt( curlHandle, CURLOPT_USERPWD, authInfo ); curl_easy_setopt( curlHandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST|CURLAUTH_BASIC); curl_easy_setopt( curlHandle, CURLOPT_VERBOSE, 1 ); CURLcode success = curl_easy_perform( curlHandle ); if ( success != 0 ) { sprintf( receivedStr, "libcurl error: %d", success ); } curl_easy_cleanup( curlHandle ); free( authInfo ); } } 2009年4月8日水曜日 12
  13. 13. CURLOPT_VERBOSE 2009年4月8日水曜日 13
  14. 14. まとめとURL • • • • 簡単に使えるlibcurl Cでの文字列処理はちょっと面倒 動作の原理を知ればCURLHANDLEも便利 URLs • • • • cURL and libcurl http://curl.haxx.se/ CURLHANDLE 2009年4月8日水曜日 http://code.google.com/p/curlhandle/ 14

×