ПоискПоиск  ПравилаПравила  ПользователиПользователи  ПрофильПрофиль  РегистрацияРегистрация  ВходВход
Форум «Техническая поддержка»
Форум для разработчиков и пользователей программного обеспечения, использующегося на бирже.

Раздел тех.поддержки | Форма обратной связи Тех.поддержка ОАО Московская Биржа: +7 (495) 733-9507, 287-7691
Применение библиотеки mFAST для расшифровки FAST протокола
Новая тема   Ответить на тему
На страницу 1, 2, 3  След.
 Предыдущая тема :: Следующая тема 
 Автор  Сообщение 
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Вт Дек 27, 2016 21:24 Ответить с цитатой Получить постоянный адрес сообщения
Народ, может кто нибудь помочь разобраться, как нужно правильно использовать библиотеку mFAST в качестве готового парсера FAST протокола?
Что то я забуксовал:
1) на данный момент я перевёл всю документацию по библиотеке mFAST на русский;
2) перевёл всю спецификацию по FAST протоколу - файл "FAST Specification 1 x 1.pdf";
3) видимо правильно откомпилировал всю библиотеку mFAST причём одновременно и под Windows 7 (x64) и под Линуксом (Ubuntu 16.04 x64);
4) научился подписываться на рассылку и получать в своей программе UDP пакеты, содержащие FAST сообщения опять же одновременно и в тестовых программках под Windows 7 и в тестовых программках под Линуксом.

Но пока не получается в Windows в своей программе (на MSVS 2015) даже подключить правильно откомпилированную библиотеку mFAST. Вот маленький тестовый пример, в котором я пытаюсь подключить библиотеку mFAST к своей программе и выполнить инициализацию декодера в полном соответствии с инструкцией по библиотеке mFAST. При этом я, предварительно используя утилиту fast_type_gen из библиотеки mFAST, сгенерировал для тестового FAST шаблона templates.xml три файла:
templates.cpp
templates.h
templates.inl
опять же в строгом соответствии с инструкцией библиотеки mFAST.
К своему тестовому примеру в проекте я добавляю сгенерированный исходник "templates.cpp" и в главном cpp файле (mFAST_Test.cpp) проекта-примера не забываю подключить директиву:
#include "templates.h"
При этом весь проект в MSVS 2015 компилируется без ошибок, а слинковать exe файл не получается - вываливаются 39 ошибок линковки:
1>------ Build started: Project: mFAST_Test, Configuration: Release x64 ------
1>mFAST_Test.obj : error LNK2001: unresolved external symbol "public: virtual void __cdecl mfast::integer_field_instruction_base::construct_value(union mfast::value_storage &,class mfast::allocator *)const " (?construct_value@integer_field_instruction_base@mfast@@UEBAXAEATvalue_storage@2@PEAVallocator@2@@Z)
. . .
1>F:\YandexDisk\!\Visual Studio 2015\Projects_C++\mFAST_Test\x64\Release\mFAST_Test.exe : fatal error LNK1120: 38 unresolved externals


Вот исходник главного cpp файла (mFAST_Test.cpp) описанного примера:
#include <iostream>

#include <mfast.h>
#include <mfast/coder/fast_decoder.h>

#include "templates.h"
/*
В меню Project -> name_of_Project Properties... -> в левом вертикальном меню раздел "C/C++" -> подраздел "General" ->
в правой стороне окна, в строке параметре "Additional Include Directories" скопировать строку:
"F:\boost\boost_1_61_0;F:\YandexDisk\!\Visual Studio 2015\Projects_C++\mFAST-master\tinyxml2;F:\YandexDisk\!\Visual Studio 2015\Projects_C++\mFAST-master\src;%(AdditionalIncludeDirectories)"
*/

using namespace std;
using namespace mfast;
using namespace templates;

void print_sample(const templates:: DefaultIncrementalRefreshMessage_cref& ref)
{
	cout << ref.get_MessageType().name() << " : " << ref.get_MessageType().c_str() << "\n";
	if (ref.get_ApplVerID().present())
		cout << ref.get_ApplVerID().name() << " : " << ref.get_ApplVerID().c_str() << "\n";
	cout << ref.get_MsgSeqNum().name() << " : " << ref.get_MsgSeqNum().value() << "\n";

	for (auto entry : ref.get_MDEntries()) {
		cout << entry.get_MDUpdateAction().name() << " : " << entry.get_MDUpdateAction().value();
		// ...
	}

}

int main(int argc, char *argv[])
{
	const mfast::templates_description* descriptions[] = {
		templates::description()  // generated from fast_type_gen
	};

	mfast::fast_decoder decoder;

	// In current implementation, decoder.include() can only be called
	// exactly once per decoder/encoder

	decoder.include(descriptions);

	templates:: DefaultIncrementalRefreshMessage message;

	// message value is assigned somewhere else

	print_sample(message.cref());


	return 0;
}


