Question

Je suis en train d'interagir avec une application sur le réseau qui utilise un protocole simple. Je dois envoyer un en-tête qui ressemble à ceci:

2 octets = Longueur des données (y compris le type de demande)
1 octet = Type de demande

Je prends les deux paramètres comme entiers:

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

Je vous appelle comme ceci:

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
}

Je ne reçois aucune sorte d'exception lors de l'appel de cette méthode ou l'envoi outBuf sur une prise, mais l'application de réseau ne répond jamais. Je peux l'interroger avec d'autres programmes, cependant, donc je suis assez certain que c'est parce que mon en-tête n'est pas écrit correctement.

Est-ce que je fais quelque chose de mal lors de l'écriture des valeurs?

EDIT: Ajouté le code MemoryStream

Était-ce utile?

La solution

Quel type de flux est-il? Si la mise en mémoire tampon votre entrée, les données ne peuvent jamais être réellement envoyés à travers le fil.

Edit:

BitConverter.GetBytes (1) vous donne [1, 0, 0, 0], à partir de laquelle vous passez [1,0]. Peut-être que son problème endian-ness. Essayez d'envoyer [0,1] comme en-tête.

Autres conseils

Pourrait-il y avoir des problèmes endian-ness entre votre client et le serveur? Tu pourrais essayer capturer le trafic réseau avec Wireshark ou un outil similaire, puis comparer les paquets envoyés / reçus via votre client par rapport à une autre application qui communique avec succès.

Essayez 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);

Je peux penser à trois sources d'erreurs dans ce code:

  • problèmes de endianness: quel est l'ordre des octets pour la longueur 2 octets que vous envoyez, et êtes-vous certain que GetBytes donne les octets dans le bon ordre
  • ?
  • taille de paquet: vous envoyez 256 octets de données, même si votre message est seulement 3 octets
  • .
  • Charge utile:. Vous ne mettez pas la charge utile dans le message, mais le message 110 peut exiger des données supplémentaires

Je suppose que vous devez faire de votre longueur une courte. Lorsque vous wrtie l'int au flux Je suppose que vous allez seulement pour obtenir les deux octets supérieurs depuis l'int est de 4 octets et vous écrivez seulement deux d'entre eux buf.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top