5

C ++のQuickFIXでログイン部分を作成するにはどうすればよいですか?これをc#またはjavaで行う方法に関するチュートリアルや記事がたくさん見つかりましたが、c++では何も見つかりませんでした。

サーバー(アクセプター)とクライアント(イニシエーター)があります。クライアントのユーザー名とパスワードは設定ファイルに保存され、サーバープログラムにハードコードされています。

クライアントで読んだものから、ユーザー名とパスワードを設定fromAdmin()し、サーバーでを読んで確認しますがtoAdmin()、どうすればよいですか?

これが私がこれまでに試したことです:

  • message以下を使用して、をFIX44::Logon&オブジェクトにキャストします。

    FIX44::Logon& logon_message = dynamic_cast<FIX44::Logon&>(message);
    
  • 次のように、ユーザー名とパスワードをログオンオブジェクトに設定します。

    if(session_settings.has("Username"))
    {
        FIX::Username username = session_settings.getString("Username");
        logon_message.set(username);
    }
    
  • そして、次のようなメッセージを送信します。

    FIX::Message messageToSend = logon_message;
    FIX::Session::sendToTarget(messageToSend);
    

しかし、キャストでこのエラーが発生します。

cannot dynamic_cast 'message' (of type 'class FIX::Message') to type 'struct FIX44::Logon&' (target is not pointer or reference to complete type)

私が試したことは、http://niki.code-karma.com/2011/01/quickfix-logon-support-for-username-password/comment-page-1/からインスピレーションを得ました。

クライアントとサーバーの作り方がまだよくわかりません。

誰か助けてもらえますか?

4

1 に答える 1

12

考えられる間違い:

1) 私はあなたがfromAdmin()/を持っていると思いますtoAdmin()toAdmin()発信管理メッセージでfromAdmin()呼び出され、着信で呼び出されます。toAdmin()イニシエーターの場合、コールバック内でフィールドを設定する必要があります。Acceptor はユーザー/パスをチェックインしますfromAdmin()

2)dynamic_castログオン メッセージかどうかを最初に確認せずにしようとしていますか? toAdmin()コールバックはすべての管理メッセージを処理します。メッセージは、ハートビート、ログオン、ログアウトなどである可能性があります。キャストエラーを説明している可能性があります。

コードがどのように見えるかについては、私の C++ は錆びていますが、基本的なパターンは次のとおりです。

void YourMessageCracker::toAdmin( FIX::Message& message, const FIX::SessionID& sessionID)
{
    if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType))
    {
        FIX44::Logon& logon_message = dynamic_cast<FIX44::Logon&>(message);
        logon_message.setField(FIX::Username("my_username"));
        logon_message.setField(FIX::Password("my_password"));
    }
}

fromAdmin()そこから、フィールドを設定するのではなく、フィールドを取得する同様の方法を書く方法がわかると思います。

上記はハードコーディングされたユーザー/パスを使用していますが、おそらく構成ファイルから取得する必要があります。あなたの呼び出しはsession_settings.getString(str)それに対して正しいと思います。

(コーディング エラーはご容赦ください。基本原則は同じですが、QF エンジンの Java/C# バージョンの方がはるかに流暢です。)

最初の Web 参照FIELD_GET_REFマクロが使用されているようです。よりも優れているかもしれませmessage.getHeader().getField()んが、私はそれに慣れていません。

編集: 45 回の編集を終えるまで、この記事を読み始めていないことを願っています。今はいいと思います。

于 2012-11-12T21:22:16.660 に答える