Diskussion zum Artikel "Arbeiten mit Sockets in MQL, oder Wie man ein Signalprovider wird" - Seite 2

 
Alexey Volchanskiy:
Ist dies ein Forum für Low-Level-Netzwerkprogrammierung? )))
der Artikel zeigt neue Möglichkeiten auf, er ist kein Test für Ihr Wissen.

Wer Client-Server-Technologien erlernen und nutzen will für

- Kopierern
- Newslettern
- Signaldistribution
- Austausch von Handelsinformationen
er nimmt es zur Kenntnis und nutzt es.

aber nicht in deinem fall, du bist einfach nicht auf dem laufenden,

also können Sie gerne vorbeigehen.

Ich werde flud löschen.

 
o_O:
der Artikel zeigt neue Möglichkeiten auf, statt Ihr Wissen zu testen.

Wer Client-Server-Technologien erlernen und nutzen will in

- Kopierern
- Newslettern
- Signalverteilung
- Austausch von Handelsinformationen
er nimmt sie zur Kenntnis und nutzt sie.

aber nicht in deinem fall, du bist einfach nicht auf dem laufenden,

Sie können also gerne vorbeigehen.

Überschwemmung wird gelöscht.

sehr gut gemacht, ordentlich, keine Eile,

diese dummen Socket-Strukturen auf die MQL-Basis abzubilden.

ist sehr klar und deutlich. Hier https://www.mql5.com/de/articles/1361.

auch über das gleiche Socket-Thema, aber vielleicht sehr umständlich,

für einfache Aufgaben ist der vom Autor vorgeschlagene Ansatz vorzuziehen...

danke an den Autor, für mich ist es zum Beispiel sehr relevant für das aktuelle Projekt, ich werde es verwenden...

 
Gibt es eine Möglichkeit, das Gleiche auf mql4 zu tun, ohne Dlls von Drittanbietern zu verwenden?
 
Dmitry Melnichenko:
Gibt es eine Möglichkeit, dasselbe auf mql4 zu tun, ohne Drittanbieter-Dlls zu verwenden.

Ja. Alle in dem Artikel angegebenen Codes werden in mql4 auf ähnliche Weise reproduziert, aber Sie müssen trotzdem eine Windows-DLL verwenden.

 

Ich verstehe nicht, warum es eine solche Massenskepsis gibt, wenn jemand ein so ernstes Thema anspricht. Ist man eifersüchtig, weil der eine es weiß und der andere nicht einmal weiß, was es ist?

Zumal jetzt jeder die Möglichkeit hat, das Thema zu verstehen.

 
Dmitry Fedoseev:

Ich verstehe nicht, warum es eine solche Massenskepsis gibt, wenn jemand ein so ernstes Thema anspricht. Ist es Neid, dass jemand Bescheid weiß und ein anderer nicht einmal weiß, worum es geht?

Zumal jetzt jeder die Möglichkeit hat, das Thema zu verstehen.

Die Ankündigung wurde nicht vollständig geschrieben. Die Leute haben den Artikel nicht gelesen (wie immer, niemand liest Anleitungen :), und eine ganze Seite voller Unfug erschien. Bis ich den Leuten erklärte, dass es wünschenswert ist, den Artikel vollständig zu lesen, bevor man ihn bewertet.
 

Der Code in dem Artikel ist falsch. Sie berücksichtigen die Ausrichtungen in Strukturen überhaupt nicht.

// 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 Einfügung, um Ausrichtung 4 zu erhalten (die Position ist ungenau, wenn ich mich nicht irre, kann der Compiler sie überall platzieren)
  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 einfügen, um die Ausrichtung zu erhalten 8
}; // sizeof(WSAData) == 408

// Ihre mql-Struktur
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 auf x64, 4 auf x86
  }; // sizeof(WSAData) == 402(x64), 398(x86)
Die Größe einer Struktur in x64 ist eine theoretische Berechnung, die auf der Annahme beruht, dass Zeigerausrichtungen == 8 (8 ist am wahrscheinlichsten. Aber zum Beispiel alignof(double) in Strukturen == 4 und außerhalb == 8. Deshalb bin ich mir nicht 100%ig sicher). Aber selbst wenn es 4 ist, wird die Größe der Struktur in x64 404 statt 408 sein. Auf jeden Fall überlaufen Sie den Puffer unter WSData sowohl auf x86 als auch auf x64. Bevor Sie einen Artikel schreiben, sollten Sie die einfachsten sizeof()-Messungen durchführen und explizit die Bitgröße des Systems angeben, für das der Code geschrieben wurde (da Sie sich dazu entschieden haben, Systemstrukturen zu duplizieren). Ich spreche nicht von der vorzeichenlosen Anfangsadresse der Struktur. Ich habe nicht den gesamten Code überprüft, vielleicht gibt es auch bei anderen Strukturen Probleme.

Übrigens, wenn jemand aus dem MKL-Team die Meldung sieht: all your addresses are unaligned, warum? Moderne Prozessoren sind intelligent genug, und alle Modelle werden die Daten lesen können? Eine kleine Gebühr in Form von Leistungseinbußen, aber mehr nicht (nichts wie Abstürze).
 

Ich bin aber nicht ganz richtig. In MQL wird die Größe von WSData viel größer sein als nötig (lpVendorInfo[] ist ein dynamisches Array mit einer Größe von etwa 50, kein Zeiger). Der Code sollte also korrekt funktionieren. Aber das ist ein Zufall, Sie haben Glück, keine korrekten theoretischen Annahmen. Die Struktur selbst ist in MKL nicht gültig, es ist besser, ein Array von ausreichender Größe zu erstellen und nichts zu deklarieren. Wenn Sie geschrieben hätten:

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

// вместо
char wsaData[]; ArrayResize(wsaData,sizeof(WSAData));
int res=WSAStartup(MAKEWORD(2,2), wsaData);
hätten Sie einen Fehler erhalten.
 

ja, in MQL sind Strukturen aneinander ausgerichtet https://www.mql5.com/de/docs/basis/types/classes

Nach dem Inhalt von WinSock2.h zu urteilen, ist die WSAData-Struktur ohne #pragma pack(1), so dass ihre Größe, wie Sie sagten, mehr als µl betragen kann.

Aber ich kann sagen, dass entweder etwas falsch zählt oder diese Daten nicht den Stack töten, aber alle mcl-Software mit diesen Sockeln arbeitet stabil und ohne Verluste seit Monaten ohne Terminal-Neuladen.

Es wäre gut, wenn man es ganz herausfinden könnte.

 
Schreiben Sie es einfach in dem Stil um:
#define  WSA_DATA_SZ   420
...
char wsaData[WSA_DATA_SZ];
int res=WSAStartup(MAKEWORD(2,2), wsaData);
Und machen Sie sich keine Gedanken über die Ausrichtung oder darüber, wo der Compiler die zusätzlichen Bytes einfügt. Sie greifen sowieso nicht auf ein Feld zu, wozu also der Aufwand, eine Struktur zu deklarieren?