Pregunta

Necesito que una de mis aplicaciones C# .NET actúe como servidor de arranque.El protocolo es bastante simple, pero no conozco una manera fácil de generar/analizar los datos binarios.

Algunas ideas:alt text
(fuente: tcpipguide.com)

¿Fue útil?

Solución

Hay un par de maneras de hacer esto. Usted puede ser capaz de jugar un poco con el atributos marshaling como StructLayout para empacar una estructura en un conjunto de bytes, pero esto es probablemente difícil y no vale la pena el esfuerzo.

Se puede usar un marco especializado como Protobuf atribuir una clase en de tal manera que se puede serializar para que coincida con la estructura que necesita.

Sin embargo, en mi experiencia, el más fácil, más rápido, y el método más flexible de la creación de una estructura binaria como esto es usar una clase MemoryStream para mantener un buffer de exentos, a continuación, utilizar un BinaryWriter alrededor de ella para escribir realmente los datos binarios en la corriente.

En cualquier caso, esto ayuda a tener un servidor de trabajo para hacer referencia. Utilizar una herramienta como Wireshark o Microsoft Monitor de red para capturar el tráfico de alambre para que pueda comparar su formato de alambre a un ejemplo que se sabe que funciona.

Otros consejos

Puede crear una estructura tan simple como:

[Serializable]
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct MyData {
    public byte OpCode;
    public byte HardwareType;
    public byte HardwareAddressType;
    public byte Hops;

    public int TransactionId;

    public short Seconds;
    public short Flags;

    public int ClientIPAddress;

    public int CurrentIP;

    // all other fields in the required sequence  
}  

y utilizando un código de este blogpost serializar los paquetes / deserializar. Pero puede haber un problema con ServerName y BootFilename debido a las diferencias en la codificación y, probablemente, es necesario especificar FieldOffset exacta para cada uno de los campos (ver este tema en MSDN para más detalles).
Esperamos que esto ayude:)

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