Разобрать двоичные данные для сервера C# bootp?

Мне нужно одно из моих приложений на C# .NET для работы в качестве сервера bootp. Протокол довольно прост, но я не знаю простой способ создания / анализа двоичных данных.

Любые идеи: http://www.tcpipguide.com/free/diagrams/bootpformat.png

2 ответа

Решение

Есть несколько способов сделать это. Возможно, вам удастся поэкспериментировать с атрибутами маршалинга, такими как StructLayout, чтобы упаковать структуру в байтовый массив, но это, вероятно, сложно и не стоит усилий.

Вы можете использовать специализированную инфраструктуру, такую ​​как Protobuf, для атрибута класса таким образом, чтобы он был сериализован в соответствии с нужной вам структурой.

Но, по моему опыту, самый простой, быстрый и гибкий способ создания двоичной структуры, подобной этой, - это использовать класс MemoryStream для хранения буфера байтов, а затем использовать BinaryWriter вокруг него для фактической записи двоичных данных в поток.

В любом случае это помогает иметь работающий сервер для ссылки. Используйте такой инструмент, как Wireshark или Microsoft Network Monitor, для захвата проводного трафика, чтобы вы могли сравнить формат проводного соединения с примером, который, как известно, работает.

Вы можете создать простую структуру, такую ​​как:

[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  
}  

и использовать код из этого поста для сериализации / десериализации пакетов. Но могут быть проблемы с ServerName и BootFilename из-за различий в кодировке, и, вероятно, вам необходимо указать точный FieldOffset для каждого из полей (подробности см. В этом разделе по msdn).
Надеюсь, это поможет:)

Другие вопросы по тегам