Заголовок для посылки в сокет
От: MuSHaN  
Дата: 05.06.10 10:37
Оценка:
Господа, есть задача сформировать заголовок для посылки в сокет по следующей таблице
Таблица 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).

С сетевым программирование ну просто никак, может кто-нибудь помочь с этим заголовком примером.
Re: Заголовок для посылки в сокет
От: RushDevion Россия  
Дата: 05.06.10 20:34
Оценка:
Вот так например (только в качестве идеи).
// Это небольшой хелпер
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);
Re[2]: Заголовок для посылки в сокет
От: Jolly Roger  
Дата: 06.06.10 04:43
Оценка: 1 (1)
Здравствуйте, RushDevion, Вы писали:

RD> public Pack Int32( Int32 value )

RD> {
RD> //Меняем порядок байт
RD> this.inner.WriteByte( unchecked( (byte)( value >> 24 & 0xff ) ) );
RD> this.inner.WriteByte( unchecked( (byte)( value >> 16 & 0xff ) ) );
RD> this.inner.WriteByte( unchecked( (byte)( value >> 8 & 0xff ) ) );
RD> this.inner.WriteByte( unchecked( (byte)( value & 0xff ) ) );
RD> return this;
RD> }

Вообще-то есть IPAddress.HostToNetworkOrder, учитывающая byte order текущей машины.
"Нормальные герои всегда идут в обход!"
Re[2]: Заголовок для посылки в сокет
От: MuSHaN  
Дата: 08.06.10 05:13
Оценка:
Спасибо за помощь, буду пробовать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.