Господа, есть задача сформировать заголовок для посылки в сокет по следующей таблице
Таблица 1. Формат заголовка
Смещение | Длина (байт) | Тип | Описание |
----------------------------------------------------------------------------------------------------------|
0 | 4 | Целое число | Длина текста сообщения (без заголовка) |
4 | 4 | Целое число | Время создания запроса (кол-во секунд с 1 января 1970 GMT)|
8 | 4 | Целое число | Идентификатор сообщения |
12 | 32 | | Зарезервировано (заполнено нулевым байтом) |
44 | 2 | Целое число | Идентификатор клиента |
46 | 1 | | 1-й байт флагов сообщения |
47 | 1 | | 2-й байт флагов сообщения |
48 | 4 | Целое число | Идентификатор симметричного ключа |
52 | 48 | | Зарезервировано (заполнено нулевым байтом) |
Целые числа передаются в сетевом формате (network byte order).
С сетевым программирование ну просто никак, может кто-нибудь помочь с этим заголовком примером.
Вот так например (только в качестве идеи).
// Это небольшой хелпер
public sealed class Pack
{
readonly MemoryStream inner = new MemoryStream( );
public Pack Byte( byte value )
{
this.inner.WriteByte(value);
return this;
}
public Pack Int32( Int32 value )
{
//Меняем порядок байт
this.inner.WriteByte( unchecked( (byte)( value >> 24 & 0xff ) ) );
this.inner.WriteByte( unchecked( (byte)( value >> 16 & 0xff ) ) );
this.inner.WriteByte( unchecked( (byte)( value >> 8 & 0xff ) ) );
this.inner.WriteByte( unchecked( (byte)( value & 0xff ) ) );
return this;
}
public Pack Empty( int size )
{
byte[] zero = new byte[size];
this.inner.Write(zero, 0, zero.Length);
return this;
}
public byte[] GetData()
{
return this.inner.ToArray();
}
}
// А используем так:
Pack pk = new Pack()
.Int32(len)
.Int32(seconds)
.Int32(msgId)
.Empty(32)
.Int32(clientId)
.Byte(flags1)
.Byte(flags2)
.Int32(keyId)
.Empty(48);
byte[] toWrite = pk.GetData();
networkStream.Write(toWrite, 0, toWrite.Length);