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

Раздел тех.поддержки | Форма обратной связи Тех.поддержка ОАО Московская Биржа: +7 (495) 733-9507, 287-7691
Применение библиотеки mFAST для расшифровки FAST протокола
Новая тема   Ответить на тему
На страницу Пред.  1, 2, 3  След.
 Предыдущая тема :: Следующая тема 
 Автор  Сообщение 
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Ср Янв 04, 2017 19:03 (спустя 7 дней 21 час) Ответить с цитатой Получить постоянный адрес сообщения
Не любите вы доки читать =)) А я все про них говорю =)
Цитата:
Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError

https://msdn.microsoft.com/en-us/library/windows/desktop/ms740120(v=vs.85).aspx 
 
Последний раз редактировалось автором 04.01.2017 19:09, всего редактировалось 1 раз
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Ср Янв 04, 2017 19:21 (спустя 7 дней 21 час) Ответить с цитатой Получить постоянный адрес сообщения
karat писал(а):
Не любите вы доки читать =)) А я все про них говорю =)
Цитата:
Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError

https://msdn.microsoft.com/en-us/library/windows/desktop/ms740120(v=vs.85).aspx 


Изменил вставленный код соответственно Вашему замечанию:
int res = recvfrom(sd, (char*)buf, sizeof(buf), 0, (SOCKADDR *)& Sender, &SenderAddrSize);
if (res == -1)
{
	cout << "\nERROR!!! \nWSAGetLastError() = " << WSAGetLastError() << endl;
	return 1;
}


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

ERROR!!!
WSAGetLastError() = 10022


WSAEINVAL 10022 Invalid argument. Some invalid argument was supplied (for example, specifying an invalid level to thesetsockopt function). In some instances, it also refers to the current state of the socket—for instance, calling accept on a socket that is not listening.

Всё равно в моём случае не ясно, что делать?! Sad
Ощущение, что ОС не воспринимает мою программу, как сетевую, из за внутреннего какого то конфликта. Например происходит какой то "скрытый" конфликт между либами библиотеки mFAST и либой "Ws2_32.lib". Т.к. я уже писал выше, что для вновь созданных exe файлов, использующих сетевые функции, при первичном их запуске всегда появляется стандартное окошко Фаерволла, спрашивающее разрешения на добавление новой проги в список разрешённых программ. В моём случае сейчас это не происходит, т.е. почему то ОС не распознаёт эту тестовую прогу, как сетевую!
Как это обойти и решить эту проблему - НЕ знаю! 
 
Последний раз редактировалось автором 04.01.2017 20:08, всего редактировалось 3 раза
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Ср Янв 04, 2017 20:20 (спустя 7 дней 22 часа) Ответить с цитатой Получить постоянный адрес сообщения
Давайте уже код, будем проверять версию Robin =) хоть ошибку выяснили

По быстрому погуглил. Из за фаерволла тоже может быть этот код ошибки.

Проверьте, дескриптор сокета какое число? не отрицательное ли? 
 
Последний раз редактировалось автором 04.01.2017 20:23, всего редактировалось 3 раза
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Ср Янв 04, 2017 20:33 (спустя 7 дней 23 часа) Ответить с цитатой Получить постоянный адрес сообщения
Имейте только в виду, что в проект обязательно надо ещё добавить файлы:
"templates.cpp",
"templates.h"
ну и файл "templates.inl" должен лежать вместе с ними. В свою очередь эти 3 файла: "templates.cpp", "templates.h", "templates.inl", генерируются утилитой fast_type_gen из библиотеки mFAST для тестового FAST шаблона templates.xml. И всё это в строгом соответствии с инструкцией по библиотеке mFAST. Что бы сгенерировать утилитой fast_type_gen эти 3 файла удобно создать маленький bat файл, лежащий в одной дирректории вместе с файлами "fast_type_gen.exe" и "templates.xml":
fast_type_gen templates.xml



