前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3
SFXTCPSocket
TCP ソケット通信のためのクラスです。
#include <SFXTCPSocket.h.hpp>
class SFXTCPSocket : public SFXStorage;
SFMTYPEDEFCLASS(SFXTCPSocket)

継承図

SFXTCPSocket クラスの継承図

協調図

SFXTCPSocket クラスの協調図

解説

SFXTCPSocket クラスは、 TCP クライアントと TCP サーバーを実装する機能を提供します。

このクラスでは、ストリームを利用したデータ送受信が可能です。

ストリームを利用しない場合は SFXTCPSocket::Write / SFXTCPSocket::Read 関数を使用してデータを送受信します。

[Note] 注意

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

TCP クライアントの実装

TCP クライアントは、 SFXTCPSocket クラスを使用して以下の手順で実装します。

  1. TCP ソケット(SFXTCPSocket インスタンス)を作成します。
  2. SFXTCPSocket::Open 関数を呼び出して、 TCP ソケットを開きます。
  3. 必要に応じて SFXTCPSocket::Bind 関数を呼び出して、ローカル の IP アドレスとポート番号を TCP ソケットにバインドします。 バインド処理を省略した場合は、デフォルトのポート番号がバインドされます。
  4. SFXTCPSocket::Connect 関数を呼び出して、サーバーへ接続リクエストを送信します。
  5. サーバーへの接続リクエストの結果は、SFXTCPSocket::Connect 関数で登録したコールバック関数に通知されます。
  6. SFXTCPSocket::GetStreamReader 関数を呼び出して入力ストリームを取得し、データを受信します (ストリームを利用しない場合は、SFXTCPSocket::Read 関数を使用してデータを受信します)。
  7. SFXTCPSocket::GetStreamWriter 関数を呼び出して出力ストリームを取得し、データを送信します (ストリームを利用しない場合は、SFXTCPSocket::Write 関数を使用してデータを送信します)。
  8. 6. と 7. のデータ送受信処理を繰り返します。
  9. SFXTCPSocket::Close 関数を呼び出して、TCP ソケットを閉じます。

例 855. NTP サーバーからの時刻取得

// コールバック関数で使用するので、_socket はクラスのメンバ変数として定義する
class NetworkTime {
private:
    SFXTCPSocket _socket;
    SFXBinaryStreamReader _reader;
    SFXTimer _timer;

public:
    Void Start(Void); // NTP サーバーとの接続を開始する
    Void Stop(Void);  // NTP サーバーとの接続を終了する
    
    // コールバック関数の宣言
    XALLBACK_DECLARE_SFXTCPSOCKET(OnConnect)
    XALLBACK_DECLARE_SFXBINARYSTREAMREADER(OnFetch)
    XALLBACK_DECLARE_SFXTIMER(OnTimer)
};

#define     NTP_SERVER              ("www.example.com:37")
#define     TIMER_INTERVAL          (5000)

// NTP サーバーへの接続を開始する(アプリ開始時またはレジューム時に呼び出す)
Void NetworkTime::Start(Void)
{
    SFCError error(SFERR_NO_ERROR);
    // NTP サーバーのドメイン名とポート番号を設定する
    SFXSocketAddress address(NTP_SERVER);

    // タイマーコールバック関数を設定する
    _timer.Set(XALLBACK_INTERNAL(OnTimer));

    // ソケットを開く
    if ((error = _socket.Open()) == SFERR_NO_ERROR) {

        // NTP サーバーに接続する
        // ※1. 接続要求の結果は、OnConnect 関数に通知される
        // ※2. ドメイン名の解決は自動的に行われる
        if ((error = _socket.Connect(address, XALLBACK_INTERNAL(OnConnect))) == SFERR_NO_ERROR) {
            
            TRACE(">> connecting...");
        }
        else {

            // エラーが発生したとき
            // ソケットを閉じる
            _socket.Close();
        }
    }
	
    if (error != SFERR_NO_ERROR) { 

        // エラーが発生したとき
        ...

        // タイマーをセットする。TIMER_INTERVAL ミリ秒後に OnTimer 関数が呼び出される
        _timer.Schedule(TIMER_INTERVAL);
    }
    return;
}

// NTP サーバーへの接続を終了する(アプリ終了時またはサスペンド時に呼び出す)
Void NetworkTime::Stop(Void)
{
    // 終了処理
    // ストリームを解放する
    _reader.Release();
    // ソケットを閉じる
    _socket.Close();
    return;
}

// 接続要求の結果が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXTCPSOCKET(NetworkTime, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {

        // データ受信用ストリームを取得する
        if ((error = _socket.GetStreamReader(64, &_reader)) == SFERR_NO_ERROR) {

            // フェッチを行う: 実際にソケットからストリームバッファに 4 バイトのデータを受信する
            // ※ データ受信(フェッチ)の結果は、OnFetch 関数に通知される
            if ((error = _reader.Fetch(4, XALLBACK_INTERNAL(OnFetch))) == SFERR_NO_ERROR) {

                TRACE(">> fetching...");
            }
            if (error != SFERR_NO_ERROR) { 

                 // エラーが発生したとき
                 // ストリームを解放する
                 _reader.Release();
            }
        }
    }
	
    if (error != SFERR_NO_ERROR) {  

        // エラーが発生したとき
        // ソケットを閉じる
        _socket.Close();
    }
    return;
}

// データ受信(フェッチ)の結果が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXBINARYSTREAMREADER(NetworkTime, OnFetch, error)
{
    SFXDate date; // 日付クラス
    UInt32 time;

    if (error == SFERR_NO_ERROR) {

        // ビッグエンディアンとしてデータを読み込む
        _reader.SetEndian(SFXBinaryStreamReader::ENDIAN_BIG);
        
        // ストリームバッファから time 変数に UInt32 型データを読み込む
        if ((error = _reader.ReadUInt32(&time)) == SFERR_NO_ERROR) {
            
            // time の値を SFXDate インスタンスに設定する
            date.Set(time);
            
            // 受信したデータは 1900 年 1 月 1 日 からの時刻なので調整する
            date -= SFXDateDuration::Offset19000101();
            
            // 時刻をローカル時刻に変換する
            date += SFXDateDuration::LocalTimeOffset();

            // 時刻を書式に合わせて出力する
            TRACE("%s", date.Format("YYYY/MM/DD hh:mm:ss").GetCString());
        }
    }
	
    if (error != SFERR_NO_ERROR) {

        // エラーが発生したとき
        ...
    }

    // 終了処理
    // ストリームを解放する
    _reader.Release();
    // ソケットを閉じる
    _socket.Close();
    return;
}


// タイマーコールバック関数
XALLBACK_IMPLEMENT_SFXTIMER(NetworkTime, OnTimer)
{
    Start();
    return;
}
[Note] 注意

サスペンドとレジュームに対応した networktime アプリのサンプルコードが、 SophiaFramework UNIVERSE パッケージの Example/networktime フォルダにあります。

TCP サーバーの実装

