Как правильно написать UDP-пакет

Я пытаюсь переписать часть своего кода из программы на C++, которую я написал некоторое время назад, но я не уверен, могу ли/как я могу правильно писать в массив байтов, или мне следует использовать что-то еще. Код, который я пытаюсь изменить на С# .NET, приведен ниже.

unsigned char pData[1400];
bf_write g_ReplyInfo("SVC_ReplyInfo", &pData, 1400);

void PlayerManager::BuildReplyInfo()
{   
    // Delete the old packet
    g_ReplyInfo.Reset();

    g_ReplyInfo.WriteLong(-1);
    g_ReplyInfo.WriteByte(73);
    g_ReplyInfo.WriteByte(g_ProtocolVersion.GetInt());
    g_ReplyInfo.WriteString(iserver->GetName());
    g_ReplyInfo.WriteString(iserver->GetMapName());
}

person Community    schedule 12.03.2011    source источник
comment
После дополнительных поисков я нашел BinaryWriter и MemoryStream, и все вроде бы работает. Единственная проблема, с которой я столкнулся сейчас, это то, что я не могу указать, когда использовать перегрузку для Write(), поэтому мне придется вручную преобразовывать длинные и короткие значения в байты?   -  person    schedule 12.03.2011


Ответы (1)


BinaryWriter может работать, хотя строки записываются с предшествующей 7-битной закодированной длиной, которую, я подозреваю, клиент не сможет обработать. Вам, вероятно, придется преобразовать строки в байты, а затем либо добавить слово длины, либо завершить его 0.

Нет необходимости вручную преобразовывать числа в байты. Если у вас есть long, который вы хотите записать как byte, просто произнесите его. То есть, если ваш BinaryWriter равен bw, то вы можете написать bw.Write((byte)longval);. Чтобы написать -1 как длинное: bw.Write((long)(-1)).

person Jim Mischel    schedule 12.03.2011
comment
Спасибо, это имеет большой смысл, думаю, я слишком много думал об этом. Когда я использовал его только с bw.Write(-1) и bw.Write(такие строки); по крайней мере, он ответил на запрос, просто информация была неправильно отформатирована, поэтому она не отображалась должным образом. Теперь, когда я преобразовал значения в байтовые/длинные/короткие и привел строки в байтовые массивы, а нуль завершил их, это больше не работает. Вероятно, лучше всего сделать новый пост для этого, хотя сложно вставить код в комментарии, спасибо! - person ; 12.03.2011