Não é possível receber dados no soquete pull usando zeroMQ, "Endereço em uso" - Erro

Jonas

Atualmente, tento configurar uma arquitetura Push-Pull-Socket simples usando zeroMQ enquanto o Metatrader 4 (MQL) atua como publishere meu back-end Python atua como consumer.

Eu envio dados do terminal Metatrader 4 a cada segundo, o que funciona muito bem. No entanto, estou tendo dificuldades para receber dados no soquete pull . Uma vez que tento extrair esses dados da rede, o scriptpacote atom gera o erro address already in use.

Eu executo o terminal MT 4 e o script Python na minha máquina local durante o desenvolvimento.

Metatrader 4:

extern string PROJECT_NAME = "Dashex.Feeder";
extern string ZEROMQ_PROTOCOL = "tcp";
extern string HOSTNAME = "*";
extern int PUSH_PORT = 32220;

extern string t0 = "--- Feeder Parameters ---";
input string DID = "insert your DID here";
extern string t1 = "--- ZeroMQ Configuration ---";
extern bool Publish_MarketData = false;

// ZeroMQ environment //

// CREATE ZeroMQ Context
Context context(PROJECT_NAME);

// CREATE ZMQ_PUSH SOCKET
Socket pushSocket(context, ZMQ_PUSH);

string Publish_Symbols[7] = {
   "EURUSD","GBPUSD","USDJPY","USDCAD","AUDUSD","NZDUSD","USDCHF"
};

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

int OnInit()
  {
//---

   EventSetTimer(1);     // Set Millisecond Timer to get client socket input

   context.setBlocky(false);

   // Send responses to PULL_PORT that client is listening on.
   Print("[PUSH] Connecting MT4 Server to Socket on Port " + IntegerToString(PUSH_PORT) + "..");
   pushSocket.connect(StringFormat("%s://%s:%d", ZEROMQ_PROTOCOL, HOSTNAME, PUSH_PORT));

   pushSocket.setSendHighWaterMark(1);
   pushSocket.setLinger(0);   

//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

   Print("[PUSH] Disconnecting MT4 Server from Socket on Port " + IntegerToString(PUSH_PORT) + "..");
   pushSocket.disconnect(StringFormat("%s://%s:%d", ZEROMQ_PROTOCOL, HOSTNAME, PUSH_PORT));

   // Shutdown ZeroMQ Context
   context.shutdown();
   context.destroy(0);

   EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTimer()
{
   /*
      Use this OnTimer() function to send market data to consumer.
   */
   if(!IsStopped() && Publish_MarketData == true)
   {
      for(int s = 0; s < ArraySize(Publish_Symbols); s++)
      {
         // Python clients can subscribe to a price feed by setting
         // socket options to the symbol name. For example:

         string _tick = GetBidAsk(Publish_Symbols[s]);
         Print("Sending " + Publish_Symbols[s] + " " + _tick + " to PUSH Socket");
         ZmqMsg reply(StringFormat("%s %s", Publish_Symbols[s], _tick));
         pushSocket.send(reply, true);
      }
   }
}
//+------------------------------------------------------------------+

string GetBidAsk(string symbol) {

   MqlTick last_tick;

   if(SymbolInfoTick(symbol,last_tick))
   {
       return(StringFormat("%f;%f", last_tick.bid, last_tick.ask));
   }

   // Default
   return "";
}

O envio de dados funciona como pretendido:

insira a descrição da imagem aqui

Soquete pull baseado em Python:

import zmq
import time

context = zmq.Context()
zmq_socket = context.socket(zmq.PULL)
zmq_socket.bind("tcp://*:32220")
time.sleep(1)

while True:
    result = zmq_socket.recv()
    print(result)
    time.sleep(1)

Isso é o que scriptrelata no console:

insira a descrição da imagem aqui

Saída Netstat:

insira a descrição da imagem aqui

Observação: quando eu encerro o script push do Metatrader e o script python, a porta ainda está marcada como "ouvida" no netstats. Quando mudo a porta para 32225 (ou qualquer outra) em ambas as instâncias e as executo novamente, recebo o mesmo erro novamente. Se eu executar a instância pull pela primeira vez, tenho uma ampulheta surgindo no átomo script, quando eu executo a instância push MT4 nada acontece no lado pull. Quando executo novamente a instância pull, recebo o mesmo erro novamente.

Atualizar:

A python.exeinstância em segundo plano ocupou a porta. Desliguei a execução do python e a porta foi liberada novamente. Quando agora executo minha instância pull, recebo o seguinte feedback do console:

1.)

insira a descrição da imagem aqui

