Как я могу сделать часть входа в QuickFIX в C ++?
Я нашел тонны учебников и статей о том, как сделать это на 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/.
Мне до сих пор не ясно, как сделать клиент и сервер.
Может кто-нибудь мне помочь?
Возможные ошибки:
1) Я думаю, что у вас есть fromAdmin()
/toAdmin()
в обратном направлении. toAdmin()
вызывается на исходящие сообщения администратора, fromAdmin()
вызывается на входящий. Для Инициатора вы должны установить поля внутри toAdmin()
Перезвоните. Ваш Акцептор проверит пользователя / пройдет 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 правок. Я думаю, что это хорошо сейчас.
Других решений пока нет …