Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 [7] 8 9 10 11   вперед  Ctrl      все
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
PPA
Member

Откуда: Караганда -> Липецк
Сообщений: 811
Dima T,

А у вас ZMQ_CLIENT будет на винде?
он ведь XP не поддерживает - это на всегда или временно?
28 окт 16, 17:22    [19834979]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
PPA
Dima T,

А у вас ZMQ_CLIENT будет на винде?
он ведь XP не поддерживает - это на всегда или временно?

Откуда инфа? На XP пока не тестил, но надо будет, без XP оно вообще не надо.
Есть проблемы c компиляцией libzmq.dll в режиме совместимости с XP. Просто не компилируется с ключем /MT. Пока не разбирался, но думаю решаемо.
28 окт 16, 18:49    [19835265]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
Есть там засады. Связанное с IPv6 как понял отключается дефайном ZMQ_HAVE_WINDOWS_TARGET_XP.
Но не все отключается. Они там местами используют WinAPI от Windows Vista+, например SleepConditionVariableCS() это лечить надо переписыванием кода, ConditionVariable есть в С++ 11, попробую заменить на них, может получится.
28 окт 16, 19:30    [19835333]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
Неприятно, но не смертельно. В крайнем случае можно вернуться к DILLER-ROUTER и более старой версии работающей в XP, все равно на верхнем уровне я закладываюсь на возможные потери важных сообщений.

А так да, главная засада опенсорца - игнорирование старых ОС, да и железа тоже. Пытался ставить линукс на не очень старенький ноут с Pentium M, получал ответ "процессор не поддерживает PAE", может путаю, не PAE а что-то похожее, но суть в том что интел конкретно из этого проца убрал то что было и в более ранних мобильных и в десктоп аналогах.
28 окт 16, 19:48    [19835364]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
PPA
Member

Откуда: Караганда -> Липецк
Сообщений: 811
Dima T,

Иногда это по ошибке делается - разработчики сидят на i7 :)
я вот у себя в опенсорс-проекте добавил libtorrent и не знал, что если VC++ 2015 не указан тип оптимизации
она автоматом собирается с SSE2!

и через день после обновления версии получил письмо:

Флай 19969 падает при загрузке, SSE2 команды...
Откатился на 19935.
AMD Duron. 1.2 ГГц. 512 Мб.


а поддержка XP для пользователей пока еще очень актуальна - особенно в отдаленных уголках России.
28 окт 16, 23:08    [19835947]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
PPA
я вот у себя в опенсорс-проекте добавил libtorrent и не знал, что если VC++ 2015 не указан тип оптимизации
она автоматом собирается с SSE2!

Наступал на эти грабли недавно 18816450. Хуже всего что с запретом SSE2 невозможно скомпилировать в 2015.
Пришлось тогда вернуться на MSVC 6. В данном случае можно пожертвовать владельцами антикварного железа.
PPA
а поддержка XP для пользователей пока еще очень актуальна - особенно в отдаленных уголках России.

Кроме того есть еще продвинутые линуксоиды, Wine эмулирует XP, а как там с более поздним WinAPI - большой вопрос.

Попробую поизучать исходники. Из нового кроме сокетов ZMQ_CLIENT еще много чего добавилось, например zmq_atomic_*()
Может несовместимые нововведения не касаются ZMQ_CLIENT, тогда есть шанс просто исключить вызовы WinAPI отсутствующего в XP.
Попробую тупо позаменять несовместимое на MessageBox(). Что получится - напишу.
29 окт 16, 09:39    [19836352]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
Оказалось не все так просто. Переписал. Даже быстрее стало работать. Под XP запускается, но иногда затыкается при больших нагрузках. Тут топик поднял по этому поводу.

Есть еще вторая проблема - не компилируется как static. Надо рантайм VS2015. Думаю решаемо, но сначала надо с зависаниями разобраться.
29 окт 16, 17:18    [19837189]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
Переделал код под XP. Мой тест стал быстрее: 2.4 сек. против 4.3 сек с родным кодом.

Инструкция по правке проекта для MSVC2015:

В свойствах проекта libzmq поменять:
Platform toolset: v140_xp
C/C++ - Preprocessor – Preprocessor definition добавить ZMQ_HAVE_WINDOWS_TARGET_XP;{то что было}

Правки в коде:
+ tcp_address.cpp

строка 248
	if_name_result = if_indextoname(index, buffer);

заменить на
#ifndef ZMQ_HAVE_WINDOWS_TARGET_XP
	if_name_result = if_indextoname(index, buffer);
#endif

