powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Байты и структуры
12 сообщений из 12, страница 1 из 1
Байты и структуры
    #39226126
Фотография Feg16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю сюда-ли, но вроде сюда. Набрасываю стендовый макет клиента, из операций нужно соединиться, передать данные, получить ответ. И максимально быстро сделать пару миллионов повторений с параллельно запущенным десятком клиентов.

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

Что имеем - набор структур
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public struct PacketBase
{
	public ushort User;
	public ushort Command;

}

public struct PacketLoginWrite
{
	public ushort EmailLength;
	public byte[] Email;
	public ushort PasswordLength;
	public byte[] Password;
}

Которые я хочу отправить по соединенному сокету как-то так, особенно с заполнением не заморачивался
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private static void WorkLogin(Socket connection)
{
	string Email = "test@test.ru";
	string Password = "test";

	PacketLoginWrite plogin;
	plogin.EmailLength = (ushort)Email.Length;
	plogin.Email = Encoding.Default.GetBytes (Email);
	plogin.PasswordLength = (ushort)Password.Length;
	plogin.Password = Encoding.Default.GetBytes (Password);

	PacketBase pbase;
	pbase.User = 0;
	pbase.Command = 1;

	connection.Send (bytes[]);
}

Так вот собственно вопрос. Если нельзя предоставить стуктуру как набор байт (как например в дельфи) - как можно переделать чтобы максимально минимизировать маршаллинг? Ведь даже копирование данных структуры в байт-набор уже накладные расходы.
...
Рейтинг: 0 / 0
Байты и структуры
    #39226132
Фотография Feg16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Часть выводов сделал с статьи тестов http://genericgamedev.com/general/converting-between-structs-and-byte-arrays/
...
Рейтинг: 0 / 0
Байты и структуры
    #39226147
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитай про [unsafe] и указатели. byte[] скорее всего будет указатель на массив, а не сам массив. Не проверял, только теорию читал.
...
Рейтинг: 0 / 0
Байты и структуры
    #39226148
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Feg16, авторВедь даже копирование данных структуры в байт-набор уже накладные расходы.
от этого никуда имхо не деться.
может попробовать более нативно типа:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    public struct PacketLoginWrite
    {
        public ushort EmailLength;
        public byte[] Email;
        public ushort PasswordLength;
        public byte[] Password;

        public byte[] GetBytes()
        {
            
          http://stackoverflow.com/questions/415291/best-way-to-combine-two-or-more-byte-arrays-in-c-sharp
        }
    }

    internal abstract class Factory<T> where T : struct
    {
        public abstract T GetInstance(byte[] bytes);
    }
...
Рейтинг: 0 / 0
Байты и структуры
    #39226244
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Feg16Если нельзя предоставить стуктуру как набор байт
С чего бы это? http://stackoverflow.com/questions/3278827/how-to-convert-a-structure-to-a-byte-array-in-c
...
Рейтинг: 0 / 0
Байты и структуры
    #39226286
Фотография Feg16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныС чего бы это?Первый же ответ в ссылке - маршаллинг, с накладными расходами в копировании, о чем было предупреждение в начале поста.

Но похоже кроме этого варианта особого выбора нету, осталось только определиться - простота через маршаллинг либо быстродействие и кучи кода через врайтер.
...
Рейтинг: 0 / 0
Байты и структуры
    #39226374
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Feg16Сон Веры ПавловныС чего бы это?Первый же ответ в ссылке - маршаллинг, с накладными расходами в копировании, о чем было предупреждение в начале поста.
А вы потрудитесь промотать темы по ссылке немного ниже.
...
Рейтинг: 0 / 0
Байты и структуры
    #39226405
Фотография Feg16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныА вы потрудитесь промотать темы по ссылке немного ниже.Проматывал. Может потрудитесь скопипастить сюда кусок, на который стоит обратить внимание и который небыл обговорен выше?
...
Рейтинг: 0 / 0
Байты и структуры
    #39226505
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Feg16Проматывал. Может потрудитесь скопипастить сюда кусок, на который стоит обратить внимание и который небыл обговорен выше?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    [DllImport("kernel32.dll", EntryPoint = "CopyMemory", SetLastError = false)]
    private static unsafe extern void CopyMemory(void *dest, void *src, int count);

    private static unsafe byte[] Serialize(TestStruct[] index)
    {
        var buffer = new byte[Marshal.SizeOf(typeof(TestStruct)) * index.Length];
        fixed (void* d = &buffer[0])
        {
            fixed (void* s = &index[0])
            {
                CopyMemory(d, s, buffer.Length);
            }
        }

        return buffer;
    }
...
Рейтинг: 0 / 0
Байты и структуры
    #39226556
Фотография Feg16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И? Однофигственный маршалинг и накладные расходы в копировании, причем если не ошибаюсь пример - более медленный чем ранее представленные примеры.
...
Рейтинг: 0 / 0
Байты и структуры
    #39226671
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Feg16Но похоже кроме этого варианта особого выбора нету, осталось только определиться - простота через маршаллинг либо быстродействие и кучи кода через врайтер.А точно тонким местом будет "лишнее" копирование данных в памяти, а не передача данных через сокет? Вероятно лучше сначала сделать "по обычному", потом оптимизировать по необходимости.
...
Рейтинг: 0 / 0
Байты и структуры
    #39226681
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Feg16,
А как то так не рассматриваешь?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    public struct PacketBase
    {
        public ushort User;
        public ushort Command;
        public byte[] ToBytes()
        {
            var res = new byte[sizeof(ushort) * 2];
            Array.Copy(BitConverter.GetBytes(User), 0, res, 0, 2);
            Array.Copy(BitConverter.GetBytes(Command), 0, res, 2, 2);
            return res;
        }
        public static PacketBase FromBytes(byte[] arr)
        {
            PacketBase res;
            res.User = BitConverter.ToUInt16(arr, 0);
            res.Command = BitConverter.ToUInt16(arr, 2);
            return res;
        }
    }


Только с полями типа public byte[] Email; придется покулупаться. Или делать фиксированной длины или 1-2-3-4 байтами писать длину.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Байты и структуры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]