2006年02月20日

今回のサンプル

今回のサンプル「DumbBrowser」は、HTTPサーバのルートコンテキスト(「http://サーバー名/」の形式のアドレス)にHTTP/1.0のHEADメソッドを用いて通信を試みます。そのためには、以下の流れになります。

1. DNSを用いてIPアドレスを解決
2. 1で取得したIPアドレスを持つサーバに対して書き込み(“HEAD / HTTP/1.0\n\n”)
3. 2に対するサーバからのレスポンスを取得

 今回のサンプルは、こちらからダウンロード可能です(DumbBrowser.zip)。

サンプルの実行

 サンプルをダウンロードして、これまでと同様にビルドしますと、エミュレータのメニューに次のようなアイコンが追加されます(画面2)。

■ 画面2

 このアプリケーションを実行し、[オプション]→[サーバにHTTP/HEADで..]とメニューを選択しますと、次のようなダイアログが現れます(画面3)。

■ 画面3

 ここにサーバ名を入れます(プロトコル名「http://」は入れないで下さい)。例えば、「www.hicorp.co.jp」と入力すると、次のような実行結果になります。なお、実行には多少の時間がかかることがあります(画面4)。

■ 画面4

RSocketServについて

 コードの説明に入る前に、RSocketServクラスについて解説をしておきたいと思います。このクラスはプラットフォームがもつネットワーク機能へアクセスする際のハンドルになります。

 プラットフォーム側では、ネットワーク機能はSocket Serverで実現されており、このSocket Serverに対して依頼を発行するときの窓口になります。したがって以下のサンプルでも、このクラスのインスタンスは、ネットワークの接続が必要な箇所で引数で渡される使われ方をします。

DNSを用いた名前解決

 DNSを用いて名前解決を行うコードは次の通りです。

// void CDumbBrowserContainer::LoadHTMLData関数より抜粋
RSocketServ socketServ ;
RHostResolver hostResolver ;

this->iHostNameLabel->SetTextL( url );

User::LeaveIfError( socketServ.Connect() );
User::LeaveIfError( hostResolver.Open(socketServ,
KAfInet, KProtocolInetUdp) );

TNameEntry nameEntry ;
TRequestStatus status ;

// DNSによる名前解決
hostResolver.GetByName( url, nameEntry , status );
User::WaitForRequest( status );

if( status != KErrNone ){
User::Leave(KErrCouldNotConnect);
}

// 取得したIPアドレスの確認
TNameRecord nameRecord = nameEntry();

TInetAddr addr ;
TBuf<15> ipAddr;
TInetAddr::Cast(nameRecord.iAddr).Output(ipAddr);
this->iIpLabel->SetTextL( ipAddr );

 名前解決は、RHostResolverクラスが行います。RHostResolverのメンバ関数であるOpen関数の第一引数に渡すのは、ソケットサーバーであるRsocketServクラスのインスタンスになります。このクラスは名前が示す通り、IPプロトコルのエンドポイントを表すクラスになります。

 また、KafInetは使用されるIPのプロトコルがIPv4であること、KProtocolInetUdpはIPレイヤの上位のプロトコルがUDPであることを表しています。おそらく、このあたりのセッションの確立方法はUnixなどのほかのOSでネットワークプログラムを作成した経験があれば、さほど難しくないと思います。

 最後に、RSocketServ、RHostResolverクラスはやはりRクラスになっていますので、作成にはConnect関数やOpen関数など、また終了処理にはCloseなどの関数を呼び指します。LoadHTMLData関数の一番下にこの終了処理がまとめて記述されています。

 実際の名前解決は、以下のコードで行われます。

// DNSによる名前解決
hostResolver.GetByName( url, nameEntry , status );
User::WaitForRequest( status );

 GetByName関数は、非同期の処理になります。したがって、本来はアクティブオブジェクトを用いて処理を行うのが本筋になりますが、ここではコードのわかり易さを優先して、非同期の関数であるGetByNameの実行終了をUser::WaitForRequest関数で待ちます。第二引数に名前解決の結果が格納されます。最後にDNSに問い合わせた結果を画面に表示します。
posted by シンビアン at 11:11| Comment(0) | TrackBack(0) | Series60プログラミングテクニック | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/13501902

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。