+ condition_variable.hpp
Заменить класс condition_variable_t на этот
#ifdef ZMQ_HAVE_WINDOWS_TARGET_XP
#include <condition_variable> 
#include <mutex> 
#endif

    class condition_variable_t
    {
    public:
        inline condition_variable_t ()
        {
#ifndef ZMQ_HAVE_WINDOWS_TARGET_XP
			InitializeConditionVariable (&cv);
#endif
        }

        inline ~condition_variable_t ()
        {

        }

        inline int wait (mutex_t* mutex_, int timeout_ )
        {
#ifndef ZMQ_HAVE_WINDOWS_TARGET_XP
			// Исходный код
			int rc = SleepConditionVariableCS(&cv, mutex_->get_cs(), timeout_);

			if (rc != 0)
			return 0;

			rc = GetLastError();

			if (rc != ERROR_TIMEOUT)
			win_assert(rc);

			errno = EAGAIN;
			return -1;
#else
			std::unique_lock<std::mutex> lck(mtx); // захватываем mtx
			mutex_->unlock(); //  // освобождаем mutex_ 
			int res;
			switch (timeout_) {
			case INFINITE: // -1 ждем без указания времени
				cv.wait(lck); // освобождаем mtx и висим на cv
				break;        // захватываем mtx при выходе из cv.wait()

			case 0: // эмулируем истечение таймаута
				errno = EAGAIN;
				res = -1;
				break;

			default: // Сюда никогда не заходит. Все вызовы с -1 и 0
				if (cv.wait_for(lck, std::chrono::milliseconds(timeout_)) == std::cv_status::timeout) {
					// По истечению таймаута SleepConditionVariableCS() == 0
					errno = EAGAIN;
					res = -1;
				} else {
					res = 0;
				}
			}
			lck.unlock(); // освобождаем mtx
			mutex_->lock(); // захватываем mutex_
			return res;
#endif
		}

        inline void broadcast ()
        {
#ifndef ZMQ_HAVE_WINDOWS_TARGET_XP
			WakeAllConditionVariable(&cv);
#else
			std::unique_lock<std::mutex> lck(mtx);
			cv.notify_all();
#endif
        }

    private:

#ifndef ZMQ_HAVE_WINDOWS_TARGET_XP
		CONDITION_VARIABLE cv;
#else
		std::condition_variable cv;
		std::mutex mtx;
#endif

        //  Disable copy construction and assignment.
        condition_variable_t (const condition_variable_t&);
        void operator = (const condition_variable_t&);
    };

или отдельно прописать каждую замену. Структура такая:
#ifndef ZMQ_HAVE_WINDOWS_TARGET_XP
		родной код
#else
		код для XP (копировать из кода выше)
#endif

Остался вопрос со static сборкой, чтобы рантайм MSVC2015 не ставить.
30 окт 16, 16:28    [19839048]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
Собрал static. Не надо никаких рантаймов. Под XP работает.

Для желающих повторить: скачать исходники, просто распаковать архив в корневую папку (не уверен что вечно будет работать замена файлов исходников) и скомпилировать в VC2015 проект из папки libzmq_VC2015.

Хотел готовую DLL выложить, но сюда не лезет, она 0,5 Мб (0,3 в архиве)

PS Там стандартное ограничение на 64 соединения, т.к. используется select(). Думаю этого достаточно для клиента.

К сообщению приложен файл (libzmq-42-xp.zip - 14Kb) cкачать
30 окт 16, 20:59    [19839464]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Товарищ младший сержант
Member [заблокирован]

Откуда:
Сообщений: 5122
Dima T
Поизучал что реально происходит в inproc - пришел к выводу что не надо никаких указателей для inproc соединений, там и так указатели передаются.
Точнее если сообщение маленькое (5 байт например), то само сообщение, если большое (100 байт пробовал), то указатель, а содержимое сообщения остается в памяти там же где и было. Т.е. ZMQ сама отлично решает как быстрее доставить.

Итого: сообщение можно принимать с TCP соединения и сразу отправлять в inproc очередь на обработку без какого-либо шаманства.
...

Ага, тоже вовсю inproc использую, даже для простых случаев многонитевого приложения: очень удобно и быстро.
31 окт 16, 01:34    [19839931]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Товарищ младший сержант
Member [заблокирован]

Откуда:
Сообщений: 5122
Dima T
Есть там засады. Связанное с IPv6 как понял отключается дефайном ZMQ_HAVE_WINDOWS_TARGET_XP.
Но не все отключается. Они там местами используют WinAPI от Windows Vista+, например SleepConditionVariableCS() это лечить надо переписыванием кода, ConditionVariable есть в С++ 11, попробую заменить на них, может получится.

А я просто не самую новую версию libzmq использую. Ибо поддержка WinXP еще очень важна.
31 окт 16, 01:36    [19839932]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Товарищ младший сержант
Member [заблокирован]

