通过命名管道在MQL5(或C ++)和C#之间进行交互

时间:2013-08-10 09:58:37

标签: c# c++ pipe named-pipes mql5

我正在尝试通过命名管道发送一些数据。我在C#中创建了命名管道服务器,在MQL5中创建了客户端(它只是一个C ++包装器)。服务器工作正常,可以从用C#编写的命名管道客户端访问,因此通信 C#< - > C#工作正常。此外,我尝试了实用程序PipeList,它还显示我的管道服务器是可见的和可用的。

唯一的问题是使用MQL5(C ++)编写的客户端 - 它找不到管道服务器的路径,因此通信 MQL< - > C#失败

有人可以建议:

  • 我做错了什么?
  • 如何检查C#和MQL是否正在访问相同的物理 路径和位置相同?

服务器:

NamedPipeServerStream pipeStream = new NamedPipeServerStream("MQL5", PipeDirection.In, 1, PipeTransmissionMode.Byte) 

我还尝试了完整路径\\\\。\\ pipe \\ MQL5但没有成功

客户:

CFilePipe iPipe;

while(IsStopped() == false)
{
    Print("This loop is infinite because there is no connection");
    if (iPipe.Open("\\\\.\\pipe\\MQL5", FILE_READ | FILE_WRITE | FILE_BIN) != INVALID_HANDLE) break;
    Sleep(250);
}

感谢。

2 个答案:

答案 0 :(得分:1)

找到答案。似乎这只是我自己的错误,或者这就是Pipes在MQL中的工作方式 - 通道总是需要双工,所以C#中的行需要替换为以下内容:

NamedPipeServerStream pipeStream = new NamedPipeServerStream(name, PipeDirection.InOut, 1, PipeTransmissionMode.Byte)

参数PipeDirection。 InOut 表示管道是双向的。

P.S。虽然它有点奇怪,因为连接C#Server< - > C#Client可以在两种模式下工作(输入/输出或其中一种)

答案 1 :(得分:1)

服务器: C#/ 客户端 MetaTrader

我还有两个问题:

  1. 客户端和服务器需要以管理员身份运行
  2. 我需要为输入和输出设置缓冲区大小(默认值为零=> 动态计算=>这是一个错误)。