Разобрать двоичные данные для сервера C # bootp? - PullRequest
4 голосов
/ 10 февраля 2010

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

Любые идеи: alt text
(источник: tcpipguide.com )

Ответы [ 2 ]

2 голосов
/ 10 февраля 2010

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

[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 для получения подробной информации).
Надеюсь, это поможет:)

1 голос
/ 10 февраля 2010

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

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

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

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

...