Могут знающие люди подсказать в чём проблема? 
 
Последний раз редактировалось автором 27.12.2016 21:49, всего редактировалось 7 раз
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Вт Дек 27, 2016 21:46 (спустя 21 минуту) Ответить с цитатой Получить постоянный адрес сообщения
на первый взгляд, проблема в линковке. Нужно при компилировании залинковать еще нужную библиотеку\ки

Цитата:
/*
В меню Project -> name_of_Project Properties... -> в левом вертикальном меню раздел "C/C++" -> подраздел "General" ->
в правой стороне окна, в строке параметре "Additional Include Directories" скопировать строку:
"F:\boost\boost_1_61_0;F:\YandexDisk\!\Visual Studio 2015\Projects_C++\mFAST-master\tinyxml2;F:\YandexDisk\!\Visual Studio 2015\Projects_C++\mFAST-master\src;%(AdditionalIncludeDirectories)"
*/ 

это проделывали?

upd. Это пути для include.

Значит вы не залинковали библиотеки от mFast 
 
Последний раз редактировалось автором 27.12.2016 21:49, всего редактировалось 3 раза
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Вт Дек 27, 2016 21:53 (спустя 28 минут) Ответить с цитатой Получить постоянный адрес сообщения
посмотрел у них в кодах тестовые примеры (https://github.com/objectcomputing/mFAST/tree/master/tests). Там есть сборщик CMakeList
в нем такие библиотеки прописаны, линкуйте их у себя тоже или подобные.
Цитата:
target_link_libraries (mfast_test
mfast_static
mfast_coder_static
mfast_json_static
mfast_xml_parser_static) 
 
 
Последний раз редактировалось автором 27.12.2016 21:58, всего редактировалось 3 раза
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Вт Дек 27, 2016 22:03 (спустя 38 минут) Ответить с цитатой Получить постоянный адрес сообщения
karat писал(а):
на первый взгляд, проблема в линковке. Нужно при компилировании залинковать еще нужную библиотеку\ки

Цитата:
/*
В меню Project -> name_of_Project Properties... -> в левом вертикальном меню раздел "C/C++" -> подраздел "General" ->
в правой стороне окна, в строке параметре "Additional Include Directories" скопировать строку:
"F:\boost\boost_1_61_0;F:\YandexDisk\!\Visual Studio 2015\Projects_C++\mFAST-master\tinyxml2;F:\YandexDisk\!\Visual Studio 2015\Projects_C++\mFAST-master\src;%(AdditionalIncludeDirectories)"
*/ 

это проделывали?
 

Разумеется это я в первую очередь и проделал, и для себя такую шпору в виде комментария написал, что бы потом не забыть. Кстати без этого проект вообще не компилируется - ошибки появляются. А после этих манипуляций хотя бы компиляция проходит без ошибок.

karat писал(а):

Значит вы не залинковали библиотеки от mFast 

Очевидно, что Вы правы, проблема в том, что как это сделать я как раз и не знаю!

Дело в том, что я проводил ещё одну манипуляцию с проектом (сразу скажу безуспешно):
в меню Project -> mFAST_Test Properties... -> раздел VC++ Directories -> в параметре-строке "Library Directories" выставил значение:
$(LibraryPath);F:\YandexDisk\!\Visual Studio 2015\Projects_C++\mFAST-master\build\lib\Release;F:\boost\boost_1_61_0\stage\lib64
 
 
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Вт Дек 27, 2016 22:12 (спустя 47 минут) Ответить с цитатой Получить постоянный адрес сообщения
Не силен в студии.
Примерно такие шаги вы должны проделать. Первые два вы проделали

Цитата:
Typically you need to do 5 things to include a library in your project:

1) Add #include statements necessary files with declarations/interfaces, e.g.:

#include "library.h"
2) Add an include directory for the compiler to look into

-> Configuration Properties/VC++ Directories/Include Directories (click and edit, add a new entry)

3) Add a library directory for *.lib files:

-> project(on top bar)/properties/Configuration Properties/VC++ Directories/Library Directories (click and edit, add a new entry)

4) Link the lib's *.lib files

-> Configuration Properties/Linker/Input/Additional Dependencies (e.g.: library.lib;

5) Place *.dll files either:

-> in the directory you'll be opening your final executable from or into Windows/system32 


http://stackoverflow.com/questions/36785220/adding-a-lib-file-to-a-project-in-visual-studio-2015 
 
vasko
Стаж: 8 лет 10 месяцев
Сообщений: 1275
Вт Дек 27, 2016 22:13 (спустя 48 минут) Ответить с цитатой Получить постоянный адрес сообщения
Physic писал(а):

