Как заполнить байтовый заголовок пустыми символами?

В настоящее время я пытаюсь добавить дополнительные байты в байтовый массив.

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

Это означает, что если у меня есть строковый заголовок «rdmstream§» + Dns.GetHostName () «, мне нужно добавить x байтов в конце или начать как заполнение, чтобы общая длина байта была равна 100.

Мне было интересно, возможно ли это?

Ниже приведен пример моего кода для установки длины заголовка:

 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


        }

Как видите, если длина сообщения составляет всего 8 символов, это нормально работает. Однако я хочу, чтобы символы в сообщении были переменными.

У меня не так много знаний о байтах, если честно, поэтому любая дополнительная помощь будет очень признательна.

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

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

Alex K. 11.04.2018 13:49

Проблема с расчетом размера? Попробуйте использовать % оператор и умножение. Или проблема в заполнении байтами выделенного байтового массива? С нулями? Затем вы можете очистить его (заполнить 0) перед копированием в него.

Sinatr 11.04.2018 13:53

@ AlexK.im очень новичок в программировании сокетов. Я нашел этот пример в Интернете, и он работает, но только для заданных значений. Я не уверен, как вы префикс данных.

Jeremy Griffin 11.04.2018 14:13

@Sinatr хорошо рассчитывает размер - это проблема, я пытаюсь создать приложение для мониторинга в школе, чтобы они могли контролировать компьютеры учеников. Таким образом, на каждом компьютере будет свой DNS.Hostname. Мне нужно иметь возможность идентифицировать каждое изображение, показываемое студентом, поэтому я решил, что добавление его в заголовок - это правильная причина, по которой мне нужно идти.

Jeremy Griffin 11.04.2018 14:14
0
4
245
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

string hostName = "OhWhatEver".PadRight(100)

затем используйте его в качестве входных данных для вызова GetBytes.

Редактировать: Если вы не можете жить с пробелами, используйте это:

byte[] header = new byte[100];
byte[] hostname = System.Text.Encoding.Unicode.GetBytes("rdmstream§" + System.Net.Dns.GetHostName());
Array.Copy(hostname, header, hostname.Length);

Я попробую. Заполнение кажется мне сейчас самым простым методом.

Jeremy Griffin 11.04.2018 14:15

Редактирование сработало на моем клиенте, просто нужно, чтобы мой сервер проверил 100-й байт. Спасибо за помощь @toAtwork

Jeremy Griffin 11.04.2018 15:13

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

Jeremy Griffin 11.04.2018 15:15

Если вас беспокоит фрагментация пакетов: Socket имеет перегрузки для отправки список сегментов буфера за одну операцию. Это означает, что вы можете сделать что-то вроде:

var segments = new List<ArraySegment<byte>>();
segments.Add(header);
segments.Add(img);

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

byte[] buffer = new byte[MaxLength];
var segments = new List<ArraySegment<byte>>();
segments.Add(default); // placeholder
segments.Add(img);
foreach(...) {
    string val = ...
    int len = encoding.GetBytes(val, 0, val.Length, buffer, 0);
    segments[0] = new ArraySegment<byte>(buffer, 0, len);
    thisSocket.Send(segments);
}

Тем не мение! для этого обычно требуется какое-то обрамление в заголовке - либо контрольное значение (возможно, завершающий CR / LF / CRLF), либо префикс количества байтов, которые являются строкой - здесь len.


Если это действительно невозможно ... просто перебрать неиспользуемую часть массива и установите то, что вы хотите, или используйте Array.Clear, если ноль в порядке.

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

Jeremy Griffin 11.04.2018 14:16

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

Jeremy Griffin 11.04.2018 14:16

@JeremyGriffin, если вас не беспокоит фрагментация пакетов: просто сделайте два отдельных вызова Send ... один для заголовка переменной, а другой для фиксированной полезной нагрузки. Или используйте сегментный подход, описанный выше.

Marc Gravell 11.04.2018 14:20

Я тоже пробовал этот метод. У меня есть событие для sendstring ("Сообщение"); Однако, когда я сначала отправляю строку, окно с картинками, в котором хранится это изображение, загружается неправильно, я предполагаю, потому что сервер проверяет полученный текст и полученное изображение одновременно.

Jeremy Griffin 11.04.2018 14:43

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