Pregunta

Estoy tratando de interactuar con una aplicación sobre la red que usa un protocolo simple. Tengo que enviar una cabecera que tiene este aspecto:

2 bytes = Longitud de datos (incluyendo tipo de solicitud)
1 byte = Tipo de solicitud

Me estoy tomando ambos parámetros como números enteros:

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

La llamo así:

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
}

No consigo ningún tipo de excepción cuando se llama a este método o el envío de outBuf través de un socket, pero la aplicación de la red no responde. Puedo consultar con otros programas, sin embargo, así que estoy bastante seguro de que es porque mi cabecera no está siendo escrito correctamente.

¿Estoy haciendo algo mal al escribir los valores?

EDIT: código Agregado MemoryStream

¿Fue útil?

Solución

¿Qué tipo de flujo es? Si su amortiguando su entrada, los datos pueden ser enviados en realidad nunca a través del cable.

Editar:

BitConverter.GetBytes (1) le da [1, 0, 0, 0], de la que está de paso [1,0]. Tal vez sea un problema endian-dad. Intente enviar [0,1] como su cabecera.

Otros consejos

Podría haber problemas endian-dad entre el cliente y el servidor? Tu podrías intentar capturar el tráfico de red con Wireshark o una herramienta similar, a continuación, se comparan los paquetes enviados / recibidos mediante su cliente frente a alguna otra aplicación que se comunica con éxito.

Pruebe con 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);

Se me ocurren tres fuentes de errores en el código:

  • problemas endianness: ¿cuál es el orden de bytes de la longitud de 2 bytes que envíe, y que está seguro de que GetBytes da los bytes en el orden correcto
  • ?
  • tamaño del paquete: va a enviar 256 bytes de datos, a pesar de que su mensaje es sólo 3 bytes de tamaño
  • .
  • carga:. No poner ninguna carga en el mensaje, pero el mensaje 110 puede requerir datos adicionales

Sospecho que necesita para hacer su longitud a corto. Cuando wrtie el int a la corriente Sospecho que sólo va a conseguir los dos primeros bytes desde el int es de 4 bytes y sólo se está escribiendo dos de ellos a buf.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top