1) на данный момент я перевёл всю документацию по библиотеке mFAST на русский;

Могут знающие люди подсказать в чём проблема? 


очевидно, что на украинский переводить надо было. 
 
Oleg Vazhnev
Стаж: 7 лет 11 месяцев
Сообщений: 1376
Ср Дек 28, 2016 23:34 (спустя 1 день 2 часа) Ответить с цитатой Получить постоянный адрес сообщения
Недостаточно же просто директории прописать, нужно ещё прописать имена либов, а именно:

mfast_static
mfast

в окошках может оно по другому немного как-то звучит. mfast.lib или что-нибудь такое.
Нужно пойти видимо сюда F:\YandexDisk\!\Visual Studio 2015\Projects_C++\mFAST-master\build и поиском поискать есть ли там файлы *.lib, где располагаются, и их и залинковать. 
 
Последний раз редактировалось автором 28.12.2016 23:37, всего редактировалось 4 раза
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Чт Дек 29, 2016 01:01 (спустя 1 день 3 часа) Ответить с цитатой Получить постоянный адрес сообщения
Oleg Vazhnev писал(а):
Недостаточно же просто директории прописать, нужно ещё прописать имена либов, а именно:

mfast_static
mfast

в окошках может оно по другому немного как-то звучит. mfast.lib или что-нибудь такое.
Нужно пойти видимо сюда F:\YandexDisk\!\Visual Studio 2015\Projects_C++\mFAST-master\build и поиском поискать есть ли там файлы *.lib, где располагаются, и их и залинковать. 

Спасибо большое! Ваша подсказка помогла! Ещё не много продвинулся к цели. 
 
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Чт Дек 29, 2016 01:10 (спустя 1 день 3 часа) Ответить с цитатой Получить постоянный адрес сообщения
Вы если не понимаете совета, лучше переспрашивайте. Потому что я тоже самое вам посоветовал с текстом на английском языке по шагам. Смысл тогда писать. 
 
Последний раз редактировалось автором 29.12.2016 01:11, всего редактировалось 1 раз
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Вт Янв 03, 2017 22:01 (спустя 7 дней) Ответить с цитатой Получить постоянный адрес сообщения
Всех с наступившим Новым Годом!

Приступил к следующему этапу:
объединить 2 примера:
1) пример который подсоединяется к мультикастовой группе и начинает получать UDP пакеты, содержащие данные, закодированные протоколом FAST;
2) пример который пока только инициализирует декодер нужным XML FAST шаблоном.

И сразу столкнулся с новой проблемой:
пример, который просто подключается к мультикастовой группе и начинает получать UDP пакеты является 32-х битным и использует 32-х битную либу:
#pragma comment (lib,"Ws2_32.lib")
Если попытаться преобразовать этот пример к 64-х битному варианту, то библиотека "Ws2_32.lib" попросту перестаёт работать! Конкретно функция:
int res = recvfrom(sd, (char*)buf, sizeof(buf), 0, (SOCKADDR *)& Sender, &SenderAddrSize);
seq = *(UINT32*)buf;
printf("%12s:seq=%6d:len=%4d\n", inet_ntoa(Sender.sin_addr), seq, res);

начинает всегда возвращать -1:
     0.0.0.0:seq=     0:len=  -1
     0.0.0.0:seq=     0:len=  -1
     0.0.0.0:seq=     0:len=  -1
     0.0.0.0:seq=     0:len=  -1
     0.0.0.0:seq=     0:len=  -1


А пример, который подключает библиотеку mFAST, является 64-х битным. Соответственно и объединяющий пример так же должен быть 64-х битным. Да и вообще, вся mFAST библиотека является 64-х битной и не предусмотрена для 32-х битной платформы.

Получается, что теперь надо научиться работать с UDP Multicast на 64-х битной платформе, т.к. весь проект должен работать на 64-х битах! При этом не понятно, как это можно сделать? Погуглил, у Яндекса спросил с разными вариациями поисковых запросов - ответа пока не нашёл. Знающие профи, пожалуйста, помогите! 
 
Последний раз редактировалось автором 03.01.2017 22:02, всего редактировалось 1 раз
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Вт Янв 03, 2017 22:24 (спустя 7 дней) Ответить с цитатой Получить постоянный адрес сообщения
1) как преобразовали либу к 64-битному варианту? вроде как в доке сказано, что она, начиная с windows 7 идет и на 32 и на 64.

2) без всяких изменений библиотека линкуется?

3) когда recvfrom возвращает -1, это что значит (согласно документации)?

предлагаю начать с третьего вопроса. 
 
