Обсуждение статьи "Работа с сокетами в MQL, или Как стать провайдером сигналов" - страница 2

 
Alexey Volchanskiy:
Разве это форум по низкоуровневому сетевому программированию? ))) 
статья раскрывает новые возможности, а не делает тест ваших знаний.

кто хочет учится и использовать клиент-серверные технологии в

- копировщиках
- рассылке новостей
- рассылке сигналов
- обмене торговой информацией
тот берёт на заметку и использует.

но не в вашем случае, вы просто не в теме,

поэтому смело проходите мимо.

флуд буду удалять.

 
o_O:
статья раскрывает новые возможности, а не делает тест ваших знаний.

кто хочет учится и использовать клиент-серверные технологии в

- копировщиках
- рассылке новостей
- рассылке сигналов
- обмене торговой информацией
тот берёт на заметку и использует.

но не в вашем случае, вы просто не в теме,

поэтому смело проходите мимо.

флуд буду удалять.

очень хорошо все сделано, аккуратно, без спешки,

отображение этих дурацких сокетных структур на MQL базу

получилось ясным и наглядным. вот тут https://www.mql5.com/ru/articles/1361

тоже примерно на эту же сокетную тему, но, пожалуй, очень громоздко,

для простых задач подход, предложенный автором предпочтительней...

автору спасибо, для меня, к примеру, очень в тему для текущего проекта, буду испльзовать...

 
а есть возможность сделать тоже самое на mql4 без использования сторонних dll.
 
Dmitry Melnichenko:
а есть возможность сделать тоже самое на mql4 без использования сторонних dll.

да. все коды приведенные в статье воспроизводятся аналогично и в mql4.  но виндовую dll все равно придётся использовать.

 

Непонятно почему такой массовый скепсис, когда человек делится такой серьезной темой. Завидно что ли, что кто-то знает, а кто-то даже не понимает, что это?

Тем более, что теперь у всех появилась возможность разобраться в теме. 

 
Dmitry Fedoseev:

Непонятно почему такой массовый скепсис, когда человек делится такой серьезной темой. Завидно что ли, что кто-то знает, а кто-то даже не понимает, что это?

Тем более, что теперь у всех появилась возможность разобраться в теме. 

анонс был написан не совсем полно. Люди статью не прочитали (как обычно инструкции ж никто не читает :), и появилась целая страница флуда. Пока популярно не объяснил, что статьи перед отзывом желательно читать полностью.
 

Код в статье ошибочен. Вы совершенно не учитываете выравнивание в структурах.

// x86
typedef struct WSAData
{
  ushort wVersion;             // 2
  ushort  wHighVersion;        // 2
  char szDescription[256+1];   // 257
  char szSystemStatus[128+1];  // 129
  ushort iMaxSockets;          // 2
  ushort iMaxUdpDg;            // 2
                               // +2 вставка для получения выравнивание 4 (расположение неточно, если не ошибаюсь, то компилятор может расположить там, где захочет)
  char  *lpVendorInfo;         // 4
}; // sizeof(WSAData) == 400

// x64
typedef struct WSAData
{
    WORD                    wVersion;                              // 2
    WORD                    wHighVersion;                          // 2
    WORD                    iMaxSockets;                           // 2
    WORD                    iMaxUdpDg;                             // 2
    char                   *lpVendorInfo;                          // 8  
    char                    szDescription[WSADESCRIPTION_LEN+1];   // 257
    char                    szSystemStatus[WSASYS_STATUS_LEN+1];   // 129
                                                                   // +6   вставка для получения выравнивание 8
}; // sizeof(WSAData) == 408

// Ваша структура на mql
struct WSAData
  {
   WORD              wVersion;                              // 2
   WORD              wHighVersion;                          // 2
   char              szDescription[WSADESCRIPTION_LEN+1];   // 257
   char              szSystemStatus[WSASYS_STATUS_LEN+1];   // 129
   ushort            iMaxSockets;                           // 2
   ushort            iMaxUdpDg;                             // 2
   char              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);
то получили бы ошибку.
 

да, в MQL структуры идут выровненные https://www.mql5.com/ru/docs/basis/types/classes

судя по содержимому WinSock2.h структура WSAData стоит без #pragma pack(1), поэтому её размер как вы сказали может оказаться больше чем мкл.

Но могу сказать, что или что-то не так считает, или эти данные не убивают стек, но весь мкл софт с этими сокетами стабильно и без потерь работает месяцами без перезагрузки терминала.

Разобраться до конца было бы хорошо.

 
Просто переписать в стиле:
#define WSA_DATA_SZ   420
...
char wsaData[WSA_DATA_SZ];
int res=WSAStartup(MAKEWORD(2,2), wsaData);
И не париться о том, какое там выравнивание и куда компилятор засунул доп байты. Всё равно не обращаетесь ни к одному полю, так нафига эта головная боль в виде попытки объявить структуру?
Причина обращения: