Domanda

Sto cercando di interagire con un'applicazione in rete che utilizza un semplice protocollo.Devo inviare un header che assomiglia a questo:

2 byte = Lunghezza dati (tra cui il Tipo di Richiesta)
1 byte = Il Tipo Di Richiesta

Sto prendendo entrambi i parametri come numeri interi:

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

Sto chiamando come questo:

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
}

Non ottengo alcun tipo di eccezione quando si chiama questo metodo o l'invio di outBuf attraverso un socket, ma la rete che l'applicazione non risponde.Posso eseguire query con altri programmi, però, quindi sono abbastanza certo che è perché i miei intestazione non viene scritto correttamente.

Sto facendo qualcosa di sbagliato durante la scrittura di valori?

EDIT: Aggiunto MemoryStream codice

È stato utile?

Soluzione

Che tipo di flusso è?Se il suo buffer di input, i dati potranno mai essere inviati attraverso la rete.

Edit:

BitConverter.GetBytes(1) fornisce [1, 0, 0, 0], da cui si sta passando [1,0].Forse è un endian-ness problema.Provare a inviare [0,1] come intestazione.

Altri suggerimenti

Ci potrebbe essere endian-ness problemi tra il client e il server?Si potrebbe provare catturare il traffico di rete con Wireshark o simile strumento, quindi, di confrontare i pacchetti inviati/ricevuti tramite il tuo client e qualche altra applicazione che comunica con successo.

Provare un 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);

Mi vengono in mente tre fonti di errori in questo codice:

  • le modalita ' di problemi:qual è l'ordine di byte 2 byte di lunghezza che si invia, e stai certo che GetBytes dà il byte nel giusto ordine?
  • dimensione di pacchetto:stai inviando 256 byte di dati, anche se il tuo messaggio è solo di 3 byte.
  • carico utile:non mettere alcun payload del messaggio, ma il messaggio di 110 può richiedere ulteriori dati.

Ho il sospetto che è necessario per rendere la vostra lunghezza breve.Quando si wrtie int il torrente, ho il sospetto che si sta solo andando a ottenere i primi due byte dal momento che l'int è di 4 byte e tu sei solo la scrittura di due di loro a buf.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top