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

継承図

SFXTCPSocket クラスの継承図

協調図

SFXTCPSocket クラスの協調図

解説

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

TCP ソケット通信の手順

  1. TCP ソケット ( SFXTCPSocket クラスのインスタンス ) を作成します。
  2. SFXTCPSocket::Open 関数を呼び出して TCP ソケットをオープンします。
  3. SFXTCPSocket::Connect 関数を呼び出して TCP サーバーに接続します。 接続先のアドレスとポート番号 ( SFXSocketAddress クラスのインスタンス ) と、接続確立の通知を受け取るコールバック関数を登録します。 ドメイン名の解決は SFXTCPSocket クラス内で自動的に行われます。
  4. 接続確立の通知を受け取ると、SFXTCPSocket::Connect 関数で登録したコールバック関数が呼び出されます。
  5. SFXTCPSocket::GetStreamWriter 関数を呼び出して、送信用ストリーム ( SFXBinaryStreamWriter または SFXAnsiStringStreamWriterSFXWideStringStreamWriter クラスのインスタンス ) を取得し、そのストリームにデータを書き込みます。 SFXStreamWriter::Flush 関数を呼び出して、ストリームに書き込まれたデータを実際に送信します。SFXStreamWriter::Flush 関数の引数で、送信完了の通知を受け取るコールバック関数を登録します。 このコールバック関数には、データ送信後の処理を記述します。
  6. SFXTCPSocket::GetStreamReader 関数を呼び出して、受信用ストリーム ( SFXBinaryStreamReader または SFXAnsiStringStreamReaderSFXWideStringStreamReader クラスのインスタンス ) を取得します。 SFXStreamReader::Fetch 関数を呼び出して、受信用ストリームに実際にデータを受信します。同時に、SFXStreamReader::Fetch 関数の引数には受信完了の通知を受け取るコールバック関数を指定します。 次に、登録したコールバック関数の中で、ストリームから受信データを読み込みます。
  7. 5. と 6. の送信、受信処理を繰り返します。
  8. 最後に、SFXTCPSocket::Close 関数を呼び出して、TCP ソケットをクローズします。

例 500. TCP ソケット通信の手順

// SFXTCPSocket クラスのインスタンス _tcp はクラスのメンバ変数として定義する
class NetworkTime {
private:
    SFXTCPSocket _tcp;
    SFXBinaryStreamReader _reader;

public:
    Void Start(Void); // NTP サーバーとの接続を開始する
    Void Stop(Void);  // 接続途中で NTP サーバーとの接続を終了する
    
    // コールバック関数の宣言
    CALLBACK_DECLARE_SFXTCPSOCKET(OnConnect)
    CALLBACK_DECLARE_SFXBINARYSTREAMREADER(OnFetch)
};

// NTP サーバーとの接続を開始する
Void NetworkTime::Start(Void)
{
    SFCError error(SFERR_NO_ERROR);
    // NTP サーバーのアドレスを設定する
    SFXSocketAddress address("www.example.com:37");

    // NTP サーバーとの接続を初期化する
    if ((error = _tcp.Open()) == SFERR_NO_ERROR) {

        // NTP サーバーに接続する ( 接続の完了は、OnConnect 関数に通知される )
        if ((error = _tcp.Connect(address,
                CALLBACK_FUNCTION(OnConnect))) == SFERR_NO_ERROR) {
            ...
        }
        else {
            // エラーが発生したとき
            _tcp.Close();
        }
    }
	
    if (error != SFERR_NO_ERROR) { 
        // エラーが発生したとき
        // エラー処理
        ...
    }
    return;
}

// 接続途中で NTP サーバーとの接続を終了する場合に呼び出す
Void NetworkTime::Stop(Void)
{
    // 終了処理
    _reader.Release();
    _tcp.Close();
    return;
}

// 接続の完了が通知されるコールバック関数
CALLBACK_IMPLEMENT_SFXTCPSOCKET(NetworkTime, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {

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

            // 4 バイトのデータを受信する。データ受信の完了は、OnFetch 関数に通知される
            if ((error = _reader.Fetch(4, CALLBACK_FUNCTION(OnFetch)))
                == SFERR_NO_ERROR) {
                ...
            }
            if (error != SFERR_NO_ERROR) { 
                // エラーが発生したとき
                _reader.Release();
            }
        }
    }
	
    if (error != SFERR_NO_ERROR) {  
        // エラーが発生したとき
        _tcp.Close();
    }
    return;
}

// データ受信完了の通知を受け取るコールバック関数
CALLBACK_IMPLEMENT_SFXBINARYSTREAMREADER(NetworkTime, OnFetch, error)
{
    SFXDate date; // 日付クラス
    UInt32 time;

    if (error == SFERR_NO_ERROR) {

        // データをビッグ エンディアンとして読み込む設定をする
        _reader.SetEndian(SFXBinaryStreamReader::ENDIAN_BIG);
        
        // データを UInt32 型として読み込み、time 変数に格納する
        if ((error = _reader.ReadUInt32(&time)) == SFERR_NO_ERROR) {
            
            // 日付クラスに取得した時刻 ( 秒 ) を設定する
            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();
    _tcp.Close();
    return;
}

参照

SFXUDPSocket | SFXSSLSocket | ソケット通信

メンバ

コンストラクタ/デストラクタ
SFXTCPSocket( Void )
SFXTCPSocket クラスのコンストラクタです。
~SFXTCPSocket( Void )
SFXTCPSocket クラスのデストラクタです。
パブリック関数
SFCError Accept( SFXTCPSocketPtr result )
TCP サーバーとの接続を待機します。
SFCError AsSFBAStream( SFBAStreamSmpPtr result )
内部で管理されている SFBSocket クラスのインスタンスを SFBAStream クラスのインスタンスに変換します。
SFCError AsSFBSource( SFBSourceSmpPtr result )
内部で管理されている SFBSocket クラスのインスタンスを SFBSource クラスのインスタンスに変換します。
SFCError Bind( SFXSocketAddressConstRef address )
ローカル の IP アドレスとポート番号をソケットに関連付けます。
Void Cancel( Void )
TCP ソケット通信をキャンセルします。
Void Close( Void )
TCP ソケットをクローズします。
SFCError Connect( SFXSocketAddressConstRef address , CallbackSPP spp , VoidPtr reference )
TCP 接続を開始します。
SFCError GetLocalAddress( SFXSocketAddressPtr result )
ローカルの IP アドレスとポート番号を取得します。
SFCError GetRemoteAddress( SFXSocketAddressPtr result )
リモートの IP アドレスとポート番号を取得します。
SFBSocketSmpConstRef GetSFBSocket( Void )
内部で管理するソケットを取得します。
SFCError GetStreamReader( UInt32 size , SFXStreamReaderPtr result )
GetStreamReader( SFXStreamReaderPtr result )
データ受信用ストリームを取得します。
SFCError GetStreamWriter( UInt32 size , SFXStreamWriterPtr result )
GetStreamWriter( SFXStreamWriterPtr result )
データ送信用ストリームを取得します。
SFCError Listen( SInt16 backlog = 1 )
TCP 接続の待ち受けを開始します。
SFCError Open( Void )
TCP ソケットを開きます。
SFCError Read( VoidPtr buffer , UInt32Ptr size )
読み込み用ストリームを使わずに TCP ソケットからデータを受信します。
SFCError ScheduleAccept( CallbackSPP spp , VoidPtr reference )
Accept をスケジュールします。
SFCError ScheduleBind( CallbackSPP spp , VoidPtr reference )
Bind をスケジュールします。
SFCError ScheduleListen( CallbackSPP spp , VoidPtr reference )
Listen をスケジュールします。
SFCError ScheduleRead( CallbackSPP spp , VoidPtr reference )
読み込み用ストリームを使わない TCP ソケットからのデータ受信をスケジュールします。
SFCError ScheduleWrite( CallbackSPP spp , VoidPtr reference )
書き込み用ストリームを使わない TCP ソケットへのデータ送信をスケジュールします。
SFCError Write( VoidConstPtr buffer , UInt32Ptr size )
書き込み用ストリームを使わずに TCP ソケットにデータを送信します。
CallbackSPP (SFXStorage から継承)
コールバック関数を表す型です。

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

解説

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


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

解説

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

参照

SFXTCPSocket::Close


SFXTCPSocket::Accept
TCP サーバーとの接続を待機します。
[ public, const ]
SFCError Accept(
    SFXTCPSocketPtr result   // TCP ソケットへのポインター
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • 状態が Listen でないとき : SFERR_INVALID_STATE
  • 引数が null のとき、または有効な状態でないとき : SFERR_INVALID_PARAM
  • 操作がブロックされたとき : AEE_NET_WOULDBLOCK
  • その他ネットワークエラーのとき : SFBSocket::GetLastError 関数で得られるエラー値

解説

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

参照

SFXTCPSocket::ScheduleAccept


SFXTCPSocket::AsSFBAStream
内部で管理されている SFBSocket クラスのインスタンスを SFBAStream クラスのインスタンスに変換します。
[ public, virtual, const ]
SFCError AsSFBAStream(
    SFBAStreamSmpPtr result   // 結果の SFBAStream クラスのインスタンスへのポインター
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ソケットが閉じているとき : SFERR_INVALID_STATE
  • 引数が null のとき : SFERR_INVALID_PARAM

参照

SFBSocket | SFBAStream


SFXTCPSocket::AsSFBSource
内部で管理されている SFBSocket クラスのインスタンスを SFBSource クラスのインスタンスに変換します。
[ public, virtual, const ]
SFCError AsSFBSource(
    SFBSourceSmpPtr result   //  結果の SFBSource クラスのインスタンスへのポインター
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ソケットが閉じているとき : SFERR_INVALID_STATE
  • 引数が null のとき : SFERR_INVALID_PARAM
  • 変換に失敗したとき : SFERR_FAILED

解説

SFXTCPSocket::AsSFBSource 関数は内部で SFBSourceUtil クラスのインスタンスを生成し、解放します。

参照

SFBSocket | SFBSource


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

戻り値

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

解説

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

参照

SFXTCPSocket::ScheduleBind


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

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

解説

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

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


SFXTCPSocket::Connect
TCP 接続を開始します。
[ public ]
SFCError Connect(
    SFXSocketAddressConstRef address   // ドメイン ( または IP アドレス ) とポート番号
    CallbackSPP spp                    // コールバック関数
    VoidPtr reference                  // コールバック関数に渡すデータ
);

引数

address

ドメイン ( または IP アドレス ) とポート番号を指定します。ドメインの解決の必要がある場合は SFXTCPSocket クラスが自動的に行います。

spp

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

reference

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

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ソケットが開かれていない、または、既に接続されている (処理中を含む)とき : SFERR_INVALID_STATE
  • ドメイン名がないとき : SFERR_INVALID_STATE
  • SFBNetMgr インスタンスの作成に失敗したとき : SFERR_FAILED
  • メモリ不足のとき : SFERR_NO_MEMORY
  • その他ネットワークエラーのとき : SFBSocket::GetLastError 関数で得られるエラー値

解説

接続が確立されると、登録したコールバック関数に通知されます。

[Caution] 接続時のエラー取得

接続に関するエラーは、戻り値では取得できません。コールバック関数に通知されます。

使用例

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

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

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

    // TCP ソケットをオープンする
    if ((error = _tcp.Open()) == SFERR_NO_ERROR) {
        
        // TCP サーバーに接続する
        if ((error = _tcp.Connect(address,CALLBACK_FUNCTION(OnConnect))) == SFERR_NO_ERROR) {
            ...
        }else {
            // エラーが発生したとき
            _tcp.Close();
        }
    }
	
    if (error != SFERR_NO_ERROR) { 
        // エラーが発生したとき
        // エラー処理
        ...
    }    
}

// 接続の完了が通知されるコールバック関数
CALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {
        ...
    }
}

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

戻り値

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

解説

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

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

参照

SFXInetAddress::LocalInetAddress


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

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • 接続が確立されていないとき : SFERR_INVALID_STATE
  • 引数が null のとき : SFERR_INVALID_PARAM
  • その他ネットワークエラーのとき : SFBSocket::GetLastError 関数で得られるエラー値

解説

[Note] リモートの IP アドレスの変化

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


SFXTCPSocket::GetSFBSocket
内部で管理するソケットを取得します。
[ public, const ]
SFBSocketSmpConstRef GetSFBSocket(Void);

解説

内部で管理するソケット ( SFBSocket 型 ) を取得します。


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

戻り値

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

解説

データ受信用ストリームのバッファ サイズを指定することも可能です。 データ受信用ストリームは、受信するデータのタイプに応じて SFXBinaryStreamReaderSFXAnsiStringStreamReader、または SFXWideStringStreamReader クラスを使い分けます。

使用例

SFXBinaryStreamReader を使ってデータ受信用ストリームを取得します。

// TCP ソケット 通信に必要な SFXTCPSocket クラスのインスタンス _tcp はクラスのメンバ変数として定義する
class NetworkTime {
private:
    SFXTCPSocket _tcp;
    SFXBinaryStreamReader _reader;
public:
    // コールバック関数の宣言
    CALLBACK_DECLARE_SFXTCPSOCKET(OnConnect)
};

// 接続の完了が通知されるコールバック関数
CALLBACK_IMPLEMENT_SFXTCPSOCKET(NetworkTime, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {

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

参照

SFXTCPSocket::GetStreamWriter | SFXBinaryStreamReader | SFXAnsiStringStreamReader | SFXWideStringStreamReader


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

戻り値

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

解説

データ送信用ストリームのバッファ サイズを指定することも可能です。 データ送信用ストリームは、送信するデータのタイプに応じて SFXBinaryStreamWriterSFXAnsiStringStreamWriter、または SFXWideStringStreamWriter クラスを使い分けます。

使用例

SFXBinaryStreamwriter を使ってデータ送信用ストリームを取得します。

// TCP ソケット 通信に必要な SFXTCPSocket クラスのインスタンス _tcp はクラスのメンバ変数として定義する
class NetworkTime {
private:
    SFXTCPSocket _tcp;
    SFXBinaryStreamwriter _writer;
public:
    // コールバック関数の宣言
    CALLBACK_DECLARE_SFXTCPSOCKET(OnConnect)
};
    
// 接続の完了が通知されるコールバック関数
CALLBACK_IMPLEMENT_SFXTCPSOCKET(NetworkTime, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {

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

参照

SFXTCPSocket::GetStreamReader | SFXBinaryStreamWriter | SFXAnsiStringStreamWriter | SFXWideStringStreamWriter


SFXTCPSocket::Listen
TCP 接続の待ち受けを開始します。
[ public ]
SFCError Listen(
    SInt16 backlog = 1   // 待機中の接続の最大数
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • ソケットが閉じているとき、または Bind されていないとき : SFERR_INVALID_STATE
  • 既に Listen もしくは、ScheduleListen されているとき : SFERR_INVALID_STATE
  • 操作がブロックされたとき : AEE_NET_WOULDBLOCK
  • その他ネットワークエラーのとき : SFBSocket::GetLastError 関数で得られるエラー値

解説

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

参照

SFXTCPSocket::ScheduleListen


SFXTCPSocket::Open
TCP ソケットを開きます。
[ public ]
SFCError Open(Void);

戻り値

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

解説

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

使用例

// TCP ソケット 通信に必要な SFXTCPSocket クラスのインスタンス _tcp はクラスのメンバ変数として定義する
class TcpSample {
private:
    SFXTCPSocket _tcp;
public:
    Void Start(Void); 
    CALLBACK_DECLARE_SFXTCPSOCKET(OnConnect)
};

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

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

    // TCP サーバーと接続を初期化する
    if ((error = _tcp.Open()) == SFERR_NO_ERROR) { 
        
        // TCP サーバーに接続する
        if ((error = _tcp.Connect(address,CALLBACK_FUNCTION(OnConnect))) == SFERR_NO_ERROR) { 
            ...
        }else {
            // エラーが発生したとき
            _tcp.Close();
        }
    }
	
    if (error != SFERR_NO_ERROR) {
        // エラーが発生したとき
        // エラー処理
        ...
    }    
}

// 接続の完了が通知されるコールバック関数
CALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {
        ...
    }
}

SFXTCPSocket::Read
読み込み用ストリームを使わずに TCP ソケットからデータを受信します。
[ public, virtual ]
SFCError Read(
    VoidPtr buffer   // 読み込んだデータを格納するバッファ
    UInt32Ptr size   // バッファのサイズ、読み込んだデータのサイズ
);

引数

buffer

読み込んだデータを格納するバッファを指定します。

size

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

戻り値

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

解説

[Note] 注意
SFXTCPSocket::Read 関数が AEE_NET_WOULDBLOCK を返す場合、SFXTCPSocket::ScheduleRead 関数でコールバック関数を登録し、 コールバック関数の中で再度 SFXTCPSocket::Read 関数をスケジュールする必要があります。

使用例

// TCP ソケット 通信に必要な SFXTCPSocket クラスのインスタンス _tcp はクラスのメンバ変数として定義する   
class TcpSample {
private:
    SFXTCPSocket _tcp;
public:
    // コールバック関数の宣言
    CALLBACK_DECLARE_SFXTCPSOCKET(OnWrite)  
    CALLBACK_DECLARE_SFXTCPSOCKET(OnRead)  
};

// データ送信の完了が通知されるコールバック関数
CALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnWrite, error)
{
    UInt32 size;
    static ACharConst data[] = "GET / HTTP/1.0\n\n";
    
    // データを書き込む
    size = sizeof(data) - 1;
    switch (error = _tcp.Write(data, &size)) {
        case SFERR_NO_ERROR:
             // コールバックを登録する
            _tcp.ScheduleRead(CALLBACK_FUNCTION(OnRead));
            break;
        case AEE_NET_WOULDBLOCK:
            // コールバックを登録する
            _tcp.ScheduleWrite(CALLBACK_FUNCTION(OnWrite));
            break;
    }
}

// データ受信の完了が通知されるコールバック関数
CALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnRead, error)
{
    SFXBuffer buffer;
    UInt32 size;

    // データを読み込む
    buffer.SetSize(32);
    size = buffer.GetSize();
    switch (_tcp.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());
                
               // 接続を閉じる
                _tcp.Close();
            }
            else {
                ...
            }
            break;

        case AEE_NET_WOULDBLOCK:
            // コールバックを登録する
            _tcp.ScheduleRead(CALLBACK_FUNCTION(OnRead));
            break;
    }
    return;
}

参照

SFXTCPSocket::ScheduleRead


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

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • 状態が Listen でないとき、またはコールバックが既に登録されているとき : SFERR_INVALID_STATE

解説

SFXTCPSocket::ScheduleAccept 関数は、SFXTCPSocket::Accept 関数を使って TCP サーバーとの接続を待機するコールバック関数を登録するために使います。

SFXTCPSocket::Accept 関数の戻り値が AEE_NET_WOULDBLOCK である場合、SFXTCPSocket::ScheduleAccept 関数でコールバック関数を登録して、再び TCP サーバーとの接続待機を試みます。

参照

SFXTCPSocket::Accept


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

戻り値

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

解説

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

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

参照

SFXTCPSocket::Bind


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

戻り値

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

解説

SFXTCPSocket::ScheduleListen 関数は、SFXTCPSocket::Listen 関数を使って TCP 接続の待ち受け ( Listen ) をするコールバック関数を登録するために使います。

SFXTCPSocket::Listen 関数の戻り値が AEE_NET_WOULDBLOCK である場合、SFXTCPSocket::ScheduleListen 関数でコールバック関数を登録して、再び TCP 接続の待ち受け ( Listen ) を試みます。

参照

SFXTCPSocket::Listen


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

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • 接続が確立されていないとき、またはコールバックが既に登録されているとき : SFERR_INVALID_STATE

解説

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

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

使用例

// TCP ソケット 通信に必要な SFXTCPSocket クラスのインスタンス _tcp はクラスのメンバ変数として定義する   
class TcpSample {
private:
    SFXTCPSocket _tcp;
public:
    // コールバック関数の宣言
    CALLBACK_DECLARE_SFXTCPSOCKET(OnWrite)  
    CALLBACK_DECLARE_SFXTCPSOCKET(OnRead)  
};

//データ送信の完了が通知されるコールバック関数
CALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnWrite, error)
{
    UInt32 size;
    static ACharConst data[] = "GET / HTTP/1.0\n\n";
    
    // データを書き込む
    size = sizeof(data) - 1;
    switch (error = _tcp.Write(data, &size)) {
        case SFERR_NO_ERROR:
             // コールバックを登録する
            _tcp.ScheduleRead(CALLBACK_FUNCTION(OnRead));
            break;
        case AEE_NET_WOULDBLOCK:
            // コールバックを登録する
            _tcp.ScheduleWrite(CALLBACK_FUNCTION(OnWrite));
            break;
    }
}

//データ受信の完了が通知されるコールバック関数
CALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnRead, error)
{
    SFXBuffer buffer;
    UInt32 size;

    // データを読み込む
    buffer.SetSize(32);
    size = buffer.GetSize();
    switch (_tcp.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());
                
                _tcp.Close();  // 接続を閉じる
            }
            else {
                ...
            }
            break;

        case AEE_NET_WOULDBLOCK:
            // コールバックを登録する
            _tcp.ScheduleRead(CALLBACK_FUNCTION(OnRead));
            break;
    }
    return;
}

参照

SFXTCPSocket::Read


SFXTCPSocket::ScheduleWrite
書き込み用ストリームを使わない TCP ソケットへのデータ送信をスケジュールします。
[ public, virtual ]
SFCError ScheduleWrite(
    CallbackSPP spp     // コールバック関数
    VoidPtr reference   // コールバック関数へのポインター
);

戻り値

  • 成功したとき : SFERR_NO_ERROR
  • 接続が確立されていないとき、またはコールバックが既に登録されているとき : SFERR_INVALID_STATE

解説

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

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

使用例

 // TCP ソケット 通信に必要な SFXTCPSocket クラスのインスタンス _tcp はクラスのメンバ変数として定義する   
class TcpSample {
private:
    SFXTCPSocket _tcp;
public:
    // コールバック関数の宣言
    CALLBACK_DECLARE_SFXTCPSOCKET(OnConnect)  
    CALLBACK_DECLARE_SFXTCPSOCKET(OnWrite)  
};

// 接続の完了が通知されるコールバック関数
CALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {
       _tcp.ScheduleWrite(CALLBACK_FUNCTION(OnWrite));
    }
}

//データ送信の完了が通知されるコールバック関数
CALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnWrite, error)
{
    UInt32 size;
    static ACharConst data[] = "GET / HTTP/1.0\n\n";
    
    // データを書き込む
    size = sizeof(data) - 1;
    switch (error = _tcp.Write(data, &size)) {
        case SFERR_NO_ERROR:
            ...
            break;
        case AEE_NET_WOULDBLOCK:
            // コールバックを登録する
            _tcp.ScheduleWrite(CALLBACK_FUNCTION(OnWrite));
            break;
    }
}

参照

SFXTCPSocket::Write


SFXTCPSocket::Write
書き込み用ストリームを使わずに TCP ソケットにデータを送信します。
[ public, virtual ]
SFCError Write(
    VoidConstPtr buffer   // 書き込むデータ
    UInt32Ptr size        // 書き込むデータのサイズ、書き込んだデータのサイズ
);

引数

buffer

書き込むデータです。

size

SFXTCPSocket::Write関数を呼び出すときは、書き込むデータのサイズを指定します。SFXTCPSocket::Write 関数が終了すると、実際に書き込んだデータのサイズが格納されます。

戻り値

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

解説

[Note] 注意
SFXTCPSocket::Write 関数が AEE_NET_WOULDBLOCK を返す場合、SFXTCPSocket::ScheduleWrite 関数でコールバック関数を登録し、 そのコールバック関数の中で再度 SFXTCPSocket::Write 関数をスケジュールする必要があります。

使用例

 // TCP ソケット 通信に必要な SFXTCPSocket クラスのインスタンス _tcp はクラスのメンバ変数として定義する   
class TcpSample {
private:
    SFXTCPSocket _tcp;
public:
    // コールバック関数の宣言
    CALLBACK_DECLARE_SFXTCPSOCKET(OnConnect)  
    CALLBACK_DECLARE_SFXTCPSOCKET(OnWrite)  
};

// 接続の完了が通知されるコールバック関数
CALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnConnect, error)
{
    if (error == SFERR_NO_ERROR) {
        _tcp.ScheduleWrite(CALLBACK_FUNCTION(OnWrite));
    }
}

//データ送信の完了が通知されるコールバック関数
CALLBACK_IMPLEMENT_SFXTCPSOCKET(TcpSample, OnWrite, error)
{
    UInt32 size;
    static ACharConst data[] = "GET / HTTP/1.0\n\n";
    
    // データを書き込む
    size = sizeof(data) - 1;
    switch (error = _tcp.Write(data, &size)) {
        case SFERR_NO_ERROR:
            ...
            break;
        case AEE_NET_WOULDBLOCK:
            // コールバックを登録する
            _tcp.ScheduleWrite(CALLBACK_FUNCTION(OnWrite));
            break;
    }
}

参照

SFXTCPSocket::ScheduleWrite