Comment créer la partie de connexion dans QuickFIX

Comment puis-je créer la partie de connexion dans QuickFIX en c ++? J’ai trouvé des tonnes de tutoriels et d’articles sur la façon de procéder sur c # ou java, mais rien sur c ++.

J’ai un serveur (accepteur) et un client (initiateur). Le nom d’utilisateur et le mot de passe du client sont stockés dans le fichier de parameters et codés en dur dans le programme du serveur.

D’après ce que j’ai lu dans le client, j’ai défini le nom d’utilisateur et le mot de passe dans fromAdmin() puis lu et vérifié le toAdmin() du serveur dans toAdmin() , mais comment puis-je le faire?

Voici ce que j’ai essayé jusqu’à présent:

  • FIX44::Logon& le message à un object FIX44::Logon& aide de:

     FIX44::Logon& logon_message = dynamic_cast(message); 
  • Définissez le nom d’utilisateur et le mot de passe sur l’object de connexion comme suit:

     if(session_settings.has("Username")) { FIX::Username username = session_settings.getSsortingng("Username"); logon_message.set(username); } 
  • Et envoyez le message comme ceci:

     FIX::Message messageToSend = logon_message; FIX::Session::sendToTarget(messageToSend); 

Mais je reçois cette erreur sur le casting:

 cannot dynamic_cast 'message' (of type 'class FIX::Message') to type 'struct FIX44::Logon&' (target is not pointer or reference to complete type) 

Ce que j’ai essayé m’a inspiré de http://niki.code-karma.com/2011/01/quickfix-logon-support-for-username-password/comment-page-1/ .

Je ne comprends toujours pas comment créer le client et le serveur.

Quelqu’un peut-il m’aider?

Erreurs possibles:

1) Je pense que vous avez fromAdmin() / toAdmin() arrière. Le premier est appelé pour les messages d’administrateur sortants, le second est appelé pour les messages entrants. Pour l’initiateur, vous devez définir les champs dans le rappel toAdmin() . Votre accepteur vérifiera l’utilisateur / transmettra fromAdmin() .

2) Essayez-vous de dynamic_cast sans d’abord vérifier si c’était un message d’ouverture de session? Le rappel toAdmin() gère tous les messages de l’administrateur; le message peut être un battement de cœur, une connexion, une déconnexion, etc. Cela peut expliquer votre erreur de conversion.

En ce qui concerne le code, mon C ++ est rouillé, mais voici le schéma de base:

 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(message); logon_message.setField(FIX::Username("my_username")); logon_message.setField(FIX::Password("my_password")); } } 

À partir de là, je pense que vous pouvez voir comment vous écrivez un fromAdmin() similaire où vous obtiendrez les champs au lieu de les définir.

Ce qui précède utilise un utilisateur / passe codé en dur, mais vous voudrez probablement le extraire du fichier de configuration. Je pense que vos appels à session_settings.getSsortingng(str) sont corrects pour cela.

(Veuillez pardonner toutes les erreurs de codage. Je parle beaucoup plus couramment les versions Java / C # du moteur QF, même si les principes de base sont les mêmes.)

Je constate que votre première référence Web utilise la macro FIELD_GET_REF . C’est peut-être meilleur que message.getHeader().getField() , mais je ne le connais pas bien.

EDIT: J’espère que vous n’avez pas commencé à lire ceci avant d’avoir terminé mes 45 modifications. Je pense que c’est bon maintenant.