Discussão do artigo "Trabalhando Com Soquetes em MQL, ou como se tornar um provedor de sinal" - página 2

 
Alexey Volchanskiy:
Este é um fórum para programação de rede de baixo nível? )))
O artigo revela novas possibilidades, não faz um teste de seus conhecimentos.

Quem quiser aprender e usar tecnologias cliente-servidor em

- copiadoras
- boletins informativos
- distribuição de sinais
- troca de informações de negociação
ele toma nota e usa.

mas não no seu caso, você está apenas fora do circuito,

portanto, sinta-se à vontade para passar por aqui.

Vou excluir o flud.

 
o_O:
o artigo revela novas possibilidades, não faz um teste de seus conhecimentos.

Quem quiser aprender e usar tecnologias cliente-servidor em

- copiadoras
- boletins informativos
- distribuição de sinais
- troca de informações de negociação
ele toma nota e usa.

mas não no seu caso, você está apenas fora do circuito,

portanto, sinta-se à vontade para passar por aqui.

Flooding será excluído.

muito bem feito, limpo, sem pressa,

o mapeamento dessas estúpidas estruturas de soquete para a base MQL.

é muito claro e claro. aqui https://www.mql5.com/pt/articles/1361.

também sobre o mesmo tópico de soquete, mas talvez muito complicado,

para tarefas simples, a abordagem proposta pelo autor é preferível...

obrigado ao autor, para mim, por exemplo, é muito relevante para o projeto atual, vou usá-lo...

 
Existe alguma possibilidade de fazer o mesmo no mql4 sem usar dlls de terceiros.
 
Dmitry Melnichenko:
Existe alguma maneira de fazer o mesmo no mql4 sem usar dlls de terceiros?

Sim. Todos os códigos fornecidos no artigo são reproduzidos de forma semelhante no mql4, mas você ainda precisa usar uma dll do Windows.

 

Não entendo por que há tanto ceticismo em massa quando uma pessoa compartilha um assunto tão sério. Será que é inveja pelo fato de alguém saber e outra pessoa nem sequer saber do que se trata?

Especialmente porque agora todos têm a oportunidade de entender o assunto.

 
Dmitry Fedoseev:

Não entendo por que há tanto ceticismo em massa quando uma pessoa compartilha um assunto tão sério. Será que é inveja pelo fato de alguém saber e outra pessoa nem sequer saber do que se trata?

Especialmente porque agora todos têm a oportunidade de entender o assunto.

O anúncio não foi escrito completamente. As pessoas não leram o artigo (como de costume, ninguém lê instruções :)), e uma página inteira de flud apareceu. Até que eu expliquei popularmente que é desejável ler o artigo na íntegra antes de revisá-lo.
 

O código do artigo está errado. Você não leva em conta os alinhamentos nas estruturas de forma alguma.

// 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 inserção para obter o alinhamento 4 (o local é impreciso, se não me engano, o compilador pode colocá-lo onde quiser)
  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 inserir para obter o alinhamento 8
}; // sizeof(WSAData) == 408

// Sua estrutura 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 em x64, 4 em x86
  }; // sizeof(WSAData) == 402(x64), 398(x86)
O tamanho de uma estrutura no x64 é um cálculo teórico com base na suposição de que os alinhamentos de ponteiros == 8 (8 é o mais provável. Mas, por exemplo, alignof(double) em estruturas == 4 e fora == 8. É por isso que não tenho 100% de certeza). Mas mesmo que seja 4, o tamanho da estrutura em x64 será 404 em vez de 408. De qualquer forma, você estourou o buffer em WSData tanto em x86 quanto em x64. Antes de escrever um artigo, você deve fazer as medições mais simples de sizeof() e especificar explicitamente a quantidade de bits do sistema para o qual o código foi escrito (já que você duplicou as estruturas do sistema). Não estou falando do endereço inicial não alinhado da estrutura. Não verifiquei o código inteiro, talvez haja problemas com outras estruturas também.

A propósito, se alguém da equipe de MKL vir a mensagem: todos os seus endereços estão desalinhados, por quê? Os processadores modernos são inteligentes o suficiente e todos os modelos serão capazes de ler os dados? Uma pequena taxa na forma de perda de desempenho, mas nada além disso (nada como um travamento).
 

Mas não estou muito certo. Em MQL, o tamanho de WSData será muito maior do que o necessário (lpVendorInfo[] é uma matriz dinâmica com tamanho em torno de 50, não um ponteiro). Portanto, o código deve funcionar corretamente. Mas isso é um acidente, você teve sorte, e não suposições teóricas corretas. A estrutura em si no MKL não é válida; é melhor criar uma matriz de tamanho suficiente e não declarar nada. Se você tivesse escrito:

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

// вместо
char wsaData[]; ArrayResize(wsaData,sizeof(WSAData));
int res=WSAStartup(MAKEWORD(2,2), wsaData);
você teria recebido um erro.
 

sim, em MQL as estruturas são alinhadas https://www.mql5.com/pt/docs/basis/types/classes

A julgar pelo conteúdo do WinSock2.h, a estrutura WSAData está sem o #pragma pack(1), portanto, seu tamanho, como você disse, pode ser maior que µl.

Mas posso dizer que ou algo está errado ou esses dados não eliminam a pilha, mas todo o software mcl com esses soquetes funciona de forma estável e sem perdas por meses sem recarregar o terminal.

Seria bom descobrir tudo até o fim.

 
Basta reescrevê-lo no estilo:
#define  WSA_DATA_SZ   420
...
char wsaData[WSA_DATA_SZ];
int res=WSAStartup(MAKEWORD(2,2), wsaData);
E não se preocupe com o alinhamento ou com o local onde o compilador coloca os bytes extras. De qualquer forma, você não está acessando nenhum campo, então qual é o motivo dessa dor de cabeça de tentar declarar uma estrutura?