Система структуры пакетов C # - PullRequest
1 голос
/ 02 декабря 2010

Я работаю в пакетной системе (UDP или TCP, в любом случае это нормально), но я пришел к выводу, что моя текущая (TCP) система действительно хороша.

По сути, я отправляюпакет, который выглядит следующим образом:

string packet = "LOGIN_AUTH;TRUE"
IPAddress target = IPAddress.Parse(endPoint);
// Send packet

Когда я получаю пакет в своем клиенте, я использую его для определения типа пакета:

string[] splitPacket = packet.Split(';');

if (splitPacket[0] == "LOGIN_AUTH" && splitPacket[1] == "TRUE")
   authLogin(packet); //Does stuff like loading the next screen

Но я уверен, что должно бытьлучший способ сделать это из-за этой темы:

http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/79660898-aeee-4c7b-8cba-6da55767daa1/ (сообщение 2)

Мне просто интересно, может ли кто-нибудь дать мне толчок в правильном направлениио том, что я должен классифицировать пакеты так, чтобы это было проще для глаз.

Заранее спасибо.

Редактировать: Я провел некоторое исследование, но не могу найти решение для своегопроблема в WCF.Итак, еще раз, каков наилучший способ создания структуры пакета и как ее использовать?

Я не хочу воссоздавать протокол, просто что-то вроде этого:

public string sepChar = ";"
public static struct loginPacket
{
    string type;
    string username;
    string password;
}

public void reqLogin()
{
    lock (_locker)      //Need to make it thread-safe in this case
    {
         loginPacket.type = "login";
         loginPacket.username = "username";
         loginPacket.password = "password;

         sendPacket(loginPacket);
    }
}

public void sendPacket(string packet)
{
    // Script to send packet using the struct information
}

Надеюсь, это достаточно подробно.

Ответы [ 3 ]

2 голосов
/ 02 декабря 2010

Я бы порекомендовал WCF; если не сейчас, решите изучить это в будущем. У него огромная кривая обучения, потому что он охватывает не только то, что вы пытаетесь сделать, но и многое другое.

Если вам просто нужно быстрое и грязное решение, вы можете использовать двоичную сериализацию. Чтобы воспользоваться этим подходом, вам необходимо определить типы сообщений в DLL, совместно используемой клиентом и сервером. Затем не забудьте использовать форму сообщения , чтобы сообщения не могли быть разобраны при передаче.

Вещи становятся более сложными, если учесть управление версиями. В конце концов вы захотите использовать WCF.

1 голос
/ 02 декабря 2010

2 года назад я использовал свой собственный протокол связи по TCP, о базовом классе пакетов:

public enum PacketType {Login, Hello, FooBar}
public class Packet
{
    public long Size;
    public PacketType PacketType;
}
public class LoginPacket : Packet
{
    public string Login;
    public string Password;
}

Я не согласен со свойством Size ... потому что вы будете знать только размер пакета ПОСЛЕ того, как он был сериализован с двоичным форматом. Я использовал другой метод, сначала я сериализовал объект пакета, а затем перед помещением этого байта [] в сетевой поток я записал BitConverter.GetBytes (SerializedPacketMemoryStream.Length) перед байтами каждого пакета.
Второе, что нужно учитывать, это то, что вам нужно создать временный буфер для принятых байтов [] и подождать, пока вы не получите полный пакет, и только затем десериализовать его.
Я могу отправить вам свою часть кода клиент-сервер, она не очень чистая, я написал ее, когда только начинал изучать C #, но он на 100% стабилен, проверен в течение 3 лет в рабочей среде.

0 голосов
/ 02 декабря 2010

protobuf может быть тем, что вы хотите.

Вот порт .NET: protobuf-net

...