7

QuickFIX と C# を使用して FIX アクセプター (サーバー) を作成しています。クライアント (FIX イニシエーター) がユーザー名とパスワードを使用してログオンできるようにします。ただし、QuickFIX でそれを行う方法がわかりません。

QuickFIX ソース コードにデバッグすることで、次の一連のイベントを発見しました。

  • QuickFIX はSession::verify、ログオンを確認するために呼び出します。
  • Session::verifyは、comp ID やシーケンス番号などのさまざまなチェックを実行し、ある時点で、受信したログオンが有効であると判断します。
  • Session::verify次に、Application::fromAdminログオンなどをカスタマイズするのに自然な場所であると私が想定しているコールバックを呼び出します。
  • ただし、この時点で、ログオンはすでに QuickFIX によって OK であると判断されており、コールバックが戻ると、対応するログオン メッセージがアクセプタによって返されます。

アクセプターで FIX ログオン プロセスをカスタマイズするにはどうすればよいですか? QuickFIX コードを変更することが唯一の選択肢ですか?

4

3 に答える 3

6

FIX 4.3 以降を使用している場合、ログオンメッセージにパスワードタグを含めることができます。以前のバージョンを使用している場合は、カスタム タグにして辞書に追加します。

ハンドラーで、fromAdminパスワードが正しいことを確認します (ルックアップ テーブルまたは他の場所から)。そうでない場合は、例外をスローしRejectLogonます。この例外がスローされない場合、QuickFix はすべてが問題ないと見なし、ユーザーをログオンさせます。

例 (さらに健全性チェックが必要):

public void fromAdmin(Message message, SessionID id)
{
   var logon = message as QuickFix44.Logon;

   if (logon != null)
   {
      string userName = logon.getUserName().getValue();
      string expectedPassword = PasswordsByUser[userName];

      string suppliedPassword = logon.getPassword().getValue();

      if(expectedPassword != suppliedPassword)
          throw new RejectLogon();
   }     
}
于 2010-08-27T09:25:10.927 に答える
1

fromAdmin は、取引相手から FIX エンジンに管理メッセージが送信されたときに通知します。これは、パスワードのチェックなど、ログオン メッセージで追加の検証を行う場合に役立ちます。RejectLogon 例外をスローすると、取引相手が切断されます。

セッション検証では、通常、FIX 開始文字列、SenderCompID、およびターゲット CompID を確認します。この 3 つが問題なければ、セッションが設定されます (QuickFIXJ には、サブコンプ ID 用の他のフィールドもあります)。

セッションがセットアップされた後でも、ログオン プロセスが完了するまで、その特定のセッションのメッセージはアクセプターで受け入れられません。そうしようとすると拒否されます。

そのため、fromAdmin では、着信ログオン メッセージ要求を確認し、ログオン メッセージに含まれる有効なパスワードを確認できます。その接続/セッションに期待できます。

于 2010-08-27T09:24:23.593 に答える
1

RejectLogon QuickFIXException をスローすると、コード全体が中断され、残りのセッションが中断されます (複数ある場合)。私の場合、ログアウト メッセージを作成し、相手方に送り返します。コードは次のようになります。

public void fromAdmin(Message message, SessionID id)
{
   var logon = message as QuickFix44.Logon;

   if (logon != null)
   {
      string userName = logon.getUserName().getValue();
      string expectedPassword = PasswordsByUser[userName];

      string suppliedPassword = logon.getPassword().getValue();

      if(expectedPassword != suppliedPassword)
          {
                Message _logoutmess = new Message();
                _logoutmess.Header.SetField(new MsgType() { Tag = 35, Obj = "5" });
                _logoutmess.SetField(new Text("Invalid credentials"));
                Session.SendToTarget(_logoutmess, id);
          }
   }     
}
于 2017-05-12T05:10:01.040 に答える