Непонятно почему такой массовый скепсис, когда человек делится такой серьезной темой. Завидно что ли, что кто-то знает, а кто-то даже не понимает, что это?
Тем более, что теперь у всех появилась возможность разобраться в теме.
Непонятно почему такой массовый скепсис, когда человек делится такой серьезной темой. Завидно что ли, что кто-то знает, а кто-то даже не понимает, что это?
Тем более, что теперь у всех появилась возможность разобраться в теме.
анонс был написан не совсем полно. Люди статью не прочитали (как обычно инструкции ж никто не читает :), и появилась целая страница флуда. Пока популярно не объяснил, что статьи перед отзывом желательно читать полностью.
Код в статье ошибочен. Вы совершенно не учитываете выравнивание в структурах.
// x86typedefstruct WSAData
{
ushort wVersion; // 2ushort wHighVersion; // 2char szDescription[256+1]; // 257char szSystemStatus[128+1]; // 129ushort iMaxSockets; // 2ushort iMaxUdpDg; // 2// +2 вставка для получения выравнивание 4 (расположение неточно, если не ошибаюсь, то компилятор может расположить там, где захочет)char *lpVendorInfo; // 4
}; // sizeof(WSAData) == 400// x64typedefstruct WSAData
{
WORD wVersion; // 2
WORD wHighVersion; // 2
WORD iMaxSockets; // 2
WORD iMaxUdpDg; // 2char *lpVendorInfo; // 8 char szDescription[WSADESCRIPTION_LEN+1]; // 257char szSystemStatus[WSASYS_STATUS_LEN+1]; // 129// +6 вставка для получения выравнивание 8
}; // sizeof(WSAData) == 408// Ваша структура на mqlstruct WSAData
{
WORD wVersion; // 2
WORD wHighVersion; // 2char szDescription[WSADESCRIPTION_LEN+1]; // 257char szSystemStatus[WSASYS_STATUS_LEN+1]; // 129ushort iMaxSockets; // 2ushort iMaxUdpDg; // 2char lpVendorInfo[]; // 8 на x64, 4 на x86
}; // sizeof(WSAData) == 402(x64), 398(x86)
Размер структуры в x64 - теоретический расчёт, исходя из предположения, что выравнивания указателя == 8 (скорее всего 8. Но, например, alignof(double) в структурах == 4, а во вне == 8. Поэтому на 100% не уверен). Но даже если 4, то размер структуры в x64 будет равен 404 вместо 408. Вы в любом случае переполняете буфер под WSData как на x86 так и на x64.Перед написанимем статьи, необходимо делать простейшие замеры sizeof() и явно указывать битность системы, под которую написан код (раз вы взялись за дублирование системных структур). Про невыровненность начального адреса структуры я уже молчу. Весь код не проверял, возможно и с другими структурами имеются проблемы.
Кстати, если кто-то из команды МКЛ увидет сообщение: у вас все адреса невыравнены, почему? Современные процессоры достаточно умны, и все модели смогут прочитать данные? Небольшая плата в виде потери производительности, но не более (ничего типа аварийного завершения).
Хотя я не совсем прав. В MQL размер WSData будет много больше необходимого (lpVendorInfo[] динамический массив с размеров около 50, а не указатель). Поэтому код должен работать правильно. Но это случайность, вам повезло, не верны теоретические предположения. Сама структура в МКЛ не валидна, лучше создать массив достаточного размера и ничего не объявлять. Если бы вы написали:
WSADatat wsdata
int res=WSAStartup(MAKEWORD(2,2), &wsadata);
// вместо
char wsaData[]; ArrayResize(wsaData,sizeof(WSAData));
int res=WSAStartup(MAKEWORD(2,2), wsaData);
судя по содержимому WinSock2.h структура WSAData стоит без #pragma pack(1), поэтому её размер как вы сказали может оказаться больше чем мкл.
Но могу сказать, что или что-то не так считает, или эти данные не убивают стек, но весь мкл софт с этими сокетами стабильно и без потерь работает месяцами без перезагрузки терминала.
#define WSA_DATA_SZ 420
...
char wsaData[WSA_DATA_SZ];
int res=WSAStartup(MAKEWORD(2,2), wsaData);
И не париться о том, какое там выравнивание и куда компилятор засунул доп байты. Всё равно не обращаетесь ни к одному полю, так нафига эта головная боль в виде попытки объявить структуру?
Разве это форум по низкоуровневому сетевому программированию? )))
кто хочет учится и использовать клиент-серверные технологии в
- копировщиках
- рассылке новостей
- рассылке сигналов
- обмене торговой информацией
тот берёт на заметку и использует.
но не в вашем случае, вы просто не в теме,
поэтому смело проходите мимо.
флуд буду удалять.
статья раскрывает новые возможности, а не делает тест ваших знаний.
кто хочет учится и использовать клиент-серверные технологии в
- копировщиках
- рассылке новостей
- рассылке сигналов
- обмене торговой информацией
тот берёт на заметку и использует.
но не в вашем случае, вы просто не в теме,
поэтому смело проходите мимо.
флуд буду удалять.
очень хорошо все сделано, аккуратно, без спешки,
отображение этих дурацких сокетных структур на MQL базу
получилось ясным и наглядным. вот тут https://www.mql5.com/ru/articles/1361
тоже примерно на эту же сокетную тему, но, пожалуй, очень громоздко,
для простых задач подход, предложенный автором предпочтительней...
автору спасибо, для меня, к примеру, очень в тему для текущего проекта, буду испльзовать...
а есть возможность сделать тоже самое на mql4 без использования сторонних dll.
да. все коды приведенные в статье воспроизводятся аналогично и в mql4. но виндовую dll все равно придётся использовать.
Непонятно почему такой массовый скепсис, когда человек делится такой серьезной темой. Завидно что ли, что кто-то знает, а кто-то даже не понимает, что это?
Тем более, что теперь у всех появилась возможность разобраться в теме.
Непонятно почему такой массовый скепсис, когда человек делится такой серьезной темой. Завидно что ли, что кто-то знает, а кто-то даже не понимает, что это?
Тем более, что теперь у всех появилась возможность разобраться в теме.
Код в статье ошибочен. Вы совершенно не учитываете выравнивание в структурах.
Размер структуры в x64 - теоретический расчёт, исходя из предположения, что выравнивания указателя == 8 (скорее всего 8. Но, например, alignof(double) в структурах == 4, а во вне == 8. Поэтому на 100% не уверен). Но даже если 4, то размер структуры в x64 будет равен 404 вместо 408. Вы в любом случае переполняете буфер под WSData как на x86 так и на x64.Перед написанимем статьи, необходимо делать простейшие замеры sizeof() и явно указывать битность системы, под которую написан код (раз вы взялись за дублирование системных структур). Про невыровненность начального адреса структуры я уже молчу. Весь код не проверял, возможно и с другими структурами имеются проблемы.Кстати, если кто-то из команды МКЛ увидет сообщение: у вас все адреса невыравнены, почему? Современные процессоры достаточно умны, и все модели смогут прочитать данные? Небольшая плата в виде потери производительности, но не более (ничего типа аварийного завершения).
Хотя я не совсем прав. В MQL размер WSData будет много больше необходимого (lpVendorInfo[] динамический массив с размеров около 50, а не указатель). Поэтому код должен работать правильно. Но это случайность, вам повезло, не верны теоретические предположения. Сама структура в МКЛ не валидна, лучше создать массив достаточного размера и ничего не объявлять. Если бы вы написали:
то получили бы ошибку.да, в MQL структуры идут выровненные https://www.mql5.com/ru/docs/basis/types/classes
судя по содержимому WinSock2.h структура WSAData стоит без #pragma pack(1), поэтому её размер как вы сказали может оказаться больше чем мкл.
Но могу сказать, что или что-то не так считает, или эти данные не убивают стек, но весь мкл софт с этими сокетами стабильно и без потерь работает месяцами без перезагрузки терминала.
Разобраться до конца было бы хорошо.
И не париться о том, какое там выравнивание и куда компилятор засунул доп байты. Всё равно не обращаетесь ни к одному полю, так нафига эта головная боль в виде попытки объявить структуру?