Escrever um número inteiro de 2 bytes para um fluxo?
-
19-09-2019 - |
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
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.