Откуда:
Сообщений: 5122
Dima T
Собрал static. Не надо никаких рантаймов. Под XP работает.

Для желающих повторить: скачать исходники, просто распаковать архив в корневую папку (не уверен что вечно будет работать замена файлов исходников) и скомпилировать в VC2015 проект из папки libzmq_VC2015.

Хотел готовую DLL выложить, но сюда не лезет, она 0,5 Мб (0,3 в архиве)

PS Там стандартное ограничение на 64 соединения, т.к. используется select(). Думаю этого достаточно для клиента.

Ух ты, класс!
Надо на всякий случай перешерстить интерфейсы, для Delphi - биндинга...
31 окт 16, 01:39    [19839934]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
PPA
Member

Откуда: Караганда -> Липецк
Сообщений: 811
Dima T,

А PR в upstream не планируешь послать?
https://github.com/zeromq/libzmq/pulls
31 окт 16, 08:12    [19840054]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
Товарищ младший сержант
Надо на всякий случай перешерстить интерфейсы, для Delphi - биндинга...

Как минимум добавить вызовы zmq_msg_routing_id() и zmq_msg_set_routing_id()

У сокета ZMQ_SERVER другая логика работы (по сравнению с ZMQ_ROUTER), он каждому клиентскому соединению присваивает routing_id (по сути ID соединения) и его надо явно указывать если с нуля генеришь сообщение. В моих примерах этого не видно, т.к. я обратно отправляю исходное сообщение, а там уже изначально стоит routing_id.
Пока не нашел ответа на вопрос: Надо ли на клиенте явно подставлять routing_id? Пока не разбирался, надо будет потестить что происходит при обрыве TCP-соединения и реконнекте.

Еще большой плюс ZMQ_CLIENT-ZMQ_SERVER в том что сообщения не теряются. Например если ZMQ_DEALER установил соединение, затем отправил, затем стартанул ZMQ_ROUTER, то ZMQ_ROUTER ничего не получит, а ZMQ_SERVER - получит. ZMQ_CLIENT блокируется при отправке если сообщение не влазит в буфер отправки, ZMQ_SERVER в таком случае получает ошибку при отправке.

И про 64 соединения уточню: это 64 TCP соединения, можно увеличить, задав нужный FD_SETSIZE перед #include Winsock2.h в файле windows.hpp
#define FD_SETSIZE 1024
#include <winsock2.h>
...


Добавили группу функций zmq_atomic_counter_*() как понимаю это потокобезопасные счетчики. Не знаю нужны ли они в дельфи, а мне не актуально, в С/С++ есть std::atomic<>

В zmq.h есть какие-то zmq_msg_group() и zmq_msg_set_group(), но описаловки по ним никакой не нашел. Может в будущем напишут зачем они.
31 окт 16, 08:14    [19840056]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
PPA
Dima T,

А PR в upstream не планируешь послать?
https://github.com/zeromq/libzmq/pulls

Попробую. С английским у меня все плохо. Читать немного получается, а написать - засада. Поймут ли автоперевод?
Если найдутся желающие написать за меня - я не против. Надо им заслать только то что добавить в код, написано тут 19839048.

Мой проект для МС2015 наверно не стоит туда слать, т.к. делал его лишь бы скомпилировалось. По хорошему сборку под XP впилить отдельным пунктом в имеющийся у них проект. В тюнинге проектов MSVC я не спец.
31 окт 16, 08:31    [19840073]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
PPA
Dima T,

А PR в upstream не планируешь послать?
https://github.com/zeromq/libzmq/pulls

Отправил. Приняли. Можете пользоваться. Проект для сборки.
2 ноя 16, 15:17    [19851379]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
PPA
Member

Откуда: Караганда -> Липецк
Сообщений: 811
[quot Dima T]
PPA
Dima T,
Отправил. Приняли. Можете пользоваться.


Круто. спасибо! на выходных протестирую.
3 ноя 16, 18:28    [19857031]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
чччД
Guest
Dima T
PPA
Dima T,

А PR в upstream не планируешь послать?
https://github.com/zeromq/libzmq/pulls

Отправил. Приняли. Можете пользоваться. Проект для сборки.

А ты czmq - используешь?
22 ноя 16, 00:00    [19918622]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
чччД
А ты czmq - используешь?

Нет, свою обертку написал.
22 ноя 16, 13:20    [19920369]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
чччД
Guest
Dima T
чччД
А ты czmq - используешь?

Нет, свою обертку написал.

Пожалуй, мудрое решение.
Куда быстрее было сделать то, что нужно именно тебе на основе ядра, чем разбираться с тем, что кто-то делал "под себя".
...
Я довольно долго разбирался с функционалом czmq, в итоге в реальных приложениях использую очень малое подмножество методов czmq, думаю, что их можно было достаточно быстро реализовать средствами Delphi.

Ядро (libzmq) обычно собирается без проблем, или с минимальным стуком в бубен, а в совокупности с czmq (и с libsodium) часто уже приходится париться: то под новую версию MS VS что-то не собирается, то что-то исключили из поддержки, то еще что...
Плюс поддерживать согласованный биндинг в актуальном состоянии для двух библиотек напряжней, чем для одной.
22 ноя 16, 23:13    [19923080]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
чччД
Куда быстрее было сделать то, что нужно именно тебе на основе ядра, чем разбираться с тем, что кто-то делал "под себя".

Я так понимаю в czmq кроме самого ZMQ дополнительно собран попутно используемый функционал, который приведен к кроссплатформенному виду. Работа с потоками, файловой системой, временем и т.д. Лично мне было интересно все что связано с многопоточностью, т.к. в виндовсе и линуксе все по разному.
Но сегодня это не актуально, т.к. в С++11 добавили все связанное с многопоточностью.
23 ноя 16, 09:28    [19923609]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
С libsodium тоже не стал разбираться. Не настолько важная инфа у меня чтобы усложнять работу стойким шифрованием.
Сделал самодельный Диффи-Хеллман для обмена ключами (64 бита) и CBC шифрование. Плюс CRC32 в начало сообщения, чтобы данные окончательно перемешались после шифрования.
23 ноя 16, 10:03    [19923688]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
чччД
Guest
Dima T
С libsodium тоже не стал разбираться. Не настолько важная инфа у меня чтобы усложнять работу стойким шифрованием.
Сделал самодельный Диффи-Хеллман для обмена ключами (64 бита) и CBC шифрование. Плюс CRC32 в начало сообщения, чтобы данные окончательно перемешались после шифрования.


Мда... "фантазией они не отличались" - (с). В смысле - все как у меня, почти. :) Плюс я еще подписываю блок с помощью аппаратно-реализованного ECC (с использованием Guardant Sign)
...
Насчет CRC32 в качестве "соли" - не очень хорошо. Ибо значение CRC32 постоянно для неизменного блока данных.
Таким образом, один и тот же блок данных после зашифрования одним и тем же ключом будет выглядеть одинаково, что снижают стойкость криптосистемы.
...
В начале обычно втыкают блок случайных данных.
Например, размером, равным ключу шифрования. Этим блоком шифруют сообщение, а сам блок шифруют сеансовым ключом, сгенерированным по алгоритму Д-Х. Таким образом, зашифрованные данные получаются всегда разными, даже если шифруются одинаковые блоки (даже в случае не-ECB режима шифрования).
...
Впрочем, не госсекреты ведь мы защищаем, а с хакерами боремся.
...
23 ноя 16, 13:53    [19924985]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
Dima T
Member

Откуда:
Сообщений: 13868
чччД
Насчет CRC32 в качестве "соли" - не очень хорошо. Ибо значение CRC32 постоянно для неизменного блока данных.
Таким образом, один и тот же блок данных после зашифрования одним и тем же ключом будет выглядеть одинаково, что снижают стойкость криптосистемы.

Повторений у меня нет, т.к. внутри еще номер сообщения идет (счетчик на стороне отправителя), для ответов используется.
CRC32 удобно, т.к. одновременно и соль и подпись/контрольная сумма для проверки корректности принятого. Считается быстро и места немного занимает.
23 ноя 16, 14:45    [19925302]     Ответить | Цитировать Сообщить модератору
 Re: ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).  [new]
чччД
Guest
Dima T
чччД
Насчет CRC32 в качестве "соли" - не очень хорошо. Ибо значение CRC32 постоянно для неизменного блока данных.
Таким образом, один и тот же блок данных после зашифрования одним и тем же ключом будет выглядеть одинаково, что снижают стойкость криптосистемы.

Повторений у меня нет, т.к. внутри еще номер сообщения идет (счетчик на стороне отправителя), для ответов используется.
CRC32 удобно, т.к. одновременно и соль и подпись/контрольная сумма для проверки корректности принятого. Считается быстро и места немного занимает.

ОК, все зависит от задачи.
К примеру, у меня на основе zmq реализовано общение с сервером защиты. Трафик невелик. В данном случае обеспечение неповторяемости данных в трафике - вещь обязательная, для защиты от табличной эмуляции.
23 ноя 16, 14:51    [19925339]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 [7] 8 9 10 11   вперед  Ctrl      все
Все форумы / Delphi Ответить