![]() ![]() ![]()
|
BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0 |
SFXUDPSocket クラスは、BREW API の ISocket インターフェースをカプセル化し、ハイレベルな UDP ソケット通信機能を提供します。
UDP ソケット通信の手順
例 790. UDP ソケット通信の手順
// SFXUDPSocket クラスのインスタンス _socket はクラスのメンバ変数として定義する class MyClass { private: SFXUDPSocket _socket; public: Void Start(Void); // コールバック関数 XALLBACK_DECLARE_SFXUDPSOCKET(OnBind) XALLBACK_DECLARE_SFXUDPSOCKET(OnSend) XALLBACK_DECLARE_SFXUDPSOCKET(OnReceive) }; Void MyClass::Start(Void) { SFCError error; // ソケットをオープンする if ((error = _socket.Open()) == SFERR_NO_ERROR) { // ソケットをローカル の IP アドレスとポート番号にバインドする OnBind(SFERR_NO_ERROR); } return; } // バインドの完了が通知されるコールバック関数 XALLBACK_IMPLEMENT_SFXUDPSOCKET(MyClass, OnBind, error) { SFXSocketAddress address(SFXInetAddress::LoopbackInetAddress(), 1024); // エラーが発生したかどうかチェックする if (error == SFERR_NO_ERROR) { error = _socket.Bind(address); switch (error) { case SFERR_NO_ERROR: // データを非同期に書き込む OnSend(SFERR_NO_ERROR); break; case AEE_NET_WOULDBLOCK: // バインドの完了が通知されるコールバック関数を登録する _socket.ScheduleBind(XALLBACK_FUNCTION(OnBind)); break; } } return; } // データ送信の完了が通知されるコールバック関数 XALLBACK_IMPLEMENT_SFXUDPSOCKET(MyClass, OnSend, error) { static ACharConst data[] = "udp!"; SFXSocketAddress address(SFXInetAddress::LoopbackInetAddress(), 1024); UInt32 size; // エラーが発生したかどうかチェックする if (error == SFERR_NO_ERROR) { size = sizeof(data) - 1; // データを非同期的に送信する error = _socket.Send(address, data, &size); switch (error) { case SFERR_NO_ERROR: // 指定したサイズのデータが書き込まれたかチェックする // Send 関数は指定したサイズのデータを一度に書き込めないことがある // その場合、ここでは簡易化のためエラーとしている if (size == sizeof(data) - 1) { // データを非同期に読み込む OnReceive(SFERR_NO_ERROR); } else { TRACE("...send failed..."); } break; case AEE_NET_WOULDBLOCK: // データ送信の完了が通知されるコールバック関数を登録する _socket.ScheduleSend(XALLBACK_FUNCTION(OnSend)); break; } } return; } // データ受信の完了が通知されるコールバック関数 XALLBACK_IMPLEMENT_SFXUDPSOCKET(MyClass, OnReceive, error) { SFXSocketAddress socket; SFXBuffer buffer; UInt32 size; // エラーが発生したかどうかチェックする if (error == SFERR_NO_ERROR) { buffer.SetSize(4); size = static_cast<UInt16>(buffer.GetSize()); // 非同期的にデータを受信する switch (_socket.Receive(&socket, buffer.GetBuffer(), &size)) { case SFERR_NO_ERROR: // 指定したサイズのデータが読み込まれたかチェックする // Receive 関数は指定したサイズのデータを一度に読み込めないことがある // その場合、ここでは簡易化のためエラーとしている if (size == buffer.GetSize()) { // 読み込んだデータを表示する buffer.SetSize(buffer.GetSize() + 1); buffer[buffer.GetSize() - 1] = '\0'; TRACE(":%s", SFXAnsiString(buffer).GetCString()); // ソケットをクローズする _socket.Close(); } else { TRACE("...receive failed..."); } break; case AEE_NET_WOULDBLOCK: // データ受信の完了が通知されるコールバック関数を登録する _socket.ScheduleReceive(XALLBACK_FUNCTION(OnReceive)); break; } } return; }
| コンストラクタ/デストラクタ |
|---|
|
SFXUDPSocket( Void ) SFXUDPSocket クラスのコンストラクタです。
|
|
~SFXUDPSocket( Void ) SFXUDPSocket クラスのデストラクタです。
|
| パブリック関数 | |
|---|---|
| SFCError |
AsSFBAStream(
SFBAStreamSmpPtr result
) 【 現在、この関数は使えません。 】
|
| SFCError |
AsSFBSource(
SFBSourceSmpPtr result
) 【 現在、この関数は使えません。 】
|
| SFCError |
Bind(
SFXSocketAddressConstRef address
) ローカル の IP アドレスとポート番号を UDP ソケットに関連付けます。
|
| Void |
Cancel( Void ) UDP ソケット通信をキャンセルします。
|
| Void |
Close( Void ) UDP ソケットをクローズします。
|
| SFCError |
GetLocalAddress(
SFXSocketAddressPtr result
) ローカルの IP アドレスとポート番号を取得します。
|
| SFBNetMgrSmpConstRef |
GetSFBNetMgr( Void ) 内部で管理するネット マネージャ インターフェースを取得します。
|
| SFBSocketSmpConstRef |
GetSFBSocket( Void ) 内部で管理するソケット インターフェースを取得します。
|
| SFCError |
GetStreamReader(
UInt32 size
, SFXStreamReaderPtr result
) GetStreamReader( SFXStreamReaderPtr result ) 【 現在、この関数は使えません。 】
|
| SFCError |
GetStreamWriter(
UInt32 size
, SFXStreamWriterPtr result
) GetStreamWriter( SFXStreamWriterPtr result ) 【 現在、この関数は使えません。 】
|
| SFCError |
Open(
SInt32 linger = -1
) UDP ソケットをオープンします。
|
| SFCError |
Read(
VoidPtr buffer
, UInt32Ptr size
) 【 現在、この関数は使えません。 】
|
| SFCError |
Receive(
SFXSocketAddressPtr address
, VoidPtr buffer
, UInt32Ptr size
, UInt16 option = 0x0000
) UDP ソケットからデータを受信します。
|
| SFCError |
ScheduleBind(
CallbackSPP spp
, VoidPtr reference
) Bind をスケジュールします。
|
| SFCError |
ScheduleRead(
CallbackSPP spp
, VoidPtr reference
) 【 現在、この関数は使えません。 】
|
| SFCError |
ScheduleReceive(
CallbackSPP spp
, VoidPtr reference
) データ受信をスケジュールします。
|
| SFCError |
ScheduleSend(
CallbackSPP spp
, VoidPtr reference
) データ送信をスケジュールします。
|
| SFCError |
ScheduleWrite(
CallbackSPP spp
, VoidPtr reference
) 【 現在、この関数は使えません。 】
|
| SFCError |
Send(
SFXSocketAddressConstRef address
, VoidConstPtr buffer
, UInt32Ptr size
, UInt16 option = 0x0000
) UDP ソケットにデータを送信します。
|
| SFCError |
Write(
VoidConstPtr buffer
, UInt32Ptr size
) 【 現在、この関数は使えません。 】
|
| 型 |
|---|
|
CallbackSPP コールバック関数のプロトタイプです。
|
[ public, explicit ] SFXUDPSocket(Void);
[ public, virtual ] ~SFXUDPSocket(Void);
[ public, virtual, const ] SFCError AsSFBAStream( SFBAStreamSmpPtr result // 結果の SFBAStream クラスのインスタンスへのポインタ );
SFERR_UNSUPPORTED を返します。
[ public, virtual, const ] SFCError AsSFBSource( SFBSourceSmpPtr result // 結果の SFBSource クラスのインスタンスへのポインタ );
SFERR_UNSUPPORTED を返します。
[ public ] SFCError Bind( SFXSocketAddressConstRef address // ローカル の IP アドレスとポート番号 );
ローカル の IP アドレスは、携帯端末内部でループバック通信するときは SFXInetAddress::LoopbackInetAddress 関数、 外部のサーバーと通信するときは SFXInetAddress::AnyInetAddress 関数をそれぞれ呼び出して取得します。
SFXUDPSocket::Bind 関数で UDP ソケットに関連付けられた IP アドレスは、SFXUDPSocket::Send 関数でデータを送信するときの 送信元の IP アドレスとなります。( SFXUDPSocket::Receive 関数で受信したデータの送信元 IP アドレスとなります。)
SFXUDPSocket::Bind 関数の戻り値が AEE_NET_WOULDBLOCK のときは SFXUDPSocket::ScheduleBind 関数でコールバックを登録し、コールバック関数の中で再度 SFXUDPSocket::Bind 関数を呼び出す必要があります。
SFXUDPSocket::ScheduleBind | SFXInetAddress::LoopbackInetAddress | SFXInetAddress::AnyInetAddress | SFXUDPSocket::Send | SFXUDPSocket::Receive
[ public, virtual ] Void Cancel(Void);
登録されていたコールバックはキャンセルされます。
[ public ] Void Close(Void);
UDP ソケット通信をキャンセルし、内部で使っている ISocket インターフェースや INetMgr インターフェースを解放します。
登録されていたコールバックはキャンセルされます。
BREW アプレットのサスペンド時は、SFXUDPSocket::Close 関数を呼び出してリソースを解放します。
[ public, const ] SFCError GetLocalAddress( SFXSocketAddressPtr result // ローカルの IP アドレスとポート番号の格納先へのポインタ );
![]() |
ローカルの IP アドレスの変化 |
|---|---|
UDP ソケット接続の前後で、ローカルの IP アドレスは変化する可能性があります。 | |
[ public, const ] SFBNetMgrSmpConstRef GetSFBNetMgr(Void);
内部で管理するネット マネージャ インターフェース ( SFBNetMgr クラスのインスタンス ) を取得します。
[ public, const ] SFBSocketSmpConstRef GetSFBSocket(Void);
内部で管理するソケット インターフェース ( SFBSocket クラスのインスタンス ) を取得します。
[ public, virtual ] SFCError GetStreamReader( UInt32 size // バッファサイズ SFXStreamReaderPtr result // データ受信用ストリームへのポインタ );
[ public, virtual ] SFCError GetStreamReader( SFXStreamReaderPtr result // データ受信用ストリームへのポインタ );
SFERR_UNSUPPORTED を返します。
[ public, virtual ] SFCError GetStreamWriter( UInt32 size // サイズ SFXStreamWriterPtr result // データ送信用ストリームへのポインタ );
[ public, virtual ] SFCError GetStreamWriter( SFXStreamWriterPtr result // データ送信用ストリームへのポインタ );
SFERR_UNSUPPORTED を返します。
SFBNetMgr クラスのインスタンスを生成し、UDP ソケット ( SFBSocket クラスのインスタンス ) を開きます。
![]() |
リンガー時間(ネットワーク接続の待機時間) |
|---|---|
BREW 標準の INETMGR_SetLinger() 関数で設定するリンガー時間(ネットワーク接続の待機時間)は、この関数の引数で指定できます。 デフォルト値は -1 ですが、このときはリンガー時間は設定されません。 リンガー時間の設定についての詳細は、BREW リファレンスの INETMGR_SetLinger() 関数をご覧ください。 | |
[ public, virtual ] SFCError Read( VoidPtr buffer // 読み込んだデータを格納するバッファ UInt32Ptr size // バッファのサイズ、読み込んだデータのサイズ );
SFERR_UNSUPPORTED を返します。
[ public ] SFCError Receive( SFXSocketAddressPtr address // 送信元の IP アドレスとポートを格納するポインタ VoidPtr buffer // 受信したデータを格納するバッファ UInt32Ptr size // 受信したデータを格納するバッファのサイズ、読み込んだデータのサイズ UInt16 option = 0x0000 // 0 を設定する ( 未使用 ) );
SFXUDPSocket::Receive 関数の呼び出し前には、受信したデータを格納するバッファのサイズを格納します。SFXUDPSocket::Receive 関数の呼出し後、読み込んだデータのサイズが格納されます。
SFXUDPSocket::Receive 関数はすぐに結果を返します。パケットが到着しない場合は AEE_NET_WOULDBLOCK を返します。
[ public ] SFCError ScheduleBind( CallbackSPP spp // コールバック関数 VoidPtr reference // コールバック関数へ渡すデータ );
SFXUDPSocket::ScheduleBind 関数は、SFXUDPSocket::Bind 関数を使って Bind するコールバック関数を登録するために使います。
※ SFXUDPSocket::Bind 関数の戻り値が AEE_NET_WOULDBLOCK である場合、SFXUDPSocket::ScheduleBind 関数でコールバック関数を登録して、再び Bind を試みます。
[ public, virtual ] SFCError ScheduleRead( CallbackSPP spp // コールバック関数 VoidPtr reference // コールバック関数に渡すデータ );
SFERR_UNSUPPORTED を返します。
[ public ] SFCError ScheduleReceive( CallbackSPP spp // コールバック関数 VoidPtr reference // コールバック関数に渡すデータ );
SFXUDPSocket::ScheduleReceive 関数は、SFXUDPSocket::Receive 関数を使ってデータ受信するコールバック関数を登録するために使います。
※ SFXUDPSocket::Receive 関数の戻り値が AEE_NET_WOULDBLOCK である場合、SFXUDPSocket::ScheduleReceive 関数でコールバック関数を登録して、再びデータ受信を試みます。
[ public ] SFCError ScheduleSend( CallbackSPP spp // コールバック関数 VoidPtr reference // コールバック関数へのポインタ );
SFXUDPSocket::ScheduleSend 関数は、SFXUDPSocket::Send 関数を使ってデータ送信するコールバック関数を登録するために使います。
※ SFXUDPSocket::Send 関数の戻り値が AEE_NET_WOULDBLOCK である場合、SFXUDPSocket::ScheduleSend 関数でコールバック関数を登録して、再びデータ送信を試みます。
[ public, virtual ] SFCError ScheduleWrite( CallbackSPP spp // コールバック関数 VoidPtr reference // コールバック関数へのポインタ );
SFERR_UNSUPPORTED を返します。
[ public ] SFCError Send( SFXSocketAddressConstRef address // 送信先の IP アドレスとポート番号 VoidConstPtr buffer // 送信するデータ UInt32Ptr size // 送信するデータのサイズ、実際に送信したデータのサイズ UInt16 option = 0x0000 // 0 を設定する ( 未使用 ) );
SFXUDPSocket::Send 関数を呼び出す前は、送信するデータのサイズを格納します。SFXUDPSocket::Send 関数を呼び出した後、実際に送信したデータのサイズが格納されます。
SFXUDPSocket::Send 関数はすぐに結果を返します。送信がブロックされた場合は AEE_NET_WOULDBLOCK を返します。
[ public, virtual ] SFCError Write( VoidConstPtr buffer // 書き込むデータ UInt32Ptr size // 書き込むデータのサイズ、書き込んだデータのサイズ );
SFERR_UNSUPPORTED を返します。
typedef Void(* SFXUDPSocket::CallbackSPP)(SFCError error, VoidPtr reference)
SFXUDPSocket クラスで使うコールバック ハンドラです。 UDP ソケット通信の結果はコールバック関数に通知されます。
第 1 引数にエラーコード、第 2 引数に登録したパラメータが渡されます。
|
Copyright (C) 2002 - 2008 Sophia Cradle Incorporated All Rights Reserved. |
![]() ![]() ![]()
|