Вот полный код моего файла "Test_decoder.cpp":
/*
Линковка lib библиотек, без них exe файл не построится (не слинкуется), хотя проект и будет компилироваться без ошибок.
Для того, что бы следующие 4 директивы линковки lib библиотек сработали, необходимо:
в меню Project -> name_of_Project 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
или строку без директории содержащей lib файлы слинкованных библиотек boost:
$(LibraryPath);F:\YandexDisk\!\Visual Studio 2015\Projects_C++\mFAST-master\build\lib\Release;
*/

#pragma comment (lib, "mfast_static.lib")
#pragma comment (lib, "mfast_json_static.lib")
#pragma comment (lib, "mfast_coder_static.lib")
#pragma comment (lib, "mfast_xml_parser_static.lib")

#pragma comment (lib, "Ws2_32.lib")
//#pragma comment (lib, "wsock32.lib")

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <mswsock.h>
#include <stdio.h>
#include <stdlib.h>
//#include <assert.h>
#include <iostream>

/*
Для того, что бы следующие 2 директивы #include нормально подключились к проекту необходимо:
в меню 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)
*/

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

#include "templates.h"

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

//int join_ssm_group(int s, UINT32 group, UINT32 source, UINT32 inter) {
int join_ssm_group(SOCKET s, UINT32 group, UINT32 source, UINT32 inter) {
	struct ip_mreq_source imr;
	imr.imr_multiaddr.s_addr = group;
	imr.imr_sourceaddr.s_addr = source;
	imr.imr_interface.s_addr = inter;
	return setsockopt(s, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, (char *)&imr, sizeof(imr));
}

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

	if (argc == 1)
	{ // Заглушка, что бы можно было пошагово запускать программу.
		argc = 4;
		/*
		argv[1] = "239.192.70.11";
		argv[2] = "10.50.129.90";
		argv[3] = "40011";
		*/
		// Другая мультикастовая группа:
		argv[1] = "239.192.70.1";
		argv[2] = "10.50.129.90";
		argv[3] = "40001";
	}

	if (argc<3) {
		printf(" Use: %s <group> <source> <port>\n", argv[0]);
		return 1;
	}

	// Init WinSock
	WSAData data;
	//WSAStartup(MAKEWORD(2, 2), &data);
	if (WSAStartup(MAKEWORD(2, 2), &data))
	{
		printf("WSAStartup error: %d\n", WSAGetLastError());
		return -1;
	}

	//  Make socket 
//	int sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	SOCKET sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (sd == INVALID_SOCKET) {
		cout << "\nsocket failed with error: " << WSAGetLastError() << endl;
		return 1;
	}

	sockaddr_in Sender;
	int SenderAddrSize = sizeof(Sender);

	struct sockaddr_in binda;

	//  Bind it to listen appropriate UDP port
	binda.sin_family = AF_INET;
	binda.sin_port = htons(atoi(argv[3]));
	//binda.sin_addr.s_addr = inet_addr("1.1.5.56");
	//binda.sin_addr.s_addr = inet_addr("0.0.0.0");
	binda.sin_addr.s_addr = htonl(INADDR_ANY);
	bind(sd, (struct sockaddr*)&binda, sizeof(binda));

	// Join to group
	//join_ssm_group(sd, inet_addr(argv[1]), inet_addr(argv[2]), INADDR_ANY);
	if (join_ssm_group(sd, inet_addr(argv[1]), inet_addr(argv[2]), INADDR_ANY) != 0)
	{
		printf("Error: connection via socket failed!");
		return 1;
	}

	char        buf[65536];
	UINT32      seq;

	while (1) {
		int res = recvfrom(sd, (char*)buf, sizeof(buf), 0, (SOCKADDR *)& Sender, &SenderAddrSize);
		if (res == -1)
		{
			cout << "\nERROR!!! \nWSAGetLastError() = " << WSAGetLastError() << endl;
			return 1;
		}
		seq = *(UINT32*)buf;
		printf("%12s:seq=%6d:len=%4d\n", inet_ntoa(Sender.sin_addr), seq, res);

		const char* first = buf + 4; // Тип UINT32 занимает 4 байта и является преамбулой перед FAST сообщением
		const char* last = buf + res;

		try {
			while(first != last)
			{
				mfast::message_cref msg = decoder.decode(first, last);

				if (msg.id() == DefaultIncrementalRefreshMessage::the_id)
				{
					DefaultIncrementalRefreshMessage_cref sample = static_cast<DefaultIncrementalRefreshMessage_cref>(msg);
					print_sample(sample);
				}

			}
		}
		catch (boost::exception& ex) {
			// error handling
		}
	}


	return 0;
}
 
 
Последний раз редактировалось автором 04.01.2017 21:45, всего редактировалось 3 раза
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Ср Янв 04, 2017 20:43 (спустя 7 дней 23 часа) Ответить с цитатой Получить постоянный адрес сообщения
karat писал(а):

