Qsi*_*ris 3 c++ login quickfix
如何在c ++中使用QuickFIX创建登录部分?我在c#或java上找到了大量有关如何执行此操作的教程和文章,但c ++上没有.
我有一个服务器(接受者)和一个客户端(发起者).客户端的用户名和密码存储在设置文件中,并在服务器程序中进行硬编码.
从我在客户端阅读的内容中我设置了用户名和密码,fromAdmin()然后阅读并检查服务器中的toAdmin(),但是我该怎么做?
这是我到目前为止所尝试的:
使用以下方法将其message转换为FIX44::Logon&对象:
FIX44::Logon& logon_message = dynamic_cast<FIX44::Logon&>(message);
Run Code Online (Sandbox Code Playgroud)将用户名和密码设置为登录对象,如下所示:
if(session_settings.has("Username"))
{
FIX::Username username = session_settings.getString("Username");
logon_message.set(username);
}
Run Code Online (Sandbox Code Playgroud)并发送这样的消息:
FIX::Message messageToSend = logon_message;
FIX::Session::sendToTarget(messageToSend);
Run Code Online (Sandbox Code Playgroud)但是我在演员表上得到了这个错误:
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/.
我还不清楚如何制作客户端和服务器.
谁能帮我?
可能的错误:
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次编辑之前没有开始阅读.我觉得现在好了.