2006年02月20日

ソケットの作成と接続

ソケットの作成と接続

 サーバ名からIPアドレスを解決した後は、そのIPアドレスに対してソケットの接続を確立します。

// ソケットの作成
TInetAddr addr ;
RSocket socket ;
addr.SetPort(80);
TInt32 addNum = TInetAddr::Cast(nameRecord.iAddr).Address() ;
addr.SetAddress( addNum );

User::LeaveIfError(socket.Open(socketServ, KAfInet, KSockStream,
KProtocolInetTcp));
socket.Connect( addr, status );
User::WaitForRequest( status );

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

 TInetAddrクラスは、アドレスとポート番号をカプセル化したクラスです。このクラスのインスタンスに対して、DNSで獲得したIPアドレスと、今回用いるポート番号(80)を指定します。

 その後、TInetAddrで表されるIPアドレスとポート番号に対してRSocket::Open、RSocket::Connect関数でソケットの確立を行います。Connect関数も非同期になっておりますので、呼び出しの直後にUser::WaitForRequest関数を呼び出し、この非同期関数の実行終了を待ちます。

 Open関数での第一引数はソケットサーバのインスタンスです。第二引数以降はおそらく説明は必要ないかと思います。

HTTPのHEADメソッドの発行

 今回はHTTP/1.0のHEADメソッドを発行し、その結果を受けます。HTTPはテキストベースのプロトコルですから、単純に文字列をサーバに渡すだけです。

_LIT8(KHead, "HEAD / HTTP/1.0\n\n");
socket.Write(KHead, status);
User::WaitForRequest( status );

if( status != KErrNone ){
User::Leave(10);
}
TBuf8<256> result ;
socket.Read( result, status );
User::WaitForRequest( status );
if( status != KErrNone ){
User::Leave(KErrCouldNotConnect);
}
TBuf<256> result16 ;
result16.Copy( result) ;

 ここで注意が必要な点として、ディスクリプタの幅の問題があります。Series60ではUnicodeを用いていますが、HTTPの通信はAscii コードなどになります。したがって、通信を受けた部分では8bitのディスクリプタで受け、それを表示する段階で16bitのディスクリプタにコピーをしたものを利用しています。

最後にサンプルについて

 今回のサンプルは「コードをひとつの関数にまとめる」意味から、アクティブオブジェクトを使用しておりません。本来であれば、非同期の処理としてアクティブオブジェクトを利用する場所でも、処理の終了を同期的に待っております(User::WaitForRequest関数を使用している箇所です)。
posted by シンビアン at 11:18| Comment(0) | TrackBack(0) | Series60プログラミングテクニック | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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

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