前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0
SFXUDPSocket
UDP ソケット通信のためのクラスです。
#include <SFXUDPSocket.h.hpp>
class SFXUDPSocket : public SFXStorage;
SFMTYPEDEFCLASS(SFXUDPSocket)

解説

SFXUDPSocket クラスは、BREW API の ISocket インターフェースをカプセル化し、ハイレベルな UDP ソケット通信機能を提供します。

UDP ソケット通信の手順

  1. UDP ソケット ( SFXUDPSocket クラスのインスタンス ) を作成します。
  2. SFXUDPSocket::Open 関数を呼び出して、 UDP ソケットをオープンします。
  3. SFXUDPSocket::Bind 関数を呼び出して、ローカル の IP アドレスとポート番号を UDP ソケットにバインドします。 SFXUDPSocket::Bind 関数の戻り値が AEE_NET_WOULDBLOCK でブロックされたときは、SFXUDPSocket::ScheduleBind 関数でコールバック関数を登録し、コールバック関数の中で再度 SFXUDPSocket::Bind 関数を呼び出す必要があります。
  4. SFXUDPSocket::Send 関数を呼び出して、非同期的にデータを送信します。送信先の IP アドレスとポート番号も SFXUDPSocket::Send 関数で設定します。
  5. SFXUDPSocket::Receive 関数を呼び出して、非同期的にデータを受信します。送信元の IP アドレスとポート番号も SFXUDPSocket::Receive 関数で受信します。
  6. 4. と 5. の送信、受信処理を繰り返します。
  7. 最後に、SFXUDPSocket::Close 関数を呼び出して、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;
}

参照

SFXTCPSocket | SFXSSLSocket | ソケット通信

メンバ

コンストラクタ/デストラクタ
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
コールバック関数のプロトタイプです。

SFXUDPSocket::SFXUDPSocket
SFXUDPSocket クラスのコンストラクタです。
[ public, explicit ]
SFXUDPSocket(Void);

解説

コンストラクタでは SFBNetMgr クラスと SFBSocket クラスのインスタンスは生成されません。


SFXUDPSocket::~SFXUDPSocket
SFXUDPSocket クラスのデストラクタです。
[ public, virtual ]
~SFXUDPSocket(Void);

解説

デストラクタでは SFXUDPSocket::Close 関数が呼び出されます。

登録されていたコールバックはキャンセルされます。

参照

SFXUDPSocket::Close


SFXUDPSocket::AsSFBAStream
【 現在、この関数は使えません。 】
[ public, virtual, const ]
SFCError AsSFBAStream(
    SFBAStreamSmpPtr result   // 結果の SFBAStream クラスのインスタンスへのポインタ
);

解説

SFERR_UNSUPPORTED を返します。

参照

SFBSocket | SFBAStream


SFXUDPSocket::AsSFBSource
【 現在、この関数は使えません。 】
[ public, virtual, const ]
SFCError AsSFBSource(
    SFBSourceSmpPtr result   // 結果の SFBSource クラスのインスタンスへのポインタ
);

解説

SFERR_UNSUPPORTED を返します。

参照

SFBSocket | SFBSource


SFXUDPSocket::Bind
ローカル の IP アドレスとポート番号を UDP ソケットに関連付けます。
[ public ]
SFCError Bind(
    SFXSocketAddressConstRef address   // ローカル の IP アドレスとポート番号
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ソケットが閉じているとき : SFERR_INVALID_STATE
  • メモリ不足のとき : SFERR_NO_MEMORY
  • 操作がブロックされたとき : AEE_NET_WOULDBLOCK
  • その他ネットワーク エラーのとき : SFBSocket::GetLastError 関数で得られるエラー値

解説

ローカル の 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


SFXUDPSocket::Cancel
UDP ソケット通信をキャンセルします。
[ public, virtual ]
Void Cancel(Void);

解説

登録されていたコールバックはキャンセルされます。


SFXUDPSocket::Close
UDP ソケットをクローズします。
[ public ]
Void Close(Void);

解説

UDP ソケット通信をキャンセルし、内部で使っている ISocket インターフェースや INetMgr インターフェースを解放します。

登録されていたコールバックはキャンセルされます。

BREW アプレットのサスペンド時は、SFXUDPSocket::Close 関数を呼び出してリソースを解放します。


SFXUDPSocket::GetLocalAddress
ローカルの IP アドレスとポート番号を取得します。
[ public, const ]
SFCError GetLocalAddress(
    SFXSocketAddressPtr result   // ローカルの IP アドレスとポート番号の格納先へのポインタ
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ソケットが開かれていない、またはバインドされていないとき : SFERR_INVALID_STATE
  • 引数が null のとき : SFERR_INVALID_PARAM
  • その他ネットワークエラーのとき : SFBSocket::GetLastError 関数で得られるエラー値

解説

[Note] ローカルの IP アドレスの変化

UDP ソケット接続の前後で、ローカルの IP アドレスは変化する可能性があります。

参照

SFXInetAddress::LocalInetAddress


SFXUDPSocket::GetSFBNetMgr
内部で管理するネット マネージャ インターフェースを取得します。
[ public, const ]
SFBNetMgrSmpConstRef GetSFBNetMgr(Void);

解説

内部で管理するネット マネージャ インターフェース ( SFBNetMgr クラスのインスタンス ) を取得します。

参照

SFBNetMgr


SFXUDPSocket::GetSFBSocket
内部で管理するソケット インターフェースを取得します。
[ public, const ]
SFBSocketSmpConstRef GetSFBSocket(Void);

解説

内部で管理するソケット インターフェース ( SFBSocket クラスのインスタンス ) を取得します。

参照

SFBSocket


SFXUDPSocket::GetStreamReader
【 現在、この関数は使えません。 】
[ public, virtual ]
SFCError GetStreamReader(
    UInt32 size                 // バッファサイズ
    SFXStreamReaderPtr result   // データ受信用ストリームへのポインタ
);
[ public, virtual ]
SFCError GetStreamReader(
    SFXStreamReaderPtr result   // データ受信用ストリームへのポインタ
);

解説

SFERR_UNSUPPORTED を返します。


SFXUDPSocket::GetStreamWriter
【 現在、この関数は使えません。 】
[ public, virtual ]
SFCError GetStreamWriter(
    UInt32 size                 // サイズ
    SFXStreamWriterPtr result   // データ送信用ストリームへのポインタ
);
[ public, virtual ]
SFCError GetStreamWriter(
    SFXStreamWriterPtr result   // データ送信用ストリームへのポインタ
);

解説

SFERR_UNSUPPORTED を返します。


SFXUDPSocket::Open
UDP ソケットをオープンします。
[ public ]
SFCError Open(
    SInt32 linger = -1   // リンガー時間( -1 のときは設定しない )
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ソケットが既にオープンしているとき : SFERR_INVALID_STATE
  • SFBNetMgr クラスのインスタンスの生成に失敗したとき : SFERR_FAILED
  • 失敗したとき : AEE_NET_ERROR

解説

SFBNetMgr クラスのインスタンスを生成し、UDP ソケット ( SFBSocket クラスのインスタンス ) を開きます。

[Note] リンガー時間(ネットワーク接続の待機時間)

BREW 標準の INETMGR_SetLinger() 関数で設定するリンガー時間(ネットワーク接続の待機時間)は、この関数の引数で指定できます。 デフォルト値は -1 ですが、このときはリンガー時間は設定されません。 リンガー時間の設定についての詳細は、BREW リファレンスの INETMGR_SetLinger() 関数をご覧ください。

参照

SFBNetMgr | SFBSocket | BREW API INETMGR_SetLinger


SFXUDPSocket::Read
【 現在、この関数は使えません。 】
[ public, virtual ]
SFCError Read(
    VoidPtr buffer   // 読み込んだデータを格納するバッファ
    UInt32Ptr size   // バッファのサイズ、読み込んだデータのサイズ
);

解説

SFERR_UNSUPPORTED を返します。


SFXUDPSocket::Receive
UDP ソケットからデータを受信します。
[ public ]
SFCError Receive(
    SFXSocketAddressPtr address   // 送信元の IP アドレスとポートを格納するポインタ
    VoidPtr buffer                // 受信したデータを格納するバッファ
    UInt32Ptr size                // 受信したデータを格納するバッファのサイズ、読み込んだデータのサイズ
    UInt16 option = 0x0000        // 0 を設定する ( 未使用 )
);

引数

size

SFXUDPSocket::Receive 関数の呼び出し前には、受信したデータを格納するバッファのサイズを格納します。SFXUDPSocket::Receive 関数の呼出し後、読み込んだデータのサイズが格納されます。

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • 接続が確立されていないとき : SFERR_INVALID_STATE
  • サイズが null のとき : SFERR_INVALID_PARAM
  • 再試行が必要なとき : AEE_NET_WOULDBLOCK
  • データが受信できないとき : AEE_NET_ERROR

解説

SFXUDPSocket::Receive 関数はすぐに結果を返します。パケットが到着しない場合は AEE_NET_WOULDBLOCK を返します。

参照

SFXUDPSocket::ScheduleReceive


SFXUDPSocket::ScheduleBind
Bind をスケジュールします。
[ public ]
SFCError ScheduleBind(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバック関数へ渡すデータ
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ソケットが閉じているとき、またはコールバックが既に登録されているとき : SFERR_INVALID_STATE

解説

SFXUDPSocket::ScheduleBind 関数は、SFXUDPSocket::Bind 関数を使って Bind するコールバック関数を登録するために使います。

SFXUDPSocket::Bind 関数の戻り値が AEE_NET_WOULDBLOCK である場合、SFXUDPSocket::ScheduleBind 関数でコールバック関数を登録して、再び Bind を試みます。

参照

SFXUDPSocket::Bind


SFXUDPSocket::ScheduleRead
【 現在、この関数は使えません。 】
[ public, virtual ]
SFCError ScheduleRead(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバック関数に渡すデータ
);

解説

SFERR_UNSUPPORTED を返します。


SFXUDPSocket::ScheduleReceive
データ受信をスケジュールします。
[ public ]
SFCError ScheduleReceive(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバック関数に渡すデータ
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ソケットが閉じているとき、またはコールバックが既に登録されているとき : SFERR_INVALID_STATE

解説

SFXUDPSocket::ScheduleReceive 関数は、SFXUDPSocket::Receive 関数を使ってデータ受信するコールバック関数を登録するために使います。

SFXUDPSocket::Receive 関数の戻り値が AEE_NET_WOULDBLOCK である場合、SFXUDPSocket::ScheduleReceive 関数でコールバック関数を登録して、再びデータ受信を試みます。

参照

SFXUDPSocket::Receive


SFXUDPSocket::ScheduleSend
データ送信をスケジュールします。
[ public ]
SFCError ScheduleSend(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバック関数へのポインタ
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ソケットが閉じているとき、またはコールバックが既に登録されているとき : SFERR_INVALID_STATE

解説

SFXUDPSocket::ScheduleSend 関数は、SFXUDPSocket::Send 関数を使ってデータ送信するコールバック関数を登録するために使います。

SFXUDPSocket::Send 関数の戻り値が AEE_NET_WOULDBLOCK である場合、SFXUDPSocket::ScheduleSend 関数でコールバック関数を登録して、再びデータ送信を試みます。

参照

SFXUDPSocket::Send


SFXUDPSocket::ScheduleWrite
【 現在、この関数は使えません。 】
[ public, virtual ]
SFCError ScheduleWrite(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバック関数へのポインタ
);

解説

SFERR_UNSUPPORTED を返します。


SFXUDPSocket::Send
UDP ソケットにデータを送信します。
[ public ]
SFCError Send(
    SFXSocketAddressConstRef address   // 送信先の IP アドレスとポート番号
    VoidConstPtr buffer                // 送信するデータ
    UInt32Ptr size                     // 送信するデータのサイズ、実際に送信したデータのサイズ
    UInt16 option = 0x0000             // 0 を設定する ( 未使用 )
);

引数

size

SFXUDPSocket::Send 関数を呼び出す前は、送信するデータのサイズを格納します。SFXUDPSocket::Send 関数を呼び出した後、実際に送信したデータのサイズが格納されます。

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • サイズが null のとき: SFERR_INVALID_PARAM
  • 再試行が必要なとき: AEE_NET_WOULDBLOCK
  • 送信できないとき: AEE_NET_ERROR

解説

SFXUDPSocket::Send 関数はすぐに結果を返します。送信がブロックされた場合は AEE_NET_WOULDBLOCK を返します。

参照

SFXUDPSocket::ScheduleSend


SFXUDPSocket::Write
【 現在、この関数は使えません。 】
[ public, virtual ]
SFCError Write(
    VoidConstPtr buffer   // 書き込むデータ
    UInt32Ptr size        // 書き込むデータのサイズ、書き込んだデータのサイズ
);

解説

SFERR_UNSUPPORTED を返します。


SFXUDPSocket::CallbackSPP
コールバック関数のプロトタイプです。
typedef Void(* SFXUDPSocket::CallbackSPP)(SFCError error, VoidPtr reference)

解説

SFXUDPSocket クラスで使うコールバック ハンドラです。 UDP ソケット通信の結果はコールバック関数に通知されます。

第 1 引数にエラーコード、第 2 引数に登録したパラメータが渡されます。