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()回调处理所有管理消息;该消息可能是 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"));
    }
}

从那里,我认为您可以看到如何编写类似fromAdmin()的方法来获取字段而不是设置字段。

以上使用硬编码的用户/密码,但您可能想从配置文件中提取它。我认为你的呼吁session_settings.getString(str)是正确的。

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

我看到您的第一个网络参考使用了FIELD_GET_REF宏。它可能比 好message.getHeader().getField(),但我不熟悉它。

编辑:我希望你在我完成 45 次编辑之前不要开始阅读这篇文章。我觉得现在很好。

于 2012-11-12T21:22:16.660 回答