如何在QuickFIX中创建登录部分

Qsi*_*ris 3 c++ login quickfix

如何在c ++中使用QuickFIX创建登录部分?我在c#或java上找到了大量有关如何执行此操作的教程和文章,但c ++上没有.

我有一个服务器(接受者)和一个客户端(发起者).客户端的用户名和密码存储在设置文件中,并在服务器程序中进行硬编码.

从我在客户端阅读的内容中我设置了用户名和密码,fromAdmin()然后阅读并检查服务器中的toAdmin(),但是我该怎么做?

这是我到目前为止所尝试的:

但是我在演员表上得到了这个错误:

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

我试过的是http://niki.code-karma.com/2011/01/quickfix-logon-support-for-username-password/comment-page-1/.

我还不清楚如何制作客户端和服务器.

谁能帮我?

Gra*_*ier 7

可能的错误:

1)我认为你有fromAdmin()/ toAdmin()落后. toAdmin()在传出的管理消息fromAdmin()上调用,在传入时调用.对于Initiator,您必须在toAdmin()回调中设置字段.您的Acceptor将检查用户/传入fromAdmin().

2)你是否在dynamic_cast没有先检查它是否是登录消息的情况下尝试?该toAdmin()回调处理所有的管理信息; 消息可以是Heartbeat,Logon,Logout等.这可能解释您的强制转换错误.

至于代码应该是什么样子,我的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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

从那里,我想你可以看到你如何写一个类似的fromAdmin()地方你得到的字段而不是设置它们.

以上使用硬编码的用户/传递,但您可能希望从配置文件中提取它.我认为你的电话session_settings.getString(str)是正确的.

(请原谅任何编码错误.虽然基本原理相同,但我对QF引擎的Java/C#版本更加流利.)

我看到您的第一个Web引用使用FIELD_GET_REF宏.它可能比message.getHeader().getField()我好,但我不熟悉它.

编辑:我希望你在我完成45次编辑之前没有开始阅读.我觉得现在好了.