Проверьте, дескриптор сокета какое число? не отрицательное ли? 


Проверил. Оператор:
SOCKET sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

присваивает переменной sd дискриптор равный 84. 
 
Последний раз редактировалось автором 04.01.2017 20:44, всего редактировалось 1 раз
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Ср Янв 04, 2017 21:36 (спустя 8 дней) Ответить с цитатой Получить постоянный адрес сообщения
перепроверьте настройки сервера.. на первый взгляд вы адреса перепутали source c ip_group
нет, это я ошибся, прошу прощение 
 
Последний раз редактировалось автором 04.01.2017 21:37, всего редактировалось 1 раз
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Ср Янв 04, 2017 21:45 (спустя 8 дней) Ответить с цитатой Получить постоянный адрес сообщения
Цитата:
binda.sin_addr.s_addr = htonl(INADDR_ANY); 


попробуйте
binda.sin_addr.s_addr = inet_addr(argv[1]);

bind тоже не плохо бы на ошибки сразу проверять.
 
 
Последний раз редактировалось автором 04.01.2017 21:47, всего редактировалось 1 раз
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Ср Янв 04, 2017 21:48 (спустя 8 дней) Ответить с цитатой Получить постоянный адрес сообщения
Удалил в исходнике автоматически вставляемую форумом в 2-х местах странную строку.
 
 
Последний раз редактировалось автором 05.01.2017 14:22, всего редактировалось 2 раза
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Ср Янв 04, 2017 21:54 (спустя 8 дней) Ответить с цитатой Получить постоянный адрес сообщения
karat писал(а):
Цитата:
binda.sin_addr.s_addr = htonl(INADDR_ANY); 


попробуйте
binda.sin_addr.s_addr = inet_addr(argv[1]);

bind тоже не плохо бы на ошибки сразу проверять.
 


Попробовал, к сожалению, не помогло, вот результат:
ERROR!!!
WSAGetLastError() = 10022
 
 
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Ср Янв 04, 2017 21:57 (спустя 8 дней) Ответить с цитатой Получить постоянный адрес сообщения
bind проверьте на результат? не меньше нуля? 
 
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Ср Янв 04, 2017 22:08 (спустя 8 дней) Ответить с цитатой Получить постоянный адрес сообщения
karat писал(а):
bind проверьте на результат? не меньше нуля? 

Не компилируемый код получается:
if ((int)bind(sd, (struct sockaddr*)&binda, sizeof(binda)) < 0)
	{

	}

Т.к. возвращаемое функцией bind(...) значение оказалось не приводимым к целочисленному значению. 
 
Последний раз редактировалось автором 04.01.2017 22:13, всего редактировалось 3 раза
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Ср Янв 04, 2017 23:00 (спустя 8 дней 1 час) Ответить с цитатой Получить постоянный адрес сообщения
функция изначально int возращает.
еще порция доки с примером =))
https://msdn.microsoft.com/en-us/library/ms737550(VS.85).aspx 
 
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Ср Янв 04, 2017 23:48 (спустя 8 дней 2 часа) Ответить с цитатой Получить постоянный адрес сообщения
karat писал(а):
функция изначально int возращает.
еще порция доки с примером =))
https://msdn.microsoft.com/en-us/library/ms737550(VS.85).aspx 


Я согласен с Вами, но вот моя IDE - MSVS 2015, почему то не согласна:
Принтскрин на котором видна отображаемая ошибка в операторе сравнения '!=' по несопоставимости левого и правого операндов
Сам в упор не понял почему, действительно не корректен оператор сравнения. По сути, правы Вы, а по факту - почему то нет. 
 
Последний раз редактировалось автором 04.01.2017 23:50, всего редактировалось 1 раз
karat
Стаж: 1 год 7 месяцев
Сообщений: 137
Чт Янв 05, 2017 08:58 (спустя 8 дней 11 часов) Ответить с цитатой Получить постоянный адрес сообщения
понятно. у вас функция bind скорее всего не от туда подгружается. Берется зачем то из std. (нашел этот ваш binder тут https://gcc.gnu.org/onlinedocs/gcc-5.4.0/libstdc++/api/a01791.html#ga4c3052b337dde285bace96cbb996055c)
Пока нет времени ковыряться.
Я бы убрал строчку
Цитата:
using namespace std; 
зачастую это даже правило дурного тона.

И там где требуется std (если не закомпилится), то приписывал бы std:: (например std::cout, std::endl и тд)

и если вы написали 131 строчку, то 130 не нужна.

вообщем пока ставлю на то, что тут не состыковка началась. 
 
Последний раз редактировалось автором 05.01.2017 09:39, всего редактировалось 7 раз
Physic
Стаж: 1 год 7 месяцев
Сообщений: 41
Чт Янв 05, 2017 14:50 (спустя 8 дней 17 часов) Ответить с цитатой Получить постоянный адрес сообщения
karat писал(а):
понятно. у вас функция bind скорее всего не от туда подгружается. Берется зачем то из std. (нашел этот ваш binder тут https://gcc.gnu.org/onlinedocs/gcc-5.4.0/libstdc++/api/a01791.html#ga4c3052b337dde285bace96cbb996055c)
Пока нет времени ковыряться.
Я бы убрал строчку
Цитата:
using namespace std; 
зачастую это даже правило дурного тона.

И там где требуется std (если не закомпилится), то приписывал бы std:: (например std::cout, std::endl и тд)

и если вы написали 131 строчку, то 130 не нужна.

вообщем пока ставлю на то, что тут не состыковка началась. 

Да, здорово, Karat, спасибо огромное! Всё сделал как Вы и сказали: удалил строку
Цитата:
using namespace std; 
мелкие ошибки подправил. Сразу и функция bind стала именно той, которая и должна была быть. 130-ю строчку естественно удалил, вместо неё вставил код:
if (bind(sd, (struct sockaddr*)&binda, sizeof(binda)) != 0)
{
	std::cout << "\nERROR!!! \nWSAGetLastError() = " << WSAGetLastError() << std::endl;
	return 1;
}

который сразу стал компилируемым.
И теперь при первичном запуске моего вновь слинкованного exe файла, как и должно было быть - возникло окошко фаерволла. Т.е. моя ОС начала распознавать мою прогу как сетевую, соответственно смог и настроить фаерволл для неё. Теперь при запуске этой проги UDP пакеты начали поступать в программу.

Вот только декодировать их с помощью библиотеки mFAST пока не получилось. 
 
Последний раз редактировалось автором 05.01.2017 14:53, всего редактировалось 2 раза
Показать сообщения:   
Новая тема   Ответить на тему
Список разделов форума -> Техническая поддержкаНа страницу Пред.  1, 2, 3  След.
Страница 2 из 3

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