記事"MQLのソケットの使用およびシグナルプロバイダになる方法"についてのディスカッション - ページ 2

 
Alexey Volchanskiy:
ここは低レベルのネットワーク・プログラミングのためのフォーラムですか?)))
この記事は新しい可能性を示すものであって、あなたの知識を試すものではありません。

クライアント・サーバー・テクノロジーを次のような分野で学び、使いたいと考えている人。

- コピー機
- ニュースレター
- シグナル配信
- 取引情報の交換
彼はそれをメモして使う。

しかし、あなたの場合はそうではない、

ということで、遠慮なくスルーしてください。

フラッドは削除します。

 
o_O:
この記事は、あなたの知識を試すものではなく、新たな可能性を明らかにするものです。

クライアント・サーバー・テクノロジーを次のような分野で学び、使いたいと考えている人は、この記事を参考にしてほしい。

- コピー機
- ニュースレター
- シグナル配信
- 取引情報の交換
彼はメモを取り、それを使う。

しかし、あなたの場合はそうではない、

だから、遠慮なく通り過ぎてください。

洪水は削除されます。

よくできている、

あの馬鹿馬鹿しいソケット構造体をMQLベースにマッピングするのは、非常に明快でわかりやすい。

https://www.mql5.com/ja/articles/1361。

も同じソケットのトピックだが、非常に面倒かもしれない、

単純な作業であれば、著者の提案するアプローチの方が望ましいのだが...。

著者に感謝します。 私にとっては、例えば、現在のプロジェクトに とても関係があるので、使わせてもらいます。

 
サードパーティのDLLを使わずにmql4で同じことができる可能性はありますか?
 
Dmitry Melnichenko:
サードパーティのDLLを使わずにmql4で同じことをする方法はありますか?

はい。記事にあるコードはすべてmql4でも同じように再現できます。

 

なぜ、このような深刻なトピックを共有する人がいると、これほどまでに懐疑的な意見が多いのか理解できない。誰かが知っていて、他の誰かがそれが何なのか気づいていないことに嫉妬しているのだろうか?

特に今は、誰もがそのトピックを理解する機会があるのだから。

 
Dmitry Fedoseev:

なぜ、このような深刻なトピックを共有する人がいると、これほどまでに懐疑的な意見が多いのか理解できない。誰かが知っていて、他の誰かがそれが何なのか気づいていないことに嫉妬しているのだろうか?

今は誰もがこの話題を理解する機会があるのだからなおさらだ。

発表は完全に書かれたものではなかった。人々は記事を読まず(いつものことだが、誰も説明書を読まない:)、1ページまるまるフラッドが出現した。私が、レビューする前に記事の全文を読むことが望ましいと一般的に説明するまでは。
 

記事のコードは間違っている。構造体のアライメントをまったく考慮していない。

// 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
                               // アライメント4を取得するために挿入を+2する。
  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[];                        // x64で8、x86で4
  }; // sizeof(WSAData) == 402(x64), 398(x86)
x64における構造体のサイズは、ポインタのアラインメント==8という仮定に基づく理論計算である(8が最も可能性が高い。しかし、例えば、構造体内のalignof(double)は==4、外部は==8です。だから100%確実ではない)。しかし、仮に4であったとしても、x64での構造体のサイズは408ではなく404になります。いずれにせよ、x86でもx64でもWSDataのバッファはオーバーフローします。 記事を書く前に、最も簡単なsizeof()の計測を行い、コードが書かれているシステムのビット数を明示的に指定すべきです(システムの構造体を複製しているのですから)。私は構造体のアラインされていない初期アドレスについて話しているのではありません。コード全体をチェックしたわけではないので、もしかしたら他の構造体にも問題があるかもしれません。

ところで、もしMKLチームの誰かが「あなたのアドレスはすべてアンアラインドです」というメッセージを見たら、なぜでしょうか?最近のプロセッサは十分に賢いので、すべてのモデルがデータを読み取ることができます。性能低下という形で少額の費用が発生しますが、それ以上のことはありません(クラッシュするようなことはありません)。
 

しかし、私は正しくありません。MQLでは、WSDataのサイズは必要以上に大きくなります(lpVendorInfo[]はポインタではなく、サイズが50前後の動的配列 です)。そのため、コードは正しく動作するはずです。しかし、これは偶然であり、幸運なことであって、正しい理論的仮定ではない。MKLの構造体そのものは有効ではありません。十分なサイズの配列を作成し、何も宣言しない方がよいでしょう。もし

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/ja/docs/basis/types/classes

WinSock2.hの内容から判断すると、WSAData構造体には#pragma pack(1)がないので、あなたが言ったようにそのサイズはμl以上かもしれません。

しかし,何かが間違っているか,これらのデータがスタックを破壊していないかのどちらかだと言える.

すべての方法を解明するのは良いことだ。

 
そのスタイルで書き直せばいい:
#define  WSA_DATA_SZ   420
...
char wsaData[WSA_DATA_SZ];
int res=WSAStartup(MAKEWORD(2,2), wsaData);
アラインメントやコンパイラが余分なバイトをどこに置くかなんて気にしなくていい。どうせどのフィールドにもアクセスしないのだから、構造体を宣言しようとするこの頭痛の種に何の意味があるのだろう?