Последний раз редактировалось автором 03.01.2017 22:26, всего редактировалось 1 раз
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Ср Янв 04, 2017 15:03 (спустя 7 дней 17 часов) Ответить с цитатой Получить постоянный адрес сообщения
karat писал(а):
1) как преобразовали либу к 64-битному варианту? вроде как в доке сказано, что она, начиная с windows 7 идет и на 32 и на 64.

2) без всяких изменений библиотека линкуется?

3) когда recvfrom возвращает -1, это что значит (согласно документации)?

предлагаю начать с третьего вопроса. 

recvfrom возвращает -1, когда происходит какая то ошибка. Какая именно я пока не нашёл.
Зато выяснил, что я ошибочно считал, что библиотека "Ws2_32.lib" не работает в 64-х битном варианте - оказывается работает, просто я в списках Firewall запутался с одинаковыми именами exe файлов, лежащих в разных директориях (для 32-х и для 64-х битных вариантов).

Правда мне от этого не намного легче пока стало, т.к. вскрылся неприятный момент, который я пока не знаю, как преодолеть:
в моей Windows 7 (64х) всегда для вновь созданного exe файла, исходники которого используют какие нибудь сетевые функции и библиотеки, при первичном запуске такого exe файла всплывает стандартное окно Windows Firewall, которое спрашивает добавить ли данный исполняемый файл в список разрешённых. Так вот для моего нового "Test_decoder.exe" при его первичном запуске такое окно Firewall не появляется. Исскуственно пробовал самостоятельно добавлять "Test_decoder.exe" в список разрешённых программ в Фаерволле - не помогло. И вообще, судя по вот этому выводу тестовой программы:
0.0.0.0:seq=     0:len=  -1
0.0.0.0:seq=     0:len=  -1
0.0.0.0:seq=     0:len=  -1
0.0.0.0:seq=     0:len=  -1
0.0.0.0:seq=     0:len=  -1

или ОС или её Фаервол блокируют почему то мою тестовую прогу или попросту не замечают. Пробовал даже полностью временно отключать Фаерволл, что бы его исключить, если в нём проблема - но и это не помогло!
Не понятно, как с этим справиться? 
 
Последний раз редактировалось автором 04.01.2017 15:28, всего редактировалось 1 раз
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Ср Янв 04, 2017 16:41 (спустя 7 дней 19 часов) Ответить с цитатой Получить постоянный адрес сообщения
Physic писал(а):

recvfrom возвращает -1, когда происходит какая то ошибка.  

ну и что говорит дока, как найти какая ошибка?
я бы сконцентрировался именно на этом и отбросил пока фаерволлы и битности =)) 
 
Последний раз редактировалось автором 04.01.2017 16:43, всего редактировалось 1 раз
Robin
Стаж: 2 года
Сообщений: 113
Ср Янв 04, 2017 18:54 (спустя 7 дней 21 час) Ответить с цитатой Получить постоянный адрес сообщения
Почти уверен, что дело в некорректной структуре ip_mreq. А почему вы решили использовать FAST, а не cgate например? 
 
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Ср Янв 04, 2017 18:58 (спустя 7 дней 21 час) Ответить с цитатой Получить постоянный адрес сообщения
karat писал(а):
Physic писал(а):

recvfrom возвращает -1, когда происходит какая то ошибка.  

ну и что говорит дока, как найти какая ошибка?
я бы сконцентрировался именно на этом и отбросил пока фаерволлы и битности =)) 


Добавил в тестовую программу код после вызова функции recvfrom:
int res = recvfrom(sd, (char*)buf, sizeof(buf), 0, (SOCKADDR *)& Sender, &SenderAddrSize);
if (res == -1)
{
	cout << "\nERROR!!! \nerrno: " << errno << endl;
	return 1;
}

Получил результат:
F:\...\Release>Test_decoder 239.192.70.1 10.50.129.90 40001

ERROR!!!
errno: 0


Только не ясно, что это означает?

Robin писал(а):
Почти уверен, что дело в некорректной структуре ip_mreq. А почему вы решили использовать FAST, а не cgate например? 

struct ip_mreq_source imr;

код заполнения этой структуры писался не мной, а другим автором. Но фрагмент этот можно считать проверенным, т.к. более простая тестовая прога с этим фрагментом работала без збоев. Научиться использовать FAST я хочу, т.к. это самый быстрый протокол распространения рыночных данных по фондовому и валютному рынкам. 
 
Последний раз редактировалось автором 04.01.2017 19:09, всего редактировалось 1 раз
Показать сообщения:   
Новая тема   Ответить на тему
Список разделов форума -> Техническая поддержкаНа страницу 1, 2, 3  След.
Страница 1 из 3

Rambler's Top100 Rambler's Top100
Рейтинг@Mail.ru
Copyright © Московская биржа, 2006-2017.
Ваши предложения, замечания и вопросы
по работе форума направляйте на email: