wex
в мапе
погоди а обьекты внутри мапа нельзя менять(
Илья
почему?
wex
ошибка
wex
cannot assign to struct field users[string(args[1])].write in map
Илья
ошибка
u := users[...] u.write
Илья
но тогда храни указатель
wex
u := users[...] u.write
это чтоб получить write а изменить его можно?
Юра (Юрий Александрович)
Да не перепутаются внутри одного коннекшена ваши сообщения. Даже если из двух мест писать в одно TCP-соединение, сам драйвер TCP проследит за тем, чтобы отправленное пришло в том же порядке. Причем проблемы с доставкой в одном направлении не влияют на отправку в другом направлении.
Юра (Юрий Александрович)
И если отправитель данных на своем прикладном уровне что-то там подтупляет, сервисные фреймы TCP с квитирующим списком пакетов все равно будут идти, лишь бы не зависал сам комп.
Юра (Юрий Александрович)
я изначаьно делал все в одном соединении получилась каша, я пытался ее исправить
Значит ошибка в проектировании/реализации протокола. Ну как-то ж сотни игр умудряются в одном TCP-соединении передавать сотни разнообразных игровых взаимодействий и служебных пакетов.
wex
: )
Юра (Юрий Александрович)
Тут надо сделать над собой волевое усилие
Юра (Юрий Александрович)
у вас два соединения, чтобы в каждой порции данных съкономить один байт на код типа сообщения?
Юра (Юрий Александрович)
Который вы просто не передаете, т.к. тип сообщения вы определяете по тому, на какой коннект оно пришло?
Илья
ну опять таки сервер может сам управлять запросами
wex
ну смотрите есть отдельный поток, который в бесконечном цикле прослушывает соединение, пытается из него достать один байт Этот один байт - означат длинну сообщения После получения этого байта - запрашивается сообщение указанной длинны и так, пока не будт получен нулево байт потом весь этот набор сообщений обрабатывается и все идет по новой Если я в другом потоке отправлю данные на сервер и сразу после отправки выполню conn.recv в ожидании получить от сервера один байт - этот байт получит не поток, который ждет ответ от сервера, а поток, который ждет от сервера сообщения(призывы к действию)
Юра (Юрий Александрович)
нулевой байт - это что?
wex
означате конец сообщений
Кіт ✙
\x00
а зачем, если у тебя и так длина сообщения известна?
Юра (Юрий Александрович)
А зачем вам нулевой байт, если длина сообщения уже записана и так?
Юра (Юрий Александрович)
А зачем я второй вопрос такой же написал?..🤔
wex
а зачем, если у тебя и так длина сообщения известна?
известна длинна каждого отдельного слова в предложении нулевой байт - это точка, конец предложения
Vladislav
всё, уже не нужна?
wex
а как же экономия байтов?
она есть как еще можно сэконмить?
Кіт ✙
ничо нипонил
в общем, у автора что-то пиздец страшное
wex
хах
wex
да не особо, вроде
Кіт ✙
это не хах, это не шутки
Кіт ✙
у тебя реально каша просто жесть
wex
а как предлагаешь? вот мне нужно при запуске клиента сообщить серверу, что вот привет, у меня такое то имя сервер должен всем текущим клиентам сообщить, что вот такой то добавился и должен сказать этому чуваку, мол, окей, ты проходишь
wex
слишком много воды у него
Юра (Юрий Александрович)
а как предлагаешь? вот мне нужно при запуске клиента сообщить серверу, что вот привет, у меня такое то имя сервер должен всем текущим клиентам сообщить, что вот такой то добавился и должен сказать этому чуваку, мол, окей, ты проходишь
Должно быть так. У вас поверх TCP-соединения (если хотите использовать TCP) стоит "читатель пакетов". ваши пакеты должны иметь структуру, наприемр, Байт - длина Байт - тип массив-полезная нагрузка. Читатель пакетов постоянно пытается из этого соединения высасывать целые пакеты по принципу "считал байт - дочитываешь пакет". Дальше он передает этот прочитанный пакет следующему уровню: "анализатор типов пакетов".
Юра (Юрий Александрович)
Аналазитор типов пакетов по коду пакета смотрит, кому его послать дальше. Дальше у вас есть несколько разных обработчиков типов пакетов.
Кіт ✙
слишком много воды у него
ну тогда возьми предложенный выше мною протокол
Vladislav
протобаф получается?)
TLV - они все на одно лицо. Tag-Length-Value
Юра (Юрий Александрович)
а типы пакетов - это что за зверь?
Если получается, это хорошо. Плохо, когда не получается.
Vladislav
вроде bson по сути так же кодируется
Кіт ✙
ну тогда возьми предложенный выше мною протокол
заведи там два бита под тип пакета в заголовочном байте
Юра (Юрий Александрович)
а если длинна больше, чем 256 байт?
Ах ты ж!.. Ну сейчас же у тебя байт на длину, и ничего, нормально?
wex
ну у меня неограниченое кол-во таких вот слов в предложении
Юра (Юрий Александрович)
(писк цензуры) int - длина пакета.
Юра (Юрий Александрович)
что такое "предложение" в данном случае?
Vladislav
https://developers.google.com/protocol-buffers/docs/encoding#varints
Vladislav
как эффективно кодировать инты переменной длины
wex
что такое "предложение" в данном случае?
набор строк "длинна:сообщение"
Vladislav
только ещё больше протобаф получается
Юра (Юрий Александрович)
набор строк "длинна:сообщение"
укладывайте это все в пакет.
Vladislav
настолько, что уже пора бы и правда взять протобаф
wex
укладывайте это все в пакет.
но в таком случае я не смогу уложить слов больше, чем на 256 байт
wex
а щас я могу любое кол-во 256-байтных слов отправить
Юра (Юрий Александрович)
набор строк "длинна:сообщение"
все, что готовится целиком, отправляется целиком и обрабатывается целиком - это пакет. А дальше в нем какую хотите структуру предусматривайте, хоть дерево из слов.
Юра (Юрий Александрович)
но в таком случае я не смогу уложить слов больше, чем на 256 байт
делайте длину пакета int64 и укладывайте, сколько хотите 😊
Юра (Юрий Александрович)
ну вы ж там можете как-то сами выбрать между инт8, инт16, инт32 и инт64 подходящую переменную для длины пакета? Еще про какой-то varint интересный пишут.
wex
ну а как узнать, какая длинна у слова, означающее длинну пакета?)
Юра (Юрий Александрович)
А с какой стати длину пакета определяет слово?
wex
набор байтов)
Юра (Юрий Александрович)
... я, конечно, понимаю, что "вначале было слово", но это не наш случай.
wex
)
Sharifzoda
Вечер добрый всем
Sharifzoda
Можете кое с чем помочь?
Кіт ✙
nometa.xyz)
мужик, с твоими сетевыми технологиями, не надо
wex
мужик, с твоими сетевыми технологиями, не надо
а что тебе мои сетевые технологии?
wex
все работает как часы
Юра (Юрий Александрович)
ну а как узнать, какая длинна у слова, означающее длинну пакета?)
Открылся у нас коннекшн. и дальше мы в цикле (вечном) читаем - инт - длина - потом остальное тело. - Повторить.
Кіт ✙
все работает как часы
настолько, что аж на 2 сокета