SSL ソケット通信を行う方法
SFXSSLSocket クラスを利用して SSL ソケット通信を行います。
// SSL ソケット通信に必要な SFXSSLSocket クラスのインスタンス _socket はクラスのメンバ変数として定義する class MyClass { private: SFXSSLSocket_socket; SFXAnsiStringStreamWriter _writer; // データ送信用ストリーム SFXAnsiStringStreamReader _reader; // データ受信用トリーム public: Void Start(Void); // コールバック関数 CALLBACK_DECLARE_SFXSSLSOCKET(OnConnect) CALLBACK_DECLARE_SFXSSLSOCKET(OnNegotiate) CALLBACK_DECLARE_SFXANSISTRINGSTREAMWRITER(OnFlush) CALLBACK_DECLARE_SFXANSISTRINGSTREAMREADER(OnFetch) }; Void MyClass::Start(Void) { SFCError error; SFXSocketAddress host("www.example.com:995"); // TCP サーバーとの接続を初期化する if ((error = _socket.Open()) == SFERR_NO_ERROR) { // ホスト名は自動的に解決される // TCP サーバーに接続する error = _socket.Connect(host, CALLBACK_FUNCTION(OnConnect)); } if (error != SFERR_NO_ERROR) { // エラーが発生したとき _socket.Close(); } return; } // 接続が確立したときに呼び出されるコールバック関数 CALLBACK_IMPLEMENT_SFXSSLSOCKET(MyClass, OnConnect, error) { if (error == SFERR_NO_ERROR) { // エラーが発生していないとき // ネゴシエートする error = _socket.Negotiate(CALLBACK_FUNCTION(OnNegotiate)); } if (error != SFERR_NO_ERROR) { // エラーが発生したとき _socket.Close(); } return; } // ネゴシエートが完了したときに呼び出されるコールバック関数 CALLBACK_IMPLEMENT_SFXSSLSOCKET(MyClass, OnNegotiate, error) { static AChar sendingMessage[] = "GET / HTTP/1.0\r\n\r\n"; if (error == SFERR_NO_ERROR) { // データ送信用ストリームを取得する ( バッファ サイズは 1024 ) if ((error = _socket.GetStreamWriter(1024, &_writer)) == SFERR_NO_ERROR) { // データを書き込む if ((error = _writer.Write(sendingMessage, lengthof(sendingMessage))) == SFERR_NO_ERROR) { // フラッシュする(実際にデータを送信する) // 送信が完了すると、OnFlush 関数が呼び出される error = _writer.Flush(CALLBACK_FUNCTION(OnFlush)); } if (error != SFERR_NO_ERROR) { // エラーが発生したとき _writer.Release(); } } } if (error != SFERR_NO_ERROR) { // エラーが発生したとき _socket.Close(); } return; } // フラッシュ ( データ送信 ) が完了したときに呼び出されるコールバック関数 CALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMWRITER(MyClass, OnFlush, error) { // 送信が終わったのでデータ送信用ストリームを解放する _writer.Release(); if (error == SFERR_NO_ERROR) { // データ受信用ストリームを取得する ( バッファ サイズは 1024 ) if ((error = _socket.GetStreamReader(1024, &_reader)) == SFERR_NO_ERROR) { // フェッチ(データ受信)する // データ受信が完了すると、OnFetch 関数に通知される if ((error = _reader.Fetch(CALLBACK_FUNCTION(OnFetch))) != SFERR_NO_ERROR) { // エラーが発生したとき _reader.Release(); } } } if (error != SFERR_NO_ERROR) { // エラーが発生したとき _socket.Close(); } return; } // フェッチ(データ受信)が完了したときに呼び出されるコールバック関数 CALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMREADER(MyClass, OnFetch, error) { SFXAnsiString receivedString; if (error == SFERR_NO_ERROR) { // バッファからデータを receivedString 変数に読み込む _reader >> receivedString; // 応答を表示する TRACE("%s", receivedString.GetCString()); } // 受信が終わったのでデータ受信用ストリームを解放する _reader.Release(); // ソケットを閉じる _socket.Close(); return; }
※ 日本ベリサイン社の ssltest7.verisign.co.jp:443 または rollovertest2.verisign.co.jp:443 のサーバーにて SSL 接続テストが利用可能です。