TCP サーバーは、 SFXTCPSocket クラスを使用して以下の手順で実装します。

  1. TCP ソケット(SFXTCPSocket インスタンス)を作成します。
  2. SFXTCPSocket::Open 関数を呼び出して、 TCP ソケットを開きます。
  3. SFXTCPSocket::Bind 関数を呼び出して、ローカル IP アドレスとポート番号を関連付けます。
  4. SFXTCPSocket::Listen 関数を呼び出して、クライアントからの接続リクエストの受付を開始します。
  5. SFXTCPSocket::Accept 関数を呼び出して、接続リクエストを 1 つ選択し、接続を確立します。 このとき、以降のデータ送受信のためのソケットがこの関数の引数に返されます。
  6. SFXTCPSocket::GetStreamReader 関数を呼び出して入力ストリームを取得し、データを受信します (ストリームを利用しない場合は、SFXTCPSocket::Read 関数を使用してデータを受信します)。
  7. SFXTCPSocket::GetStreamWriter 関数を呼び出して出力ストリームを取得し、データを送信します (ストリームを利用しない場合は、SFXTCPSocket::Write 関数を使用してデータを送信します)。
  8. 6. と 7. のデータ送受信処理を繰り返します。
  9. SFXTCPSocket::Close 関数を呼び出して、TCP ソケットを閉じます。

参照

SFXUDPSocket | SFXSSLSocket | SFXSocketAddress | TCP ソケット通信 | BREW API ISocket

メンバ

コンストラクタ/デストラクタ
SFXTCPSocket( Void )
SFXTCPSocket クラスのコンストラクタです。
~SFXTCPSocket( Void )
SFXTCPSocket クラスのデストラクタです。
パブリック関数
SFCError Accept( SFXTCPSocketPtr result )
Accept(待機中の接続リクエストを 1 つ取り出し、クライアントとの接続を確立する操作)を行います。
SFCError AsSFBAStream( SFBAStreamSmpPtr result )
SFBAStream インスタンスに変換します。
SFCError AsSFBSource( SFBSourceSmpPtr result )
SFBSource インスタンスに変換します。
SFCError Bind( SFXSocketAddressConstRef address )
Bind (ソケットに端末のローカル IP アドレスとポート番号を関連付ける操作)を行います。
Void Cancel( Void )
ソケット通信における各種操作をキャンセルします。
Void Close( Void )
ソケットを閉じます。
SFCError Connect( SFXSocketAddressConstRef address , CallbackSPP spp , VoidPtr reference )
サーバーに接続リクエストを送信して、接続を確立します。
SFCError GetLocalAddress( SFXSocketAddressPtr result )
ローカル IP アドレスとポート番号を取得します。
SFCError GetRemoteAddress( SFXSocketAddressPtr result )
リモート IP アドレスとポート番号を取得します。
SFBNetMgrSmpConstRef GetSFBNetMgr( Void )
内部で管理する SFBNetMgr インスタンスを取得します。
SFBSocketSmpConstRef GetSFBSocket( Void )
内部で管理する SFBSocket インスタンスを取得します。
SFCError GetStreamReader( UInt32 size , SFXStreamReaderPtr result )
データ受信用ストリームを取得します。
SFCError GetStreamReader( SFXStreamReaderPtr result )
データ受信用ストリームを取得します。
SFCError GetStreamWriter( UInt32 size , SFXStreamWriterPtr result )
データ送信用ストリームを取得します。
SFCError GetStreamWriter( SFXStreamWriterPtr result )
データ送信用ストリームを取得します。
SFCError Listen( SInt16 backlog = 1 )
Listen (サーバー側で接続リクエストの待ち受けを開始する操作)を行います。
SFCError Open( SInt32 linger = -1 )
ソケットを開きます。
SFCError Read( VoidPtr buffer , UInt32Ptr size )
Read(ストリームを使用しないソケットからのデータ受信)を行います。
SFCError ScheduleAccept( CallbackSPP spp , VoidPtr reference )
Accept(待機中の接続リクエストを 1 つ取り出し、クライアントとの接続を確立する操作)をスケジュールします。
SFCError ScheduleBind( CallbackSPP spp , VoidPtr reference )
Bind(ソケットに端末のローカル IP アドレスとポート番号を関連付ける操作)をスケジュールします。
SFCError ScheduleListen( CallbackSPP spp , VoidPtr reference )
Listen(サーバー側で接続リクエストの待ち受けを開始する操作)をスケジュールします。
SFCError ScheduleRead( CallbackSPP spp , VoidPtr reference )
Read(ストリームを使用しないソケットからのデータ受信)をスケジュールします。
SFCError ScheduleWrite( CallbackSPP spp , VoidPtr reference )
Write(ストリームを使用しないソケットへのデータ送信)をスケジュールします。
SFCError Write( VoidConstPtr buffer , UInt32Ptr size )
Write(ストリームを使用しないソケットへのデータ送信)を行います。
CallbackSPP (SFXStorage から継承)
ストレージクラスで使用するコールバック関数の型です。

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

解説

このコンストラクタは、何も行いません。


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

解説

このデストラクタは、 SFXTCPSocket::Close 関数を呼び出します。

[Note] 注意

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

参照

SFXTCPSocket::Close


