La scrittura di un intero 2-byte di un ruscello?
-
19-09-2019 - |
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
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.