2.)

Em seguida, executo a instância push, que funciona perfeitamente.

3.)

A instância pull ainda mostra a ampulheta e não imprime nenhum dado no console:

insira a descrição da imagem aqui

4.)

Quando eu executo novamente a instância pull, ela levanta o endereço de erro em uso, o que agora faz sentido, já que o Python usa aquela porta ainda em segundo plano.

Mas por que nenhum dado é impresso no lado de puxar? Tenho que alterar o código do cliente pull para poder "pegar" os dados enviados?

larsks

O problema é com seu PUSHcódigo, aqui:

extern string HOSTNAME = "*";

Embora você possa usar legitimamente *para o componente do nome do host em um bindURL (nesse caso, significa "ouvir em todos os endereços"), não faz sentido em uma connectchamada: você deve fornecer um nome de host ou endereço IP válido.

Se você modificasse seu código para ler:

extern string HOSTNAME = "localhost";

Provavelmente funcionaria como esperado.

Aqui está um PUSHcliente Python simples que usei para testar seu PULLcódigo; se você executar isso e executar seu PULLcódigo (conforme postado em sua pergunta), tudo funcionará:

import time
import zmq

c = zmq.Context()
s = c.socket(zmq.PUSH)

s.connect('tcp://localhost:32220')

i = 0
while True:
    s.send_string('this is message {}'.format(i))
    i += 1
    time.sleep(0.5)

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Erro: Endereço em uso 1883 Mosquito Docker

O aplicativo Python Heroku falha com o erro "Endereço em uso"

Lua NodeMCU erro de conexão do servidor web (endereço em uso stack traceback)

nslookup: isc_socket_bind: endereço em uso - não é possível resolver dns no contêiner docker (imagem phusion)

Não é possível receber dados de string do soquete Python para o soquete Java

Contêiner MariaDB Docker usando volume de dados - Erro 2002, não é possível conectar por meio de soquete

Soquete Python: Erro ao receber dados

apache2 / nodejs / express em um servidor oceânico digital - como ouvir a porta pública (80) sem erro de endereço em uso

(Operação de soquete em não soquete) erro ao tentar receber dados em um servidor TCP

(Operação de soquete em não soquete) erro ao tentar receber dados em um servidor TCP

(Operação de soquete em não soquete) erro ao tentar receber dados em um servidor TCP

erro de soquete python: não é possível selecionar no soquete

Não é possível receber dados enviados usando curl no método post usando php

Não é possível receber dados enviados usando curl no método post usando php

Soquete PULL permanente ZeroMQ

C ++, o soquete TCP não pode receber dados

Erro CORS, não é possível receber dados do back-end principal do asp.net

Erro CORS, não é possível receber dados do back-end principal do asp.net

Não é possível receber dados de io.emit ()

Não é possível receber dados corretamente no Django do Ajax

Android - não é possível receber dados de PHP

Não é possível receber dados de axios na API

Não é possível receber dados POST em nodeJs

Não é possível receber mensagem para soquete reutilizado no iOS10

não é possível abrir a janela de configuração da tabela e receber o erro "Erro ao obter DDL para o objeto Nenhum banco de dados selecionado"

Não é possível receber contentType "application / pdf" usando RestResponse

Não é possível receber objeto PHP usando AJAX

php (soquete do cliente) java (soquete do servidor) não pode receber segundos dados

Por que a pesquisa ZeroMQ gera um erro: "operação de soquete em não soquete"?

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    UITextView não está exibindo texto longo

  3. 3

    Dependência circular de diálogo personalizado

  4. 4

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  5. 5

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  6. 6

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  7. 7

    Setas rotuladas horizontais apontando para uma linha vertical

  8. 8

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  9. 9

    Definir um clipe em uma trama nascida no mar

  10. 10

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  11. 11

    Como dinamizar um Dataframe do pandas em Python?

  12. 12

    regex para destacar novos caracteres de linha no início e no fim

  13. 13

    Why isn't my C# .Net Core Rest API route finding my method?

  14. 14

    Como obter a entrada de trás de diálogo em treeview pyqt5 python 3

  15. 15

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  16. 16

    How to create dynamic navigation menu select from database using Codeigniter?

  17. 17

    Como recuperar parâmetros de entrada usando C #?

  18. 18

    Changing long, lat values of Polygon coordinates in python

  19. 19

    Livros sobre criptografia do muito básico ao muito avançado

  20. 20

    Método \ "POST \" não permitido no framework Django rest com ações extras & ModelViewset

  21. 21

    Pesquisa classificada, conte números abaixo do valor desejado

quentelabel

Arquivo