簡體   English   中英

quickfixtoAdmin添加用戶名,密碼錯誤

[英]quickfix toAdmin to add username , password error

我已經在這里引用: 由於缺少密碼,QuickFix登錄失敗

而在這里: 如何使登錄部分成為QuickFIX

在toAdmin中添加用戶名和密碼,如下所示:

void Application::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);
        FIX::Username username = std::string("my_username") ;
        logon_message.setField( username ); 
    }
}

這會導致gcc 4.8.2中的編譯器錯誤:

錯誤:無法dynamic_cast消息? (類型為FIX :: Message類)以類型為FIX44 :: Logon& (目標不是指針或對完整類型的引用)

然后我將代碼更改為

    FIX44::Logon* logon_message = (FIX44::Logon*)(&message);
    FIX::Username username = std::string("my_username") ;
    logon_message->setField( username );

這次,編譯器再次出錯:

error: invalid use of incomplete type ??class FIX44::Logon??
logon_message->setField( username );
              ^

我應該修改什么,以便可以在toAdmin函數中正確設置用戶名和密碼? logon_message-> setField(username)怎么了?

編輯:

根據此網頁: https : //sourceforge.net/p/quickfix/mailman/message/26233433/

以下對我有用:

if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType))
{
    message.getHeader().setField(553, "XXXXXXXXX");
    message.getHeader().setField(554, "yyyyyyyyy");
}

你有沒有嘗試過

FIX44::Logon* logon_message = dynamic_cast<FIX44::Logon*>(message);

要么

FIX44::Logon* logon_message = dynamic_cast<FIX44::Logon*>( *(message) );

要么

FIX44::Logon* logon_message = dynamic_cast<FIX44::Logon*>(&message);

我認為這可能是正確取消引用消息的問題。

您無需投放信息。 最終,您最終調用setField,這是基類FIX :: Message可用的功能。

        void FIXSession::toAdmin(FIX::Message& msg, const FIX::SessionID& sid)
        {
            const std::string& field = msg.getHeader().getField(FIX::FIELD::MsgType);

            if (FIX::MsgType_Logon == field)
            {
                FIX::Dictionary dd(m_sessionSettings.get(sid));

                if (dd.has(FixSettingUsername))
                {
                    FIX::Username username = dd.getString(FixSettingUsername);
                    msg.setField(username);
                }
                if (dd.has(FixSettingPassword))
                {
                    FIX::Password password = dd.getString(FixSettingPassword);
                    msg.setField(password);
                }

                if (dd.has(FIX::SEND_RESETSEQNUMFLAG))
                {
                    FIX::ResetSeqNumFlag rsn(dd.getBool(FIX::SEND_RESETSEQNUMFLAG));
                    msg.setField(rsn);
                }
            }
        }

錯誤消息表明您沒有#include "quickfix/fix44/Logon.h"

這就是為什么它認為您使用的是不完整的類型。 您的編譯器現在可能只看到一個前向聲明: class FIX44::Logon; 並且它不知道此類包含哪些方法。

其他答案正確地表明您甚至不需要垂頭喪氣

message.setField(FIX::Username(username));
message.setField(FIX::Password(password));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM