How can I make the login part in QuickFIX in c++?
I found tons of tutorials and articles on how to do this on c# or java, but nothing on c++.
I have a server (acceptor), and a client (initiator). The username and password of the client are stored in the settings file, and are hardcoded in the server program.
From what I’ve read in the client I set the username and password in fromAdmin() and read and check the in the server in the toAdmin(), but how do I do that?
Here’s what I’ve tried so far:
-
cast the
messageto aFIX44::Logon&object using:FIX44::Logon& logon_message = dynamic_cast<FIX44::Logon&>(message); -
Set the Username and password to the logon object like this:
if(session_settings.has("Username")) { FIX::Username username = session_settings.getString("Username"); logon_message.set(username); } -
And send the message like this:
FIX::Message messageToSend = logon_message; FIX::Session::sendToTarget(messageToSend);
But I get this error on the cast:
cannot dynamic_cast 'message' (of type 'class FIX::Message') to type 'struct FIX44::Logon&' (target is not pointer or reference to complete type)
What I’ve tried I got inspired from http://niki.code-karma.com/2011/01/quickfix-logon-support-for-username-password/comment-page-1/.
I’m still not clear on how to make the client and the server.
Can anyone help me?
Possible mistakes:
I think you have
fromAdmin()/toAdmin()backward.toAdmin()is called on outgoing admin messages,fromAdmin()is called on incoming. For the Initiator, you must set the fields within thetoAdmin()callback. Your Acceptor will check the user/pass infromAdmin().Are you trying to
dynamic_castwithout first checking to see if it was a Logon message? ThetoAdmin()callback handles all admin messages; the message could be a Heartbeat, Logon, Logout, etc. That might explain your cast error.As to what the code should look like, my C++ is rusty, but the basic pattern is this:
From there, I think you can see how you’d write a similar
fromAdmin()where you’d get the fields instead of setting them.The above uses hard-coded user/pass, but you probably want to pull it from the config file. I think your calls to
session_settings.getString(str)are correct for that.(Please forgive any coding errors. I’m much more fluent in the Java/C# versions of the QF engine, though the basic principles are the same.)
I see that your first web reference uses the
FIELD_GET_REFmacro. It may be better thanmessage.getHeader().getField(), but I’m not familiar with it.