Разобрать двоичные данные для сервера 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).
Надеюсь, это поможет:)