![]() ![]() ![]()
|
BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework 4.1 |


SFXTCPSocket クラスは、BREW API の ISocket インターフェースをカプセル化し、ハイレベルな TCP ソケット通信機能を提供します。
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; }
| コンストラクタ/デストラクタ |
|---|
|
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 から継承)
コールバック関数を表す型です。
|
[ public, explicit ] SFXTCPSocket(Void);
[ public, virtual ] virtual ~SFXTCPSocket(Void);
デストラクタでは SFXTCPSocket::Close 関数が呼び出されます。
[ public, const ] SFCError Accept( SFXTCPSocketPtr result // TCP ソケットへのポインター );
SFXTCPSocket::Accept 関数の戻り値が AEE_NET_WOULDBLOCK の場合は SFXTCPSocket::ScheduleAccept 関数でコールバック関数を登録し、コールバック関数の中で再度 SFXTCPSocket::Accept 関数を呼び出す必要があります。
[ public, virtual, const ] SFCError AsSFBAStream( SFBAStreamSmpPtr result // 結果の SFBAStream クラスのインスタンスへのポインター );
[ public, virtual, const ] SFCError AsSFBSource( SFBSourceSmpPtr result // 結果の SFBSource クラスのインスタンスへのポインター );
SFXTCPSocket::AsSFBSource 関数は内部で SFBSourceUtil クラスのインスタンスを生成し、解放します。
[ public ] SFCError Bind( SFXSocketAddressConstRef address // IP アドレスとポート番号 );
SFXTCPSocket::Bind 関数の戻り値が AEE_NET_WOULDBLOCK のときは SFXTCPSocket::ScheduleBind 関数でコールバックを登録し、コールバック関数の中で再度 SFXTCPSocket::Bind 関数を呼び出す必要があります。
[ public, virtual ] Void Cancel(Void);
[ public ] Void Close(Void);
TCP ソケット通信をキャンセルし、内部で使っている ISocket インターフェースや INetMgr インターフェースを解放します。
BREW アプリのサスペンド時は、SFXTCPSocket::Close 関数を呼び出してリソースを解放します。
[ public ] SFCError Connect( SFXSocketAddressConstRef address // ドメイン ( または IP アドレス ) とポート番号 CallbackSPP spp // コールバック関数 VoidPtr reference // コールバック関数に渡すデータ );
ドメイン ( または IP アドレス ) とポート番号を指定します。ドメインの解決の必要がある場合は SFXTCPSocket クラスが自動的に行います。
接続確立の通知を受け取るコールバック関数を指定します。
コールバック関数に渡すデータを指定します。
接続が確立されると、登録したコールバック関数に通知されます。
![]() |
接続時のエラー取得 |
|---|---|
接続に関するエラーは、戻り値では取得できません。コールバック関数に通知されます。 | |
// 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) { ... } }
[ public, const ] SFCError GetLocalAddress( SFXSocketAddressPtr result // ローカルの IP アドレスとポート番号の格納先へのポインター );
![]() |
ローカルの IP アドレスの変化 |
|---|---|
TCP ソケット接続の前後で、ローカルの IP アドレスは変化する可能性があります。 | |
[ public, const ] SFCError GetRemoteAddress( SFXSocketAddressPtr result // リモートの IP アドレスとポート番号の格納先へのポインター );
![]() |
リモートの IP アドレスの変化 |
|---|---|
TCP ソケット接続の前後で、リモートの IP アドレスは変化する可能性があります。 | |
[ public, const ] SFBSocketSmpConstRef GetSFBSocket(Void);
内部で管理するソケット ( SFBSocket 型 ) を取得します。
[ public, virtual ] SFCError GetStreamReader( UInt32 size // バッファ サイズ SFXStreamReaderPtr result // データ受信用ストリームへのポインター );
[ public, virtual ] SFCError GetStreamReader( SFXStreamReaderPtr result // データ受信用ストリームへのポインター );
データ受信用ストリームのバッファ サイズを指定することも可能です。 データ受信用ストリームは、受信するデータのタイプに応じて SFXBinaryStreamReader、SFXAnsiStringStreamReader、または 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
[ public, virtual ] SFCError GetStreamWriter( UInt32 size // バッファ サイズ SFXStreamWriterPtr result // データ送信用ストリームへのポインター );
[ public, virtual ] SFCError GetStreamWriter( SFXStreamWriterPtr result // データ送信用ストリームへのポインター );
データ送信用ストリームのバッファ サイズを指定することも可能です。 データ送信用ストリームは、送信するデータのタイプに応じて SFXBinaryStreamWriter、SFXAnsiStringStreamWriter、または 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 関数の戻り値が AEE_NET_WOULDBLOCK の場合は SFXTCPSocket::ScheduleListen 関数でコールバック関数を登録し、コールバック関数の中で再度 SFXTCPSocket::Listen 関数を呼び出す必要があります。
[ public ] SFCError Open(Void);
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) { ... } }
[ public, virtual ] SFCError Read( VoidPtr buffer // 読み込んだデータを格納するバッファ UInt32Ptr size // バッファのサイズ、読み込んだデータのサイズ );
読み込んだデータを格納するバッファを指定します。
SFXTCPSocket::Read 関数の呼び出し時には、バッファのサイズを指定します。SFXTCPSocket::Read 関数が終了すると、読み込んだデータのサイズが格納されています。
![]() |
注意 |
|---|---|
| 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; }
[ public ] SFCError ScheduleAccept( CallbackSPP spp // コールバック関数 VoidPtr reference // コールバック関数へ渡すデータ );
SFXTCPSocket::ScheduleAccept 関数は、SFXTCPSocket::Accept 関数を使って TCP サーバーとの接続を待機するコールバック関数を登録するために使います。
※ SFXTCPSocket::Accept 関数の戻り値が AEE_NET_WOULDBLOCK である場合、SFXTCPSocket::ScheduleAccept 関数でコールバック関数を登録して、再び TCP サーバーとの接続待機を試みます。
[ public ] SFCError ScheduleBind( CallbackSPP spp // コールバック関数 VoidPtr reference // コールバック関数へ渡すデータ );
SFXTCPSocket::ScheduleBind 関数は、SFXTCPSocket::Bind 関数を使って Bind するコールバック関数を登録するために使います。
※ SFXTCPSocket::Bind 関数の戻り値が AEE_NET_WOULDBLOCK である場合、SFXTCPSocket::ScheduleBind 関数でコールバック関数を登録して、再び Bind を試みます。
[ public ] SFCError ScheduleListen( CallbackSPP spp // コールバック関数 VoidPtr reference // コールバック関数へ渡すデータ );
SFXTCPSocket::ScheduleListen 関数は、SFXTCPSocket::Listen 関数を使って TCP 接続の待ち受け ( Listen ) をするコールバック関数を登録するために使います。
※ SFXTCPSocket::Listen 関数の戻り値が AEE_NET_WOULDBLOCK である場合、SFXTCPSocket::ScheduleListen 関数でコールバック関数を登録して、再び TCP 接続の待ち受け ( Listen ) を試みます。
[ public, virtual ] SFCError ScheduleRead( CallbackSPP spp // コールバック関数 VoidPtr reference // コールバック関数に渡すデータ );
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; }
[ public, virtual ] SFCError ScheduleWrite( CallbackSPP spp // コールバック関数 VoidPtr reference // コールバック関数へのポインター );
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; } }
[ public, virtual ] SFCError Write( VoidConstPtr buffer // 書き込むデータ UInt32Ptr size // 書き込むデータのサイズ、書き込んだデータのサイズ );
書き込むデータです。
SFXTCPSocket::Write関数を呼び出すときは、書き込むデータのサイズを指定します。SFXTCPSocket::Write 関数が終了すると、実際に書き込んだデータのサイズが格納されます。
![]() |
注意 |
|---|---|
| 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; } }
|
Copyright (C) 2002 - 2009 Sophia Cradle, Inc. All Rights Reserved. |
![]() ![]() ![]()
|