Pergunta

Estou tentando interagir com um aplicativo sobre a rede que usa um protocolo simples. Eu tenho que enviar um cabeçalho que se parece com o seguinte:

2 bytes = Comprimento dos dados (incluindo o tipo de solicitação)
1 byte = Tipo de solicitação

Estou tomando os dois parâmetros como números inteiros:

private static void WriteHeader(Stream buf, int length, int requestType) {
    buf.Write(BitConverter.GetBytes(length), 0, 2);
    buf.WriteByte((byte)requestType);
}

Estou chamando assim:

byte[] outBuf = new byte[256];
using (MemoryStream outStream = new MemoryStream(outBuf)) {
    // Socket connection stuff here
    WriteHeader(outStream, 1, 110);
    sock.Send(outBuf);
    // Receive stuff here, never returns
}

Não recebo nenhum tipo de exceção ao ligar para esse método ou enviar outBuf sobre um soquete, mas o aplicativo de rede nunca responde. Porém, posso consultá -lo com outros programas, por isso tenho certeza de que é porque meu cabeçalho não está sendo escrito corretamente.

Estou fazendo algo errado ao escrever os valores?

EDITAR: Adicionado código MemoryStream

Foi útil?

Solução

Que tipo de fluxo é? Se estiver buffer sua entrada, os dados nunca serão enviados através do fio.

Editar:

BitConverter.getBytes (1) fornece [1, 0, 0, 0], do qual você está passando [1,0]. Talvez seja uma questão de Endian-Ness. Tente enviar [0,1] como seu cabeçalho.

Outras dicas

Poderia haver problemas de Endian-Ness entre seu cliente e o servidor? Você pode tentar capturar o tráfego de rede com Wireshark ou ferramenta semelhante, compare os pacotes enviados/recebidos usando seu cliente versus algum outro aplicativo que se comunica com sucesso.

Experimente um NetworkStream:

void WriteHeader(Stream s, int len, int cmd) {
    var buf = new byte[3];
    s.Write(BitConverter.GetBytes((UInt16)len));
    s.WriteByte((byte)cmd);
}

var ns = new NetworkStream(sock);
WriteHeader(ns, 1, 110);

Posso pensar em três fontes de erros neste código:

  • Problemas de Endianness: Qual é a ordem de bytes para o comprimento de 2 bytes que você envia, e você tem certeza de que GetBytes dá os bytes na ordem certa?
  • Tamanho do pacote: você está enviando 256 bytes de dados, mesmo que sua mensagem tenha apenas 3 bytes de tamanho.
  • Carga de pagamento: você não coloca nenhuma carga útil na mensagem, mas a mensagem 110 pode exigir dados adicionais.

Suspeito que você precise fazer com que seu comprimento seja curto. Quando você é o INT para o fluxo, suspeito que você só conseguirá os dois primeiros bytes, já que o int é de 4 bytes e você está apenas escrevendo dois deles para Buf.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top