[C#] Konstrukcja własnego pakietu

0

Witam.

Postawiłem sobie problem, aby wysyłać do serwera pakiety w takiej formie:

  1. pierwsze 4 bajty to wielkość danych pakietu,
  2. następne 2 to iterator oznaczający numer komendy(kolejność),
  3. następnie 2 bajty oznaczają długość komendy
  4. oraz sama komenda

z tym, że komend może być kilka. To znaczy że może wystąpić sytuacja taka: 1->2->3->4->2->3->4->2->3->4->...itd

Czym w C# można się posłużyć, aby nie budować pakietu na piechotę dodając kolejno bajty, tylko użyć jakiejś struktury? funkcji? która zrobi to ładnie.
Jak to robią profesjonaliści?

Pozdrawiam

0

uzywaja web service :D
albo szerzej serializacji (takze binarnej)
po co schodzic do az tak nisko? po to uzywamy jez. wys. poziomu zeby nie rzezbic takich cudow

0

po co schodzić aż tak nisko?
bo taki mam problem

w takim razie jak używając WebService (NIE schodząc to tak niskiego poziomu) wysłać taki pakiet jak w pierwszym poście?

a może jakaś inna metoda?

0

Nie znam celu ale może jeszcze .NET Remoting ?

0

czy twoja paczka danych musi wygladac jak w pierwszym poscie, czy to twoj pomysl?
czy raczej chodzi ci o przeslanie odpowiedznich danych do serwera?

jesli chodzi o wariant 2. to moze wystarczy do serwera wyslac liste komend, oczywiscie kolejnosc wykonania = kolejnosc na liscie
wiec jesli komenta to jakis tekst, to calosc sprowadza sie do wyslanie List<string> do serwera
jesli chcesz bawic sie w bezpieczenstwo, to uzywajac WCF do komunikacji, mozesz zaszyfrowac komunikacje i/lub tresc komunikatu, mozesz dodatkowo pododawac sobie jakies hash (np. md5) listy komend, ktory pozniej serwer zweryfikuje. Mozesz tez podpisac tresc wiadomisci (podpis cyfrowy), a nawet zaszyfrowac pozniej.

wiec opisz szerzej problem, co chcesz uzyskac, chyba ze chodzi o jakies zadanie akademickie i muszisz z tymi pakietami sie meczyc

0

Tak! Ten 2 wariant jest bardzo ciekawy.

Generalnie chodzi o wysłanie kilku komend, z tym że serwer odczytuje je w taki sposób jak opisałem w pierwszym poście.

Pakiety nie muszą być szyfrowane - "goły tekst" może być. chodzi tylko o zachowanie kolejności danych.

Jednak w jaki sposób posługując się (w tym wypadku) List<String> wysłać (oprócz danych) ich wielkość oraz iterator oznaczający numer komendy? to się robi z automatu? po prostu dodając je do listy ->stream->socket->send?

no i jak poradzić sobie z tym, że pierwsze 4 bajty to wielkość danych, a dane mogą być wielkości np. 00 00 01 72. Wtedy lista utnie mi 4 początkowe zera.

Długość całego pakietu znam. Komendy da się policzyć. Więc kombinuję z tablicą bajtów i wrzucam tam bajty po kolei. No też sposób, ale wydaje mi się że na pewno jest coś lepszego.

0

4 bajty ma int (Int32)
2 ma short (Int16)

nie wiem czym ma byc komenda, zakladam ze stringiem, wiec zrobilbym tak:

    class CommandInfo
    {
        public string Text { get; set; }
    }
    class PackInfo
    {
        public List<CommandInfo> Commands { get; private set; }
        public PackInfo()
        {
            this.Commands = new List<CommandInfo>();
        }

        public byte[] PrepareToSend()
        {
            int totalSize = 4 + (2 + 2) * Commands.Count;
            Commands.ForEach(c => totalSize += c.Text.Length);
            byte[] buff = new byte[totalSize];

            MemoryStream ms = new MemoryStream(buff);
            BinaryWriter br = new BinaryWriter(ms, System.Text.Encoding.ASCII);
            br.Write(totalSize);
            for (int i = 0; i < Commands.Count; i++)
            {
                br.Write((short)i);
                br.Write((short)Commands[i].Text.Length);
                br.Write(Commands[i].Text.ToCharArray());
            }
            br.Close();
            ms.Close();
            return buff;
        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1