Discusión sobre el artículo "Trabajando con sockets en MQL, o Cómo convertirse en proveedor de señales" - página 2

 
Alexey Volchanskiy:
¿Es este un foro de programación de redes de bajo nivel? )))
el artículo revela nuevas posibilidades, no hace una prueba de tus conocimientos.

que quiere aprender y utilizar tecnologías cliente-servidor en

- copiadoras
- boletines informativos
- distribución de señales
- intercambio de información comercial
toma nota y lo utiliza.

pero no en tu caso, simplemente estas fuera de onda,

así que siéntete libre de pasar de largo.

borraré flud.

 
o_O:
el artículo revela nuevas posibilidades, no hace una prueba de sus conocimientos.

quien quiera aprender y utilizar tecnologías cliente-servidor en

- copiadoras
- boletines informativos
- distribución de señales
- intercambio de información comercial
toma nota y lo utiliza.

pero no en tu caso, simplemente estas fuera de onda,

así que siéntete libre de pasar de largo.

El flood será borrado.

muy bien hecho, ordenado, sin prisas,

mapear esas estúpidas estructuras de socket a la base de MQL.

es muy claro y claro. aquí https://www.mql5.com/es/articles/1361.

tambien sobre el mismo tema de sockets, pero quizas muy engorroso,

para tareas sencillas es preferible el enfoque propuesto por el autor...

gracias al autor, para mi, por ejemplo, es muy relevante para el proyecto actual, lo usare...

 
¿hay alguna posibilidad de hacer lo mismo en mql4 sin usar dlls de terceros?
 
Dmitry Melnichenko:
¿hay alguna forma de hacer lo mismo en mql4 sin usar dlls de terceros?

sí. todos los códigos dados en el artículo se reproducen de manera similar en mql4. pero usted todavía tiene que utilizar una dll de Windows.

 

No entiendo por qué hay tal escepticismo masivo cuando una persona comparte un tema tan serio. ¿Es envidia que alguien lo sepa y otro ni siquiera se dé cuenta de lo que es?

Sobre todo porque ahora todo el mundo tiene la oportunidad de entender el tema.

 
Dmitry Fedoseev:

No entiendo por qué hay tal escepticismo masivo cuando una persona comparte un tema tan serio. ¿Es envidia que alguien lo sepa y otro ni siquiera se dé cuenta de lo que es?

Sobre todo porque ahora todo el mundo tiene la oportunidad de entender el tema.

El anuncio no se escribió por completo. La gente no leyó el artículo (como siempre, nadie lee las instrucciones :), y apareció una página entera de flud. Hasta que expliqué popularmente que es conveniente leer el artículo completo antes de revisarlo.
 

El código del artículo es incorrecto. No tiene en cuenta en absoluto las alineaciones en las estructuras.

// 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 de inserción para obtener la alineación 4 (la ubicación es inexacta, si no me equivoco, el compilador puede colocarla donde quiera)
  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 insertar para obtener la alineación 8
}; // sizeof(WSAData) == 408

// Su estructura 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 en x64, 4 en x86
  }; // sizeof(WSAData) == 402(x64), 398(x86)
El tamaño de una estructura en x64 es un cálculo teórico basado en la suposición de que las alineaciones de punteros == 8 (8 es lo más probable. Pero, por ejemplo, alignof(double) en estructuras == 4 y fuera == 8. Por eso no estoy 100% seguro). Pero aunque sea 4, el tamaño de la estructura en x64 será 404 en lugar de 408. En cualquier caso, desbordas el buffer bajo WSData tanto en x86 como en x64. Antes de escribir un artículo, deberías hacer las mediciones más sencillas con sizeof() y especificar explícitamente el bitness del sistema para el que está escrito el código (ya que te ha dado por duplicar estructuras del sistema). No me refiero a la dirección inicial no alineada de la estructura. No he comprobado todo el código, quizás también haya problemas con otras estructuras.

Por cierto, si alguien del equipo MKL ve el mensaje: todas tus direcciones están sin alinear, ¿por qué? ¿Los procesadores modernos son suficientemente inteligentes y todos los modelos serán capaces de leer los datos? Un pequeño cargo en forma de pérdida de rendimiento, pero nada más (nada como estrellarse).
 

Sin embargo, no estoy del todo en lo cierto. En MQL, el tamaño de WSData será mucho mayor de lo necesario (lpVendorInfo[] es una matriz dinámica con tamaño alrededor de 50, no un puntero). Así que el código debería funcionar correctamente. Pero esto es un accidente, tienes suerte, no supuestos teóricos correctos. La propia estructura en MKL no es válida, es mejor crear un array de tamaño suficiente y no declarar nada. Si hubieras escrito:

WSADatat wsdata
int res=WSAStartup(MAKEWORD(2,2), &wsadata);

// вместо
char wsaData[]; ArrayResize(wsaData,sizeof(WSAData));
int res=WSAStartup(MAKEWORD(2,2), wsaData);
habrías obtenido un error.
 

sí, en MQL las estructuras están alineadas https://www.mql5.com/es/docs/basis/types/classes

a juzgar por el contenido de WinSock2.h la estructura WSAData está sin #pragma pack(1), por lo que su tamaño como dices puede ser superior a µl.

Pero puedo decir que o algo cuenta mal o estos datos no matan la pila, pero todo el software mcl con estos sockets funciona estable y sin perdidas durante meses sin recarga de terminal.

Averiguarlo hasta el final estaría bien.

 
Simplemente reescríbelo en el estilo:
#define  WSA_DATA_SZ   420
...
char wsaData[WSA_DATA_SZ];
int res=WSAStartup(MAKEWORD(2,2), wsaData);
Y no te preocupes por la alineación o por dónde pone el compilador los bytes extra. De todas formas no estás accediendo a ningún campo, así que ¿para qué este dolor de cabeza de intentar declarar una estructura?