SFXTCPSocket::Accept
Accept(待機中の接続リクエストを 1 つ取り出し、クライアントとの接続を確立する操作)を行います。
[ public, const ]
SFCError Accept(
    SFXTCPSocketPtr result   // 接続確立後、クライアントと通信を行うためのソケットへのポインタ
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ソケットが Listen 中でないとき: SFERR_INVALID_STATE
  • result 引数が null のとき: SFERR_INVALID_PARAM
  • 操作がブロックされたとき: AEE_NET_WOULDBLOCK
  • その他: BREW API の ISOCKET_GetLastError 関数が返すエラー値、またはAEE_NET_ERROR

解説

この関数は、Accept(待機中の接続リクエストを 1 つ取り出し、クライアントとの接続を確立する操作)を行います。

この関数は、 Listen 中であるこのソケットのバックログのキューから最初の接続リクエストを取り出し、 接続を確立し、接続状態にある新しいソケットを作成し、result 引数に返します。 クライアントとの通信は、このソケットを使用して行います。

この関数の戻り値が AEE_NET_WOULDBLOCK の場合、 SFXTCPSocket::ScheduleAccept 関数でコールバック関数を登録し、 コールバック関数の中で再度この関数を呼び出す必要があります。

[Note] 注意

この関数は、 内部で SFBSocket::Accept 関数を呼び出します。

[Note] 前提条件

この関数を呼び出す前に、 このソケットは SFXTCPSocket::Listen 関数を呼び出して Listen 中である必要があります 。

参照

SFXTCPSocket::ScheduleAccept | SFXTCPSocket::Listen | SFXTCPSocket::Bind | SFBSocket::Accept | BREW API ISOCKET_Accept | BREW API ISOCKET_GetLastError


SFXTCPSocket::AsSFBAStream
SFBAStream インスタンスに変換します。
[ public, virtual, const ]
SFCError AsSFBAStream(
    SFBAStreamSmpPtr result   // SFBAStream インスタンスへのポインタ
);

引数

result

SFBAStream インスタンスへのポインタを指定します。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • このストレージが閉じているとき: SFERR_INVALID_STATE
  • result 引数が null のとき: SFERR_INVALID_PARAM

解説

この関数は、 このストレージが内部で管理する SFBSocket インスタンスを SFBAStream インスタンスに変換します。

result 引数には、変換結果である SFBAStream インスタンスへのポインタが返ります。

[Note] 注意

この関数により、 このストレージを SFBAStream インスタンスとして扱えます。

参照

SFBSocket | SFBAStream


SFXTCPSocket::AsSFBSource
SFBSource インスタンスに変換します。
[ public, virtual, const ]
SFCError AsSFBSource(
    SFBSourceSmpPtr result   //  SFBSource インスタンスへのポインタ
);

引数

result

SFBSource インスタンスへのポインタを指定します。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • このストレージが閉じているとき: SFERR_INVALID_STATE
  • result 引数が null のとき: SFERR_INVALID_PARAM

解説

この関数は、 このストレージが内部で管理する SFBSocket インスタンスを SFBSource インスタンスに変換します。

result 引数には、変換結果である SFBSource インスタンスへのポインタが返ります。

[Note] 注意

この関数は、内部で BREW API の BREW API ISOURCEUTIL_SourceFromSocket 関数を呼び出します。

[Note] 注意

この関数により、 このストレージを SFBSource インスタンスとして扱えます。

参照

SFBSocket | SFBSource | BREW API ISOURCEUTIL_SourceFromSocket


SFXTCPSocket::Bind
Bind (ソケットに端末のローカル IP アドレスとポート番号を関連付ける操作)を行います。
[ public ]
SFCError Bind(
    SFXSocketAddressConstRef address   // 端末のローカル IP アドレスとポート番号: ローカル IP アドレスには SFXInetAddress::LoopbackInetAddress() または SFXInetAddress.AnyInetAddress() のいずれかを指定する
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ソケットが開いていないとき: SFERR_INVALID_STATE
  • 操作がブロックされたとき: AEE_NET_WOULDBLOCK
  • その他: BREW API の ISOCKET_GetLastError 関数が返すエラー値、またはAEE_NET_ERROR

解説

この関数は、Bind (ソケットに端末のローカル IP アドレスとポート番号を関連付ける操作)を行います。

ローカル IP アドレスは、 携帯端末内部でループバック通信するときは SFXInetAddress::LoopbackInetAddress 関数の戻り値、 外部と通信するときは SFXInetAddress::AnyInetAddress 関数の戻り値を指定します。 BREW SDK の制約により、これら以外の値はサポートされません。

端末をサーバーとして利用する場合は、 この関数を実行した後に、 SFXTCPSocket::Listen 関数を呼び出して、 サーバー側で接続の待ち受けを開始します。

この関数の戻り値が AEE_NET_WOULDBLOCK の場合、 SFXTCPSocket::ScheduleBind 関数でコールバック関数を登録し、 コールバック関数の中で再度この関数を呼び出す必要があります。

[Note] ポート番号のバインド

クライアント側ではこの関数の呼び出しを省略できますが、 Bind を省略した場合、デフォルトのポート番号がソケットに Bind されます。

[Note] 注意

この関数は、 内部で SFBSocket::Bind 関数を呼び出します。

[Note] 前提条件

この関数を呼び出す前に、 このソケットは SFXTCPSocket::Open 関数を呼び出して 開いている必要があります 。

参照

SFXTCPSocket::Open | SFXTCPSocket::Listen | SFXTCPSocket::Accept | SFXTCPSocket::ScheduleBind | SFXInetAddress::LoopbackInetAddress | SFXInetAddress::AnyInetAddress | SFXSocketAddress | SFBSocket::Bind | BREW API ISOCKET_Bind | BREW API ISOCKET_GetLastError | BREW API AEE_BREW_LOOPBACK | BREW API AEE_INADDR_LOOPBACK | BREW API AEE_INADDR_ANY


SFXTCPSocket::Cancel
ソケット通信における各種操作をキャンセルします。
[ public, virtual ]
Void Cancel(Void);

解説

この関数は、ソケット通信における各種操作をキャンセルします。

具体的には、 キャンセル対象となる操作で登録したコールバックをキャンセルし、 その操作を行う直前の状態(1 つ前の状態)に戻します。

キャンセルの対象となる操作とキャンセル内容は、以下の表の通りです。

表 225. キャンセルの対象となる操作とキャンセル内容

キャンセルの対象となる操作 キャンセル内容
SFXTCPSocket::Connect 関数によるサーバーへの接続 コールバックをキャンセルし、SFXTCPSocket::Open 関数を実行した直後の状態に戻します。
SFXTCPSocket::ScheduleBind 関数による Bind のスケジュール コールバックをキャンセルし、SFXTCPSocket::Open 関数を実行した直後の状態に戻します。
SFXTCPSocket::ScheduleListen 関数による Listen のスケジュール コールバックをキャンセルし、SFXTCPSocket::Bind 関数を実行した直後の状態に戻します。
SFXTCPSocket::ScheduleAccept 関数による Accept のスケジュール コールバックをキャンセルし、SFXTCPSocket::Listen 関数を実行した直後の状態に戻します。
SFXTCPSocket::ScheduleRead 関数による読み込み(受信)のスケジュール コールバックをキャンセルし、SFXTCPSocket::Connect 関数を実行した直後の接続が確立している状態に戻します。
SFXTCPSocket::ScheduleWrite 関数による書き込み(送信)のスケジュール コールバックをキャンセルし、SFXTCPSocket::Connect 関数を実行した直後の接続が確立している状態に戻します。
[Note] 注意

この関数は、SFXTCPSocket::Close 関数から呼び出されます。

参照

SFXTCPSocket::Open | SFXTCPSocket::Connect | SFXTCPSocket::ScheduleBind | SFXTCPSocket::ScheduleListen | SFXTCPSocket::ScheduleAccept | SFXTCPSocket::ScheduleRead | SFXTCPSocket::ScheduleWrite | SFXTCPSocket::Close


SFXTCPSocket::Close
ソケットを閉じます。
[ public ]
Void Close(Void);

解説

この関数は、このソケットを閉じます(このソケットを終了します)。

具体的には、 SFXTCPSocket::Cancel 関数を呼び出してソケット通信の各種操作をキャンセルし、 内部で管理している SFBNetMgr インスタンスと SFBSocket インスタンスを解放します。

[Note] 注意

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

[Note] 注意

この関数は、SFXTCPSocket::~SFXTCPSocket デストラクタから呼び出されます。

[Tip] Tip

サスペンド時は、この関数を呼び出してリソースを解放します。

参照

SFXTCPSocket::Open | SFXTCPSocket::Cancel | SFXTCPSocket::~SFXTCPSocket | SFBNetMgr | SFBSocket | BREW API INetMgr | BREW API ISocket


SFXTCPSocket::Connect
サーバーに接続リクエストを送信して、接続を確立します。
[ public ]
SFCError Connect(
    SFXSocketAddressConstRef address   // サーバーのドメイン名(または IP アドレス)とポート番号
    CallbackSPP spp                    // 接続確立の通知を受け取るコールバック関数
    VoidPtr reference                  // コールバック関数に渡すデータ(参照値)
);

引数

address

サーバーのドメイン名(または IP アドレス)とポート番号を指定します。 (※)ドメイン名の解決は、内部で自動的に行われます。

spp

接続確立の通知を受け取るコールバック関数を指定します。

reference

コールバック関数に渡すデータを指定します。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ソケットが閉じている、または既に接続が確立しているとき(確立中も含む): SFERR_INVALID_STATE
  • ドメイン名がないとき: SFERR_INVALID_STATE
  • SFBNetMgr インスタンスの作成に失敗したとき: SFERR_FAILED
  • メモリ不足のとき: SFERR_NO_MEMORY
  • ネットワークエラーのとき[※コールバック関数に通知される]: BREW API ISOCKET_GetLastError 関数が返すエラー値、またはAEE_NET_ERROR

解説

この関数は、引数に指定されたサーバーに接続リクエストを送信して、接続を確立します。 接続確立後は、このソケットを使用してサーバーと通信を行います。

接続確立についての結果(エラー値)は、この関数の戻り値では取得できません。 以下のエラー値が、引数に指定したコールバック関数の第 1 引数に通知されます。

  • AEE_NET_EADDRINUSE: 事前に ISOCKET_Bind() をコールして要求されたローカルアドレスが使用不可。
  • AEE_NET_EBADF: 無効なソケット記述子が指定された。
  • AEE_NET_ECONNREFUSED: 接続操作が拒否された。
  • AEE_NET_EIPADDRCHANGED: PPP の再同期化により IP アドレスが変更された。
  • AEE_NET_EINVAL: IP アドレスが無効か、ポートが指定されなかった。
  • AEE_NET_EISCONN: ソケットが接続済み (事前の Connect() コールの結果が既に戻っている)。
  • AEE_NET_EMFILE: この操作を完了するにはネットワークリソースが不充分 (使用中のソケット数が多過ぎる)。
  • AEE_NET_ENETDOWN: ネットワークが使用不可 (たとえば、ハンドセットが通信可能範囲外)。
  • AEE_NET_EOPNOTSUPP: ソケットタイプが STREAM でない。
  • AEE_NET_ETIMEDOUT: 接続試行がタイムアウトした。
  • AEE_NET_SUCCESS(SFERR_NO_ERROR): 接続が正常に完了し、ソケットがデータを読み書き可能な状態にある。

コールバック関数が呼び出されるまでは、「Connect 中の状態」になります。 コールバック関数が呼び出されたとき、 接続が確立している場合は、「接続確立の状態」になり、 失敗した場合は、この関数を呼び出す直前の状態(ソケットが開いている状態)に戻ります。

コールバック関数に接続確立の通知が行われる前に、 SFXTCPSocket::Cancel 関数を呼び出すと、 接続の確立はキャンセルされ、この関数を呼び出す直前の状態(ソケットが開いている状態)に戻ります。

なお、この関数の戻り値がエラー(SFERR_NO_ERROR 以外の値)の場合、コールバック関数は呼び出されません。

[Note] 注意

この関数は、 内部で SFBSocket::Connect 関数を呼び出します。

[Note] 前提条件

このソケットは SFXTCPSocket::Open 関数を呼び出した直後の開いた状態である必要があります。

使用例

// SFXTCPSocket インスタンス _socket はクラスのメンバ変数として定義する
class TcpSample {
private:
    SFXTCPSocket _socket;
public:
    Void Start(Void);                       
    XALLBACK_DECLARE_SFXTCPSOCKET(OnConnect) 
};

// TCP 接続を開始する
Void TcpSample::Start(Void)
{
    SFCError error(SFERR_NO_ERROR);

    // TCP サーバーのアドレスを設定する
    SFXSocketAddress address("www.example.com:37");

    // TCP ソケットを開く
    if ((error = _socket.Open()) == SFERR_NO_ERROR) {
        
        // サーバーに接続する
        if ((error = _socket.Connect(address,XALLBACK_INTERNAL(OnConnect))) == SFERR_NO_ERROR) {

            ...
        }else {

            // エラーが発生したとき
            _socket.Close();
        }
    }
	
    if (error != SFERR_NO_ERROR) { 

        // エラーが発生したとき
        ...
    }    
}

// 接続要求の結果が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {

        ...
    }
}

参照

SFXTCPSocket::Open | SFXTCPSocket::Cancel | SFBSocket::Connect | SFXSocketAddress | SFBNetMgr | SFXStorage::CallbackSPP | BREW API INetMgr | BREW API ISOCKET_Connect | BREW API ISOCKET_GetLastError | BREW API ネットワークエラーコード


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

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • バインドされておらず、接続も確立されていないとき: SFERR_INVALID_STATE
  • result 引数が null のとき: SFERR_INVALID_PARAM
  • その他: BREW API の ISOCKET_GetLastError 関数が返すエラー値、またはAEE_NET_ERROR

解説

この関数は、このソケットのローカル IP アドレスとポートを取得します。

実際の物理的な IP アドレスは、接続確立後のデータ送受信用ソケットから取得できます。 それまでの間は、SFXTCPSocket::Bind 関数で設定した値が返ります。

[Tip] Tip

実際の物理的なローカル IP アドレスは、 SFXInetAddress::LocalInetAddress 関数を呼び出して取得することも可能です。

[Note] 前提条件

ローカル IP アドレスとポートを取得するには、 このソケットが SFXTCPSocket::Bind 関数を呼び出してバインドしている、 または このソケットが SFXTCPSocket::Connect 関数により接続を確立している必要があります。

参照

SFXTCPSocket::Bind | SFXTCPSocket::Connect | SFXInetAddress::LocalInetAddress | SFXSocketAddress | BREW API ISOCKET_GetLastError


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

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • result 引数が null のとき: SFERR_INVALID_PARAM
  • その他: BREW API の ISOCKET_GetLastError 関数が返すエラー値、またはAEE_NET_ERROR

解説

この関数は、このソケットに接続されたピアのリモート IP アドレスとポートを取得します。

[Note] 注意

この関数は、 内部で SFBSocket::GetPeerName 関数を呼び出します。

[Note] 前提条件

リモート IP アドレスとポートを取得するには、 このソケットが SFXTCPSocket::Accept 関数で返される接続確立済みである、 または このソケットが SFXTCPSocket::Connect 関数により接続を確立している必要があります。

参照

SFBSocket::GetPeerName | SFXTCPSocket::Accept | SFXTCPSocket::Connect | SFXSocketAddress | BREW API ISOCKET_GetPeerName | BREW API ISOCKET_GetLastError


SFXTCPSocket::GetSFBNetMgr
内部で管理する SFBNetMgr インスタンスを取得します。
[ public, const ]
SFBNetMgrSmpConstRef GetSFBNetMgr(Void);

戻り値

このソケットが内部で管理する SFBNetMgr インスタンス

解説

この関数は、 このソケットが内部で管理する SFBNetMgr インスタンスを取得します。

参照

SFBNetMgr | BREW API INetMgr


SFXTCPSocket::GetSFBSocket
内部で管理する SFBSocket インスタンスを取得します。
[ public, const ]
SFBSocketSmpConstRef GetSFBSocket(Void);

戻り値

このソケットが内部で管理する SFBSocket インスタンス

解説

この関数は、 このソケットが内部で管理する SFBSocket インスタンスを取得します。

参照

SFBSocket


SFXTCPSocket::GetStreamReader
データ受信用ストリームを取得します。
[ public, virtual ]
SFCError GetStreamReader(
    UInt32 size                 // バッファサイズ
    SFXStreamReaderPtr result   // データ受信用ストリームへのポインタ
);
[ public, virtual ]
SFCError GetStreamReader(
    SFXStreamReaderPtr result   // データ受信用ストリームへのポインタ
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • result 引数が null のとき: SFERR_INVALID_PARAM
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、データ受信用ストリームを取得します。

size 引数を指定する場合、ストリームバッファは指定したサイズで固定です。 指定しない場合は、ストリームバッファは可変長になり、 内部的に SFXElasticStreamReader クラスが利用されます。

[Tip] Tip
データ受信用ストリームは、受信するデータの種類に応じて SFXBinaryStreamReaderSFXAnsiStringStreamReader、または SFXWideStringStreamReader クラスを使い分けます。
[Note] 前提条件

データ受信用ストリームを取得するには、 このソケットが SFXTCPSocket::Accept 関数で返される接続確立済みのソケットである、 または このソケットが SFXTCPSocket::Connect 関数により接続を確立している必要があります。

使用例

以下は、SFXBinaryStreamReader クラスを使用してデータ受信用ストリームを取得するコードです。

// SFXTCPSocket インスタンス (_socket) はクラスのメンバ変数として定義する
class NetworkTime {
private:
    SFXTCPSocket _socket;
    SFXBinaryStreamReader _reader;
public:
    // コールバック関数の宣言
    XALLBACK_DECLARE_SFXTCPSOCKET(OnConnect)
};

// 接続要求の結果が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXTCPSOCKET(NetworkTime, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {

        // データ受信用ストリームを取得する
        if ((error = _socket.GetStreamReader(64, &_reader)) == SFERR_NO_ERROR) {
            ...
        }
    }
    return;
}

参照

SFXTCPSocket::GetStreamWriter | SFXBinaryStreamReader | SFXAnsiStringStreamReader | SFXWideStringStreamReader | SFXTCPSocket::Accept | SFXTCPSocket::Connect | ストリームバッファ


SFXTCPSocket::GetStreamWriter
データ送信用ストリームを取得します。
[ public, virtual ]
SFCError GetStreamWriter(
    UInt32 size                 // バッファサイズ
    SFXStreamWriterPtr result   // データ送信用ストリームへのポインタ
);
[ public, virtual ]
SFCError GetStreamWriter(
    SFXStreamWriterPtr result   // データ送信用ストリームへのポインタ
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • result 引数が null のとき: SFERR_INVALID_PARAM
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、データ送信用ストリームを取得します。

size 引数を指定する場合、ストリームバッファは指定したサイズで固定です。 指定しない場合は、ストリームバッファは可変長になり、 内部的に SFXElasticStreamWriter クラスが利用されます。

[Tip] Tip
データ送信用ストリームは、送信するデータの種類に応じて SFXBinaryStreamWriterSFXAnsiStringStreamWriter、または SFXWideStringStreamWriter クラスを使い分けます。
[Note] 前提条件

データ受信用ストリームを取得するには、 このソケットが SFXTCPSocket::Accept 関数で返される接続確立済みのソケットである、 または このソケットが SFXTCPSocket::Connect 関数により接続を確立している必要があります。

使用例

以下は、SFXBinaryStreamWriter クラスを使用してデータ送信用ストリームを取得するコードです。

// SFXTCPSocket インスタンス (_socket) はクラスのメンバ変数として定義する
class NetworkTime {
private:
    SFXTCPSocket _socket;
    SFXBinaryStreamwriter _writer;
public:
    // コールバック関数の宣言
    XALLBACK_DECLARE_SFXTCPSOCKET(OnConnect)
};
    
// 接続要求の結果が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXTCPSOCKET(NetworkTime, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {

        // データ送信用ストリームを取得する
        if ((error = _socket.GetStreamWriter(64, &_writer)) == SFERR_NO_ERROR) {
            ...
        }
    }
    return;
}

参照

SFXTCPSocket::GetStreamReader | SFXBinaryStreamWriter | SFXAnsiStringStreamWriter | SFXWideStringStreamWriter | SFXTCPSocket::Accept | SFXTCPSocket::Connect | ストリームバッファ


SFXTCPSocket::Listen
Listen (サーバー側で接続リクエストの待ち受けを開始する操作)を行います。
[ public ]
SFCError Listen(
    SInt16 backlog = 1   // 待機中の接続リクエストが格納されるキューの大きさ
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ソケットが Bind されていない、またはListen / ScheduleListen 中であるとき: SFERR_INVALID_STATE
  • 操作がブロックされたとき: AEE_NET_WOULDBLOCK
  • その他: BREW API の ISOCKET_GetLastError 関数が返すエラー値、またはAEE_NET_ERROR

解説

この関数は、Listen (サーバー側で接続リクエストの待ち受けを開始する操作)を行います。

引数に待機中の接続リクエストが格納されるキューの大きさ(バックログのキューの長さ)を設定することが可能です。 省略時は、1 が設定されます。システムの最大値よりも大きな値が指定された場合は、 システムの最大値が設定されます。

この関数を実行した後に、 SFXTCPSocket::Accept 関数を呼び出して待機中の接続リクエストを 1 つ取り出し、 接続を確立します。

この関数の戻り値が AEE_NET_WOULDBLOCK の場合、 SFXTCPSocket::ScheduleListen 関数でコールバック関数を登録し、 コールバック関数の中で再度この関数を呼び出す必要があります。

[Note] 注意

この関数は、 内部で SFBSocket::Listen 関数を呼び出します。

[Note] 前提条件

この関数を呼び出す前に、 このソケットは SFXTCPSocket::Bind 関数を呼び出して Bind されている必要があります 。

参照

SFXTCPSocket::Bind | SFXTCPSocket::Accept | SFXTCPSocket::ScheduleListen | SFBSocket::Listen | BREW API ISOCKET_Listen | BREW API ISOCKET_GetLastError


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

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ソケットが閉じていないとき: SFERR_INVALID_STATE
  • SFBNetMgr インスタンスの生成に失敗したとき: SFERR_FAILED
  • SFBSocket インスタンスの生成に失敗したとき: INETMGR_GetLastError() の戻り値
  • UINT16_MAXIMUM よりも大きなリンガー時間を設定したとき: SFERR_INVALID_PARAM

解説

この関数は、このソケットを開きます(このソケットを初期化します)。

具体的には、 SFXTCPSocket クラスが内部で管理する SFBNetMgr インスタンスを生成し、 BREW API INETMGR_OpenSocket 関数を呼び出して AEE_SOCK_STREAM タイプのソケット(SFBSocket インスタンス)を生成します。

SFBNetMgr / SFBSocket インスタンスは、 SFXTCPSocket::GetSFBNetMgr / SFXTCPSocket::GetSFBSocket 関数で取得することが可能です。 これらのインスタンスを利用して、詳細な設定が可能です。

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

BREW API INETMGR_SetLinger 関数で設定するリンガー時間(ネットワーク接続の待機時間)は、この関数の linger 引数で指定できます。 デフォルト値は -1 ですが、このときはリンガー時間は設定されません。 UINT16_MAXIMUM よりも大きなリンガー時間を設定すると、SFERR_INVALID_PARAM エラーが返ります。 リンガー時間の設定についての詳細は、 BREW API INETMGR_SetLinger 関数を参照してください。

[Tip] Tip

SFXTCPSocket::Close 関数を呼び出すと、 このソケットは閉じます。

使用例

// TCP ソケット _socket はクラスのメンバ変数として定義する
class TcpSample {
private:
    SFXTCPSocket _socket;  // TCP ソケット
public:
    Void Start(Void); 
    XALLBACK_DECLARE_SFXTCPSOCKET(OnConnect)
};

// TCP ソケット通信を開始する
Void TcpSample::Start(Void)
{
    SFCError error(SFERR_NO_ERROR);

    // TCP サーバーのアドレスを設定する
    SFXSocketAddress address("www.example.com:37");

    // TCP サーバーと接続を初期化する
    if ((error = _socket.Open()) == SFERR_NO_ERROR) { 
        
        // サーバーに接続する(接続の完了は OnConnect 関数に通知される)
        // ※ ドメイン名の解決は自動的に行われる
        if ((error = _socket.Connect(address, XALLBACK_INTERNAL(OnConnect))) == SFERR_NO_ERROR) { 

            ...

        }else {

            // エラーが発生したとき
            _socket.Close();
        }
    }
	
    if (error != SFERR_NO_ERROR) {

        // エラーが発生したとき
        ...
    }    
}

// 接続要求の結果が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {

        ...
    }
}

