Как жестко закодировать настройки

Как я могу жестко закодировать настройки инициатора и акцептора, чтобы мне не нужен внешний файл настроек?

Это то, что я пробовал до сих пор:

FIX::SessionSettings serverSettings;
FIX::Dictionary serverDictionary;

serverDictionary.setString("BeginString", "FIX.4.4");
serverDictionary.setString("UseDataDictionary", "Y");
serverDictionary.setString("DataDictionary", "../../../spec/FIX.4.4.xml");
serverDictionary.setString("SenderCompID", "SRVR");
serverDictionary.setString("TargetCompID", "CLNT");
serverDictionary.setString("SocketAcceptHost", "localhost");
serverDictionary.setLong("SocketAcceptPort", 2024);

FIX::SessionID serverSessionID;
serverSettings.set(serverSessionID, serverDictionary);

Server server; // Extends FIX::Application

FIX::FileStoreFactory serverStoreFactory("server/fileStore/");
FIX::FileLogFactory serverLogFactory("server/logs/");

FIX::SocketAcceptor acceptor(server, serverStoreFactory, serverSettings, serverLogFactory);

Я думаю, что я на правильном пути, но я получаю эту ошибку: Configuration failed: BeginString must be FIX.4.0 to FIX.4.4 or FIXT.1.1

Есть идеи?

2 ответа

Это не имеет ничего общего со значением "FIX.4.4" setStringопределение, которое есть;

void Dictionary:: setString (const std:: string & key, const std:: string & value)

Он берет эти строки по ссылке, и вы передаете ему временную переменную, которая освобождается к тому времени. setString пытается получить доступ к значению. Поскольку вы не можете изменить определение функции, вам нужно сделать;

std::string key = "current key";
std::string value = "current value";
serverDictionary.setString(key, value);

для всех setString звонки для того, чтобы это работало. Что, по крайней мере для меня, помешало бы мне пойти по этому пути.

После долгой борьбы мне наконец удалось сделать это правильно. Вот функциональный код для жесткого кодирования настроек в акцепторе, также может быть применен в инициаторе:

try {
    FIX::SessionSettings serverSettings;
    FIX::Dictionary serverDictionary;

    serverDictionary.setString("ConnectionType", "acceptor");
    serverDictionary.setString("DataDictionary", "FIX.4.4.xml");
    serverDictionary.setString("StartTime", "00:00:00");
    serverDictionary.setString("EndTime", "00:00:00");
    serverDictionary.setString("SocketAcceptHost", "localhost");
    serverDictionary.setString("SocketAcceptPort", "2024");

    FIX::SessionID serverSessionID("FIX.4.4", "SRVR", "CLNT");
    serverSettings.set(serverSessionID, serverDictionary);

    Server server;
    FIX::FileStoreFactory serverStoreFactory("server/fileStore/");
    FIX::FileLogFactory serverLogFactory("server/logs/");
    FIX::SocketAcceptor acceptor(server, serverStoreFactory, serverSettings, serverLogFactory);
    acceptor.start();
    // do something
    acceptor.stop();

    return 0;
} catch (FIX::ConfigError& e) {
    std::cout << e.what() << std::endl;
    return 1;
}
Другие вопросы по тегам