powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
25 сообщений из 260, страница 7 из 11
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39336536
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

А у вас ZMQ_CLIENT будет на винде?
он ведь XP не поддерживает - это на всегда или временно?
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39336600
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPADima T,

А у вас ZMQ_CLIENT будет на винде?
он ведь XP не поддерживает - это на всегда или временно?
Откуда инфа? На XP пока не тестил, но надо будет, без XP оно вообще не надо.
Есть проблемы c компиляцией libzmq.dll в режиме совместимости с XP. Просто не компилируется с ключем /MT. Пока не разбирался, но думаю решаемо.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39336623
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть там засады. Связанное с IPv6 как понял отключается дефайном ZMQ_HAVE_WINDOWS_TARGET_XP.
Но не все отключается. Они там местами используют WinAPI от Windows Vista+, например SleepConditionVariableCS() это лечить надо переписыванием кода, ConditionVariable есть в С++ 11, попробую заменить на них, может получится.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39336633
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неприятно, но не смертельно. В крайнем случае можно вернуться к DILLER-ROUTER и более старой версии работающей в XP, все равно на верхнем уровне я закладываюсь на возможные потери важных сообщений.

А так да, главная засада опенсорца - игнорирование старых ОС, да и железа тоже. Пытался ставить линукс на не очень старенький ноут с Pentium M, получал ответ "процессор не поддерживает PAE", может путаю, не PAE а что-то похожее, но суть в том что интел конкретно из этого проца убрал то что было и в более ранних мобильных и в десктоп аналогах.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39336709
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

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

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

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


а поддержка XP для пользователей пока еще очень актуальна - особенно в отдаленных уголках России.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39336783
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAя вот у себя в опенсорс-проекте добавил libtorrent и не знал, что если VC++ 2015 не указан тип оптимизации
она автоматом собирается с SSE2!
Наступал на эти грабли недавно 18816450 . Хуже всего что с запретом SSE2 невозможно скомпилировать в 2015.
Пришлось тогда вернуться на MSVC 6. В данном случае можно пожертвовать владельцами антикварного железа.
PPAа поддержка XP для пользователей пока еще очень актуальна - особенно в отдаленных уголках России.
Кроме того есть еще продвинутые линуксоиды, Wine эмулирует XP, а как там с более поздним WinAPI - большой вопрос.

Попробую поизучать исходники. Из нового кроме сокетов ZMQ_CLIENT еще много чего добавилось, например zmq_atomic_*()
Может несовместимые нововведения не касаются ZMQ_CLIENT, тогда есть шанс просто исключить вызовы WinAPI отсутствующего в XP.
Попробую тупо позаменять несовместимое на MessageBox(). Что получится - напишу.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39336964
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказалось не все так просто. Переписал. Даже быстрее стало работать. Под XP запускается, но иногда затыкается при больших нагрузках. Тут топик поднял по этому поводу.

Есть еще вторая проблема - не компилируется как static. Надо рантайм VS2015. Думаю решаемо, но сначала надо с зависаниями разобраться.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39337348
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переделал код под 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
Код: plaintext
1.
	if_name_result = if_indextoname(index, buffer);


заменить на
Код: plaintext
1.
2.
3.
#ifndef ZMQ_HAVE_WINDOWS_TARGET_XP
	if_name_result = if_indextoname(index, buffer);
#endif


condition_variable.hppЗаменить класс condition_variable_t на этот
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
#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&);
    };


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


Остался вопрос со static сборкой, чтобы рантайм MSVC2015 не ставить.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39337418
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собрал static. Не надо никаких рантаймов. Под XP работает.

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

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

PS Там стандартное ограничение на 64 соединения, т.к. используется select(). Думаю этого достаточно для клиента.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39337455
Товарищ младший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПоизучал что реально происходит в inproc - пришел к выводу что не надо никаких указателей для inproc соединений, там и так указатели передаются.
Точнее если сообщение маленькое (5 байт например), то само сообщение, если большое (100 байт пробовал), то указатель, а содержимое сообщения остается в памяти там же где и было. Т.е. ZMQ сама отлично решает как быстрее доставить.

Итого: сообщение можно принимать с TCP соединения и сразу отправлять в inproc очередь на обработку без какого-либо шаманства.
...
Ага, тоже вовсю inproc использую, даже для простых случаев многонитевого приложения: очень удобно и быстро.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39337456
Товарищ младший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсть там засады. Связанное с IPv6 как понял отключается дефайном ZMQ_HAVE_WINDOWS_TARGET_XP.
Но не все отключается. Они там местами используют WinAPI от Windows Vista+, например SleepConditionVariableCS() это лечить надо переписыванием кода, ConditionVariable есть в С++ 11, попробую заменить на них, может получится.
А я просто не самую новую версию libzmq использую. Ибо поддержка WinXP еще очень важна.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39337457
Товарищ младший сержант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСобрал static. Не надо никаких рантаймов. Под XP работает.

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

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

PS Там стандартное ограничение на 64 соединения, т.к. используется select(). Думаю этого достаточно для клиента.
Ух ты, класс!
Надо на всякий случай перешерстить интерфейсы, для Delphi - биндинга...
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39337495
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

А PR в upstream не планируешь послать?
https://github.com/zeromq/libzmq/pulls
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39337496
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищ младший сержантНадо на всякий случай перешерстить интерфейсы, для 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
Код: plaintext
1.
2.
3.
#define FD_SETSIZE 1024
#include <winsock2.h>
...



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

В zmq.h есть какие-то zmq_msg_group() и zmq_msg_set_group(), но описаловки по ним никакой не нашел. Может в будущем напишут зачем они.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39337501
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPADima T,