参照

SFXTCPSocket::Close | SFXTCPSocket::GetSFBNetMgr | SFXTCPSocket::GetSFBSocket | SFBNetMgr | SFBSocket | BREW API INetMgr | BREW API ISocket | BREW API INETMGR_SetLinger | BREW API INETMGR_OpenSocket


SFXTCPSocket::Read
Read(ストリームを使用しないソケットからのデータ受信)を行います。
[ public, virtual ]
SFCError Read(
    VoidPtr buffer   // データを読み込むバッファ
    UInt32Ptr size   // 呼び出す前: データを読み込むバッファのサイズ。戻り値: 実際に読み込んだデータのサイズ
);

引数

buffer

データを読み込むバッファを指定します。

size

この関数を呼び出す時は、データを読み込むバッファのサイズを指定します。 この関数が戻ると、実際にバッファに読み込んだデータのサイズが格納されています。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • size 引数が null のとき: SFERR_INVALID_PARAM
  • 再試行が必要なとき: AEE_NET_WOULDBLOCK
  • その他のネットワークエラーが発生したとき: SFBSocket::GetLastError 関数で得られるエラー値、またはAEE_NET_ERROR

解説

この関数は、Read(ストリームを使用しないソケットからのデータ受信)を行います。

ピアが接続を切断した場合、 この関数は SFERR_NO_ERROR を返し、かつ、 size 引数のポインタが指す場所に 0 が戻ります。

※ この関数が AEE_NET_WOULDBLOCK を返す場合、 SFXTCPSocket::ScheduleRead 関数でコールバック関数を登録し、 コールバック関数の中で再度この関数を呼び出して Read を行う必要があります。

[Note] 注意

この関数は、 内部で SFBAStream::Read 関数を呼び出します。

[Note] 前提条件

この関数を呼び出す前に、 このソケットは SFXTCPSocket::Connect 関数を呼び出して 接続を確立している必要があります 。 もしくは、 このソケットは SFXTCPSocket::Accept 関数が result 引数に返した「接続確立済みのソケット」である必要があります。

使用例

// SFXTCPSocket インスタンス (_socket) はクラスのメンバ変数として定義する   
class TcpSample {
private:
    SFXTCPSocket _socket;
public:
    // コールバック関数の宣言
    XALLBACK_DECLARE_SFXTCPSOCKET(OnWrite)  
    XALLBACK_DECLARE_SFXTCPSOCKET(OnRead)  
};

// Write(データ送信)可能が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnWrite, error)
{
    UInt32 size;
    static ACharConst data[] = "GET / HTTP/1.0\n\n";
    
    // データを書き込む
    size = sizeof(data) - 1;

    switch (error = _socket.Write(data, &size)) {

        case SFERR_NO_ERROR:

            // Read をスケジュールする: コールバック関数を登録する
            // ※ Read 可能になれば、OnRead コールバック関数が呼び出される
            _socket.ScheduleRead(XALLBACK_INTERNAL(OnRead));
            break;

        case AEE_NET_WOULDBLOCK:

            // Write をスケジュールする: コールバック関数を登録する
            // ※ Write 可能になれば、OnWrite コールバック関数が呼び出される
            _socket.ScheduleWrite(XALLBACK_INTERNAL(OnWrite));
            break;
    }
}

// Read(データ受信)可能が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnRead, error)
{
    SFXBuffer buffer;
    UInt32 size;

    // データを読み込む
    buffer.SetSize(32);
    size = buffer.GetSize();

    switch (_socket.Read(buffer.GetBuffer(), &size)) {

        case SFERR_NO_ERROR:

           // 指定したサイズのデータが読み込まれたかチェックする
           if (size == buffer.GetSize()) {

                // 読み込んだデータを表示する
                buffer.SetSize(buffer.GetSize() + 1);
                buffer[buffer.GetSize() - 1] = '\0';
                TRACE("%s", SFXAnsiString(buffer).GetCString());
                
               // 接続を閉じる
                _socket.Close();
            }
            else {

                ...

            }
            break;

        case AEE_NET_WOULDBLOCK:

            // Read をスケジュールする: コールバック関数を登録する
            // ※ Read 可能になれば、OnRead コールバック関数が呼び出される
            _socket.ScheduleRead(XALLBACK_INTERNAL(OnRead));
            break;
    }
    return;
}

参照

SFXTCPSocket::ScheduleRead | SFXTCPSocket::Accept | SFBAStream::Read | BREW API ISOCKET_Read


SFXTCPSocket::ScheduleAccept
Accept(待機中の接続リクエストを 1 つ取り出し、クライアントとの接続を確立する操作)をスケジュールします。
[ public ]
SFCError ScheduleAccept(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバック関数に渡すデータ(参照値)
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ソケットが Listen されていないとき、または「Accept スケジュール中の状態」のとき: SFERR_INVALID_STATE

解説

この関数は、Accept(待機中の接続リクエストを 1 つ取り出し、クライアントとの接続を確立する操作)をスケジュールします。

具体的には、 SFXTCPSocket::Accept 関数を使用して Accept を行うコールバック関数を登録します。 登録されたコールバック関数は、Accept が可能になると BREW AEE により呼び出されます。

コールバック関数が呼び出されるまでは、「Accept スケジュール中の状態」になります。 コールバック関数が呼び出されると、この関数を呼び出す直前の状態(ソケットが Listen している状態)に戻ります。

コールバック関数が呼び出される前に、 SFXTCPSocket::Cancel 関数を呼び出すと、 Accept のスケジュールはキャンセルされ、この関数を呼び出す直前の状態(ソケットが Listen している状態)に戻ります。

なお、この関数の戻り値がエラー(SFERR_NO_ERROR 以外の値)の場合、コールバック関数は呼び出されません。

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

[Note] 注意

この関数は、 内部で SFBAStream::Readable 関数を呼び出します。

[Note] 前提条件

この関数を呼び出す前に、 このソケットは SFXTCPSocket::Listen 関数を呼び出して Listen(サーバー側で接続リクエストの待ち受けを開始する操作)を行っている必要があります 。

また、既に Accept がスケジュールされている場合は、SFERR_INVALID_STATE エラーが返ります。

参照

SFXTCPSocket::Accept | SFXTCPSocket::Listen | SFBAStream::Readable | SFXStorage::CallbackSPP | BREW API ISOCKET_Readable


SFXTCPSocket::ScheduleBind
Bind(ソケットに端末のローカル IP アドレスとポート番号を関連付ける操作)をスケジュールします。
[ public ]
SFCError ScheduleBind(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバック関数に渡すデータ(参照値)
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ソケットが閉じているとき、接続を確立しているとき(接続確立中も含む)、 または「Bind スケジュール中の状態」のとき: SFERR_INVALID_STATE

解説

この関数は、Bind(ソケットに端末のローカル IP アドレスとポート番号を関連付ける操作)をスケジュールします。

具体的には、 SFXTCPSocket::Bind 関数を使用して Bind を行うコールバック関数を登録します。 登録されたコールバック関数は、Bind が可能になると BREW AEE により呼び出されます。

コールバック関数が呼び出されるまでは、「Bind スケジュール中の状態」になります。 コールバック関数が呼び出されると、この関数を呼び出す直前の状態(ソケットが開いている状態)に戻ります。

コールバック関数が呼び出される前に、 SFXTCPSocket::Cancel 関数を呼び出すと、 Bind のスケジュールはキャンセルされ、この関数を呼び出す直前の状態(ソケットが開いている状態)に戻ります。

なお、この関数の戻り値がエラー(SFERR_NO_ERROR 以外の値)の場合、コールバック関数は呼び出されません。

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

[Note] 注意

この関数は、 内部で SFBSocket::Writeable 関数を呼び出します。

[Note] 前提条件

この関数を呼び出す前に、 このソケットは SFXTCPSocket::Open 関数を呼び出して 開いている必要があります。 但し、接続が確立されている、もしくは、確立中の場合は、 SFERR_INVALID_STATE エラーが返ります。

また、既に Bind がスケジュールされている場合も、SFERR_INVALID_STATE エラーが返ります。

参照

SFXTCPSocket::Bind | SFBSocket::Writeable | SFXStorage::CallbackSPP | BREW API ISOCKET_Writeable


SFXTCPSocket::ScheduleListen
Listen(サーバー側で接続リクエストの待ち受けを開始する操作)をスケジュールします。
[ public ]
SFCError ScheduleListen(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバック関数に渡すデータ(参照値)
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ソケットが Bind されていないとき、または「Listen スケジュール中の状態」のとき: SFERR_INVALID_STATE

解説

この関数は、Listen(サーバー側で接続リクエストの待ち受けを開始する操作)をスケジュールします。

具体的には、 SFXTCPSocket::Listen 関数を使用して Listen を行うコールバック関数を登録します。 登録されたコールバック関数は、Listen が可能になると BREW AEE により呼び出されます。

コールバック関数が呼び出されるまでは、「Listen スケジュール中の状態」になります。 コールバック関数が呼び出されると、この関数を呼び出す直前の状態(ソケットが Bind している状態)に戻ります。

コールバック関数が呼び出される前に、 SFXTCPSocket::Cancel 関数を呼び出すと、 Listen のスケジュールはキャンセルされ、この関数を呼び出す直前の状態(ソケットが Bind している状態)に戻ります。

なお、この関数の戻り値がエラー(SFERR_NO_ERROR 以外の値)の場合、コールバック関数は呼び出されません。

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

[Note] 注意

この関数は、 内部で SFBSocket::Writeable 関数を呼び出します。

[Note] 前提条件

この関数を呼び出す前に、 このソケットは SFXTCPSocket::Bind 関数を呼び出して Bind(ソケットに端末のローカル IP アドレスとポート番号を関連付ける操作)している必要があります 。

また、既に Listen がスケジュールされている場合は、SFERR_INVALID_STATE エラーが返ります。

参照

SFXTCPSocket::Listen | SFBSocket::Writeable | SFXStorage::CallbackSPP | BREW API ISOCKET_Writeable


SFXTCPSocket::ScheduleRead
Read(ストリームを使用しないソケットからのデータ受信)をスケジュールします。
[ public, virtual ]
SFCError ScheduleRead(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバック関数に渡すデータ(参照値)
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき、または「Read スケジュール中の状態」のとき: SFERR_INVALID_STATE

解説

この関数は、Read(ストリームを使用しないソケットからのデータ受信)をスケジュールします。

具体的には、 SFXTCPSocket::Read 関数による Read を行うコールバック関数を登録します。 登録されたコールバック関数は、Read が可能になると BREW AEE により呼び出されます。

コールバック関数が呼び出されるまでは、「Read スケジュール中の状態」になります。 コールバック関数が呼び出されると、この関数を呼び出す直前の状態(接続が確立している状態)に戻ります。

コールバック関数が呼び出される前に、 SFXTCPSocket::Cancel 関数を呼び出すと、 Read のスケジュールはキャンセルされ、この関数を呼び出す直前の状態(接続が確立している状態)に戻ります。

なお、この関数の戻り値がエラー(SFERR_NO_ERROR 以外の値)の場合、コールバック関数は呼び出されません。

SFXTCPSocket::Read 関数の戻り値が AEE_NET_WOULDBLOCK である場合、 この関数を使用してコールバック関数を登録し、 Read を試みます。

[Note] 注意

この関数は、 内部で SFBAStream::Readable 関数を呼び出します。

[Note] 前提条件

この関数を呼び出す前に、 このソケットは SFXTCPSocket::Connect 関数を呼び出して 接続を確立している必要があります 。 もしくは、 このソケットは SFXTCPSocket::Accept 関数が result 引数に返した「接続確立済みのソケット」である必要があります。

また、既に Read がスケジュールされている場合は、SFERR_INVALID_STATE エラーが返ります。

使用例

// SFXTCPSocket インスタンス (_socket) はクラスのメンバ変数として定義する   
class TcpSample {
private:
    SFXTCPSocket _socket;
public:
    // コールバック関数の宣言
    XALLBACK_DECLARE_SFXTCPSOCKET(OnWrite)  
    XALLBACK_DECLARE_SFXTCPSOCKET(OnRead)  
};

// Write(データ送信)可能が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnWrite, error)
{
    UInt32 size;
    static ACharConst data[] = "GET / HTTP/1.0\n\n";
    
    // データを書き込む
    size = sizeof(data) - 1;
    switch (error = _socket.Write(data, &size)) {

        case SFERR_NO_ERROR:

            // Read をスケジュールする: コールバック関数を登録する
            // ※ Read 可能になれば、OnRead コールバック関数が呼び出される
            _socket.ScheduleRead(XALLBACK_INTERNAL(OnRead));
            break;

        case AEE_NET_WOULDBLOCK:

            // Write をスケジュールする: コールバック関数を登録する
            // ※ Write 可能になれば、OnWrite コールバック関数が呼び出される
            _socket.ScheduleWrite(XALLBACK_INTERNAL(OnWrite));
            break;
    }
}

// Read(データ受信)可能が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnRead, error)
{
    SFXBuffer buffer;
    UInt32 size;

    // データを読み込む
    buffer.SetSize(32);
    size = buffer.GetSize();
    switch (_socket.Read(buffer.GetBuffer(), &size)) {

        case SFERR_NO_ERROR:

           // 指定したサイズのデータが読み込まれたかチェックする
           if (size == buffer.GetSize()) {

                // 読み込んだデータを表示する
                buffer.SetSize(buffer.GetSize() + 1);
                buffer[buffer.GetSize() - 1] = '\0';
                TRACE("%s", SFXAnsiString(buffer).GetCString());
                
                _socket.Close();  // 接続を閉じる
            }
            else {
                ...
            }
            break;

        case AEE_NET_WOULDBLOCK:

            // Read をスケジュールする: コールバック関数を登録する
            // ※ Read 可能になれば、OnRead コールバック関数が呼び出される
            _socket.ScheduleRead(XALLBACK_INTERNAL(OnRead));
            break;
    }
    return;
}

参照

SFXTCPSocket::Read | SFXTCPSocket::Accept | SFBAStream::Readable | SFXStorage::CallbackSPP | BREW API ISOCKET_Readable


SFXTCPSocket::ScheduleWrite
Write(ストリームを使用しないソケットへのデータ送信)をスケジュールします。
[ public, virtual ]
SFCError ScheduleWrite(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバック関数に渡すデータ(参照値)
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき、または「Write スケジュール中の状態」のとき: SFERR_INVALID_STATE

解説

この関数は、Write(ストリームを使用しないソケットへのデータ送信)をスケジュールします。

具体的には、 SFXTCPSocket::Write 関数による Write を行うコールバック関数を登録します。 登録されたコールバック関数は、Write が可能になると BREW AEE により呼び出されます。

コールバック関数が呼び出されるまでは、「Write スケジュール中の状態」になります。 コールバック関数が呼び出されると、この関数を呼び出す直前の状態(接続が確立している状態)に戻ります。

コールバック関数が呼び出される前に、 SFXTCPSocket::Cancel 関数を呼び出すと、 Write のスケジュールはキャンセルされ、この関数を呼び出す直前の状態(接続が確立している状態)に戻ります。

なお、この関数の戻り値がエラー(SFERR_NO_ERROR 以外の値)の場合、コールバック関数は呼び出されません。

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

[Note] 注意

この関数は、 内部で SFBSocket::Writeable 関数を呼び出します。

[Note] 前提条件

この関数を呼び出す前に、 このソケットは SFXTCPSocket::Connect 関数を呼び出して 接続を確立している必要があります 。 もしくは、 このソケットは SFXTCPSocket::Accept 関数が result 引数に返した「接続確立済みのソケット」である必要があります。

また、既に Write がスケジュールされている場合は、SFERR_INVALID_STATE エラーが返ります。

使用例

// SFXTCPSocket インスタンス (_socket) はクラスのメンバ変数として定義する   
class TcpSample {
private:

    SFXTCPSocket _socket;

public:

    // コールバック関数の宣言
    XALLBACK_DECLARE_SFXTCPSOCKET(OnConnect)  
    XALLBACK_DECLARE_SFXTCPSOCKET(OnWrite)  
};

// 接続要求の結果が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {

        // Write をスケジュールする: コールバック関数を登録する
        // ※ Write 可能になれば、OnWrite コールバック関数が呼び出される
        _socket.ScheduleWrite(XALLBACK_INTERNAL(OnWrite));
    }
}

// Write(データ送信)可能が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnWrite, error)
{
    UInt32 size;
    static ACharConst data[] = "GET / HTTP/1.0\n\n";
    
    // データを書き込む
    size = sizeof(data) - 1;

    switch (error = _socket.Write(data, &size)) {

        case SFERR_NO_ERROR:

            ...
            break;

        case AEE_NET_WOULDBLOCK:

            // Write をスケジュールする: コールバック関数を登録する
            // ※ Write 可能になれば、OnWrite コールバック関数が呼び出される
            _socket.ScheduleWrite(XALLBACK_INTERNAL(OnWrite));
            break;
    }
}

参照

SFXTCPSocket::Write | SFBSocket::Writeable | SFXTCPSocket::Accept | SFXStorage::CallbackSPP | BREW API ISOCKET_Writeable


SFXTCPSocket::Write
Write(ストリームを使用しないソケットへのデータ送信)を行います。
[ public, virtual ]
SFCError Write(
    VoidConstPtr buffer   // データを書き込むバッファ
    UInt32Ptr size        // 呼び出す前: データを書き込むバッファのサイズ。戻り値: 実際に書き込んだデータのサイズ
);

引数

buffer

データを書き込むバッファを指定します。

size

この関数を呼び出す時は、データを書き込むバッファのサイズを指定します。 この関数が戻ると、実際にバッファに書き込んだデータのサイズが格納されています。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • size 引数が null のとき: SFERR_INVALID_PARAM
  • 再試行が必要なとき : AEE_NET_WOULDBLOCK
  • その他のネットワークエラーが発生したとき: SFBSocket::GetLastError 関数で得られるエラー値、またはAEE_NET_ERROR

解説

この関数は、Write(ストリームを使用しないソケットへのデータ送信)を行います。

※ この関数が AEE_NET_WOULDBLOCK を返す場合、 SFXTCPSocket::ScheduleWrite 関数でコールバック関数を登録し、 コールバック関数の中で再度この関数を呼び出して Write を行う必要があります。

[Note] 注意

この関数は、 内部で SFBSocket::Write 関数を呼び出します。

[Note] 前提条件

この関数を呼び出す前に、 このソケットは SFXTCPSocket::Connect 関数を呼び出して 接続を確立している必要があります 。 もしくは、 このソケットは SFXTCPSocket::Accept 関数が result 引数に返した「接続確立済みのソケット」である必要があります。

使用例

// SFXTCPSocket インスタンス (_socket) はクラスのメンバ変数として定義する   
class TcpSample {
private:

    SFXTCPSocket _socket;

public:

    // コールバック関数の宣言
    XALLBACK_DECLARE_SFXTCPSOCKET(OnConnect)  
    XALLBACK_DECLARE_SFXTCPSOCKET(OnWrite)  
};

// 接続要求の結果が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {

        // Write をスケジュールする: コールバック関数を登録する
        // ※ Write 可能になれば、OnWrite コールバック関数が呼び出される
        _socket.ScheduleWrite(XALLBACK_INTERNAL(OnWrite));
    }
}

// Write(データ送信)可能が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnWrite, error)
{
    UInt32 size;
    static ACharConst data[] = "GET / HTTP/1.0\n\n";
    
    // データを書き込む
    size = sizeof(data) - 1;

    switch (error = _socket.Write(data, &size)) {

        case SFERR_NO_ERROR:

            ...
            break;

        case AEE_NET_WOULDBLOCK:

            // Write をスケジュールする: コールバック関数を登録する
            // ※ Write 可能になれば、OnWrite コールバック関数が呼び出される
            _socket.ScheduleWrite(XALLBACK_INTERNAL(OnWrite));
            break;
    }
}

参照

SFXTCPSocket::ScheduleWrite | SFXTCPSocket::Accept | SFBSocket::Write | BREW API ISOCKET_Write