Невозможно отправить заголовок переменной длины на сервер

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

Он отправляет изображение в виде байтов с небольшим заголовком, в котором говорится, что он запускает поток удаленного рабочего стола. "Rdmstrea" Сервер знает, что первые 16 байтов пакета будут содержать заголовок.

Однако мне нужно отправить какой-то системный идентификатор внутри этого пакета, так как при демонстрации экрана я понятия не имею, кто есть кто.

Я пытался отправить команду типа "rdmstea§" + Dns.GetHostName ();

Итак, есть какая-то идентификация.

Однако, поскольку сервер не знает, какой длины может быть заголовок, он не может правильно вырезать заголовок из пакета и просто собрать данные изображения.

Ниже приведены несколько примеров кода, когда клиент отправляет команду и что получает сервер.

КЛИЕНТ:

public static void SendMultiScreen(byte[] img)
{
    try
    {

        //string command = ("rdmstream§" + Dns.GetHostName()); //This is what I want to add.
        byte[] send = new byte[img.Length + 16]; //Create a new buffer to send to the server
        byte[] header = Encoding.Unicode.GetBytes("rdmstrea"); //Get the bytes of the header
        Buffer.BlockCopy(header, 0, send, 0, header.Length); //Copy the header to the main buffer
        fps = 800;
        Buffer.BlockCopy(img, 0, send, header.Length, img.Length); //Copy the image to the main buffer

        _clientSocket.Send(send, 0, send.Length, SocketFlags.None); //Send the image to the server


    }
    catch (Exception e) //Something went wrong
    {
        try
        {
            MessageBox.Show("Connection Ended");
            Thread.Sleep(3000);

            isDisconnect = true; //Disconnect from server

        }
        catch (Exception exc) //Something went really wrong
        {
            //Restart the application
            MessageBox.Show("Failed to send Screen  original ERROR : " + exc.Message);
            Thread.Sleep(10000);
            Application.Restart();
            return;
        }
    }
}

СЕРВЕР:

try //Try
{
    string header = Encoding.Unicode.GetString(recBuf, 0, 8 * 2); //Get the header of the message

    if (header == "rdmstrea") //If it's a remote desktop stream
    {

        using (MemoryStream stream = new MemoryStream()) //Declare the new memory stream
        {
            stream.Write(recBuf, 8 * 2, recBuf.Length - 8 * 2); //Copy the data from the buffer, to the memory stream
                                                                //Console.WriteLine("multiRecv Length: " + recBuf.Length);
            Bitmap deskimage = (Bitmap)Image.FromStream(stream); //Create a bitmap image from the memory stream
            if (resdataav == 0) //If resolution data is not set
            {
                resx = deskimage.Width; //Set the resolution width to the image width
                resy = deskimage.Height; //Set the resolution height to the image height
                resdataav = 1; //The resolution data is set now
            }
            SetImage(deskimage); //Set the image of the remote desktop
            Array.Clear(recBuf, 0, received); //Clear the buffer
            ignoreFlag = true; //Set the ignore flag

            GC.Collect(); //Call the garbage collector
            GC.WaitForPendingFinalizers();
            System.Threading.Thread.SpinWait(5000);
        }

Все кажется немного запутанным, но в основном, потому что при программировании клиента я хотел, чтобы заголовок был фиксированной переменной, я сказал серверу проверить 16 байтов в пакете «8 * 2». Итак, как сервер будет проверять, где заканчивается и начинается заголовок, если длина заголовка каждый раз будет разной?

Первые варианты, которые приходят на ум, - это либо использовать объект, у которого есть необходимая информация, и использовать двоичную сериализацию / десериализацию, либо самый простой - просто иметь фиксированную длину для идентификатора (скажем, 100 символов) и дополнять ее до этого длина на клиенте и обрезка на сервере.

Reinstate Monica Cellio 11.04.2018 12:19

Кстати, просто имейте где-нибудь глобальную переменную, которую вы можете использовать для размера буфера, вместо того, чтобы иметь 8 * 2 повсюду;)

Reinstate Monica Cellio 11.04.2018 12:20

@Archer Я дам установку буфера на 100 символов и посмотрю, как это работает, и я отправляю на свой сервер несколько команд разной длины, поэтому у меня будет столько же переменных, сколько у меня было бы 8 * 2 xD, спасибо за помощь хоть бутон!

Jeremy Griffin 11.04.2018 12:25

Не беспокойтесь - удачи :)

Reinstate Monica Cellio 11.04.2018 12:28
2
4
41
0

Другие вопросы по теме