2010-02-10 4 views
4

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

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

+0

Я принимаю это, «просто», вы имеете в виду что-то другое, кроме принятия 0xFF и т. Д., И смещение влево на несколько бит, определяемых константами, которые сопоставляются с описанием области на приведенном выше графике? – Dave

ответ

1

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

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

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

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

+0

отличная информация! Все, что я делал до сих пор в .NET, на самом деле составляет менее 64 бит, поэтому приятно видеть другие варианты в случае, если мне в конечном итоге нужно что-то сделать, как Тим (очень вероятно). – Dave

2

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

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

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

Смежные вопросы