А PR в upstream не планируешь послать?
https://github.com/zeromq/libzmq/pulls
Попробую. С английским у меня все плохо. Читать немного получается, а написать - засада. Поймут ли автоперевод?
Если найдутся желающие написать за меня - я не против. Надо им заслать только то что добавить в код, написано тут 19839048 .

Мой проект для МС2015 наверно не стоит туда слать, т.к. делал его лишь бы скомпилировалось. По хорошему сборку под XP впилить отдельным пунктом в имеющийся у них проект. В тюнинге проектов MSVC я не спец.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39340046
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPADima T,

А PR в upstream не планируешь послать?
https://github.com/zeromq/libzmq/pulls
Отправил. Приняли. Можете пользоваться. Проект для сборки .
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39341094
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Dima T]PPADima T,
Отправил. Приняли. Можете пользоваться.

Круто. спасибо! на выходных протестирую.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39351519
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TPPADima T,

А PR в upstream не планируешь послать?
https://github.com/zeromq/libzmq/pulls
Отправил. Приняли. Можете пользоваться. Проект для сборки .
А ты czmq - используешь?
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39351805
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДА ты czmq - используешь?
Нет, свою обертку написал.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39352305
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TчччДА ты czmq - используешь?
Нет, свою обертку написал.
Пожалуй, мудрое решение.
Куда быстрее было сделать то, что нужно именно тебе на основе ядра, чем разбираться с тем, что кто-то делал "под себя".
...
Я довольно долго разбирался с функционалом czmq, в итоге в реальных приложениях использую очень малое подмножество методов czmq, думаю, что их можно было достаточно быстро реализовать средствами Delphi.

Ядро (libzmq) обычно собирается без проблем, или с минимальным стуком в бубен, а в совокупности с czmq (и с libsodium) часто уже приходится париться: то под новую версию MS VS что-то не собирается, то что-то исключили из поддержки, то еще что...
Плюс поддерживать согласованный биндинг в актуальном состоянии для двух библиотек напряжней, чем для одной.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39352410
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДКуда быстрее было сделать то, что нужно именно тебе на основе ядра, чем разбираться с тем, что кто-то делал "под себя".
Я так понимаю в czmq кроме самого ZMQ дополнительно собран попутно используемый функционал, который приведен к кроссплатформенному виду. Работа с потоками, файловой системой, временем и т.д. Лично мне было интересно все что связано с многопоточностью, т.к. в виндовсе и линуксе все по разному.
Но сегодня это не актуально, т.к. в С++11 добавили все связанное с многопоточностью.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39352420
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С libsodium тоже не стал разбираться. Не настолько важная инфа у меня чтобы усложнять работу стойким шифрованием.
Сделал самодельный Диффи-Хеллман для обмена ключами (64 бита) и CBC шифрование. Плюс CRC32 в начало сообщения, чтобы данные окончательно перемешались после шифрования.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39352685
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TС libsodium тоже не стал разбираться. Не настолько важная инфа у меня чтобы усложнять работу стойким шифрованием.
Сделал самодельный Диффи-Хеллман для обмена ключами (64 бита) и CBC шифрование. Плюс CRC32 в начало сообщения, чтобы данные окончательно перемешались после шифрования.

Мда... "фантазией они не отличались" - (с). В смысле - все как у меня, почти. :) Плюс я еще подписываю блок с помощью аппаратно-реализованного ECC (с использованием Guardant Sign)
...
Насчет CRC32 в качестве "соли" - не очень хорошо. Ибо значение CRC32 постоянно для неизменного блока данных.
Таким образом, один и тот же блок данных после зашифрования одним и тем же ключом будет выглядеть одинаково, что снижают стойкость криптосистемы.
...
В начале обычно втыкают блок случайных данных.
Например, размером, равным ключу шифрования. Этим блоком шифруют сообщение, а сам блок шифруют сеансовым ключом, сгенерированным по алгоритму Д-Х. Таким образом, зашифрованные данные получаются всегда разными, даже если шифруются одинаковые блоки (даже в случае не-ECB режима шифрования).
...
Впрочем, не госсекреты ведь мы защищаем, а с хакерами боремся.
...
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39352772
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДНасчет CRC32 в качестве "соли" - не очень хорошо. Ибо значение CRC32 постоянно для неизменного блока данных.
Таким образом, один и тот же блок данных после зашифрования одним и тем же ключом будет выглядеть одинаково, что снижают стойкость криптосистемы.
Повторений у меня нет, т.к. внутри еще номер сообщения идет (счетчик на стороне отправителя), для ответов используется.
CRC32 удобно, т.к. одновременно и соль и подпись/контрольная сумма для проверки корректности принятого. Считается быстро и места немного занимает.
...
Рейтинг: 0 / 0
ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
    #39352777
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TчччДНасчет CRC32 в качестве "соли" - не очень хорошо. Ибо значение CRC32 постоянно для неизменного блока данных.
Таким образом, один и тот же блок данных после зашифрования одним и тем же ключом будет выглядеть одинаково, что снижают стойкость криптосистемы.
Повторений у меня нет, т.к. внутри еще номер сообщения идет (счетчик на стороне отправителя), для ответов используется.
CRC32 удобно, т.к. одновременно и соль и подпись/контрольная сумма для проверки корректности принятого. Считается быстро и места немного занимает.
ОК, все зависит от задачи.
К примеру, у меня на основе zmq реализовано общение с сервером защиты. Трафик невелик. В данном случае обеспечение неповторяемости данных в трафике - вещь обязательная, для защиты от табличной эмуляции.
...
Рейтинг: 0 / 0
25 сообщений из 260, страница 7 из 11
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ZeroMQ - сокеты на стероидах, часть 3 (а для чего?).
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]