DeadMage #81 Posted January 29, 2022 Ещё в го есть рефлексия, поэтому ты ещё можешь весь хедер сразу читать в бигендниан, не конвртить каждые 4 байта вручную. Quote Share this post Link to post
Grohuf #82 Posted January 29, 2022 suez написал 11 часов назад: https://habr.com/ru/post/648227/#comment_24002523 нашел джастдуита на хабре Я думал джастдуит получает почти десятку Quote Share this post Link to post
Just.Doit #83 Posted January 29, 2022 prokol9 написал 2 часа назад: А что не так с Германией? все так Rintz написал 2 часа назад: Rilay написал 3 часа назад: Русверм тут при чем, тут не 2919191-ый размер, а нормальный а они натуральные? да она жиробасска (в целом по гифке даже видно что там жир который чисто лифчиком удерживается в привлекательной форме) Quote очень крутые котейкиКому-то пизды дал - нужно сделать скрин обязательно. (с) Solo Share this post Link to post
Rilay #84 Posted January 29, 2022 Kant написал 2 часа назад: офк резать придется только там код должен быть вида читать из сокета пока не прочитаешь длину заголовка распарсить заголовок в структуру посмотреть длину всего сообщения дочитать из сокета до длины сообщения обработать сообщение готу1 а не та хуйня, что у тебя была написана с 100500 магических чисел "склеенных пакетов", которые нихуя не склеенные, просто сокет так их отдал, и всего прочего да у меня блин требование что должны быть 2 функции грубо говоря первая читает из сокета и передает весь пакет сразу и вторая уже парсит и выдает готовые значения то есть читать парсить читать парсить не получится Quote Лучший юзер — Rilay Share this post Link to post
Vova #85 Posted January 29, 2022 Just.Doit написал 17 часов назад: в рф быть когда там скоро совсем гайки пережмут и случится беларусь или казахстан тоже нафиг надо Да да 20 лет ждем пока че то случится Нихуя не случилось пока Quote Share this post Link to post
Kant #86 Posted January 29, 2022 Rilay написал 20 минут назад: Kant написал 2 часа назад: офк резать придется только там код должен быть вида читать из сокета пока не прочитаешь длину заголовка распарсить заголовок в структуру посмотреть длину всего сообщения дочитать из сокета до длины сообщения обработать сообщение готу1 а не та хуйня, что у тебя была написана с 100500 магических чисел "склеенных пакетов", которые нихуя не склеенные, просто сокет так их отдал, и всего прочего да у меня блин требование что должны быть 2 функции грубо говоря первая читает из сокета и передает весь пакет сразу и вторая уже парсит и выдает готовые значения то есть читать парсить читать парсить не получится ну так вот всё в алгоритме кроме "обработать сообщение" это первая функция Quote Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью. Share this post Link to post
Vova #87 Posted January 29, 2022 Grohuf написал 2 часа назад: Я думал джастдуит получает почти десятку По моему у него было около 80к евро когда то это 324,042 рублей в месяц чистыми prokol9 написал 4 часа назад: А что не так с Германией? Зарплаты ниже чем на Украине Quote Share this post Link to post
GoldRobot #88 Posted January 29, 2022 Если я верно помню немногим меньше 6к до налогов. Quote ward написал 04.01.2022 в 02:54: Hades для стада долбоебичей которые прокликивали Дэш и думали ебать они в артхаузнвй рогалик играют, не такие как все. mazt3r написал 20.09.2019 в 11:27: ласт оф ас - хуета для лисят и прочих мальчиков с вагиной между ног. Share this post Link to post
GoldRobot #90 Posted January 29, 2022 Ну ты не забывай что у него жена и вроде дети, соотвественно налоги меньше чем ты там насчитал Quote ward написал 04.01.2022 в 02:54: Hades для стада долбоебичей которые прокликивали Дэш и думали ебать они в артхаузнвй рогалик играют, не такие как все. mazt3r написал 20.09.2019 в 11:27: ласт оф ас - хуета для лисят и прочих мальчиков с вагиной между ног. Share this post Link to post
Grohuf #91 Posted January 29, 2022 Ну за 6к евро батрачить в Германии при этом не планируя получать там гражданство (судя по желанию переехать в Лондон)... ну такое себе. Я что-то смысла вообще не вижу. Вообще странно, что при такой высокой средней зарплате, программистам в ФРГ платят довольно мало. Quote Share this post Link to post
Rilay #92 Posted January 29, 2022 Kant написал 53 минуты назад: Rilay написал 1 час назад: Kant написал 3 часа назад: офк резать придется только там код должен быть вида читать из сокета пока не прочитаешь длину заголовка распарсить заголовок в структуру посмотреть длину всего сообщения дочитать из сокета до длины сообщения обработать сообщение готу1 а не та хуйня, что у тебя была написана с 100500 магических чисел "склеенных пакетов", которые нихуя не склеенные, просто сокет так их отдал, и всего прочего да у меня блин требование что должны быть 2 функции грубо говоря первая читает из сокета и передает весь пакет сразу и вторая уже парсит и выдает готовые значения то есть читать парсить читать парсить не получится ну так вот всё в алгоритме кроме "обработать сообщение" это первая функция Да, но прочитав заголовок, мы узнаем длину первого сообщения, а там идут два сообщения одновременно он посылает То есть вид такой Заголовок сообщение срс16 заголовок2 сообщение2 срс16(2) В заголовке длина ток отдельного пакета Quote Лучший юзер — Rilay Share this post Link to post
Kant #93 Posted January 29, 2022 ТЕБЕ ПОЕБАТЬ СУКА В ОДНО ТСП ПАКЕТЕ ОНО ПРИШЛО ИЛИ НЕТ, СУКА ТЫ ЗАЕБАЛ если ты в книжке прочитал первую строчку на странице, потом отошел на 5 минут и прочитал вторую строчку, а твой сосед прочитал их вместе, у тебя что смысл как-то поменялся? никого не ебет в каком тсп пакете какая часть команды пришла, если твой девайс прислал 2 команды подряд и они влезли в один пакет, это лично его проблемы, через 5 минут не пришлет DeadMage likes this Quote Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью. Share this post Link to post
GoldRobot #94 Posted January 29, 2022 Kant написал 4 минуты назад: ТЕБЕ ПОЕБАТЬ СУКА В ОДНО ТСП ПАКЕТЕ ОНО ПРИШЛО ИЛИ НЕТ, СУКА ТЫ ЗАЕБАЛ Можно вечно смотреть на три вещи: На то как горит огонь; На то как выебывается вова; И на то как сеньер сгорев орёт на джуна. Quote ward написал 04.01.2022 в 02:54: Hades для стада долбоебичей которые прокликивали Дэш и думали ебать они в артхаузнвй рогалик играют, не такие как все. mazt3r написал 20.09.2019 в 11:27: ласт оф ас - хуета для лисят и прочих мальчиков с вагиной между ног. Share this post Link to post
Rilay #95 Posted January 29, 2022 (edited) Kant написал 22 минуты назад: ТЕБЕ ПОЕБАТЬ СУКА В ОДНО ТСП ПАКЕТЕ ОНО ПРИШЛО ИЛИ НЕТ, СУКА ТЫ ЗАЕБАЛ если ты в книжке прочитал первую строчку на странице, потом отошел на 5 минут и прочитал вторую строчку, а твой сосед прочитал их вместе, у тебя что смысл как-то поменялся? никого не ебет в каком тсп пакете какая часть команды пришла, если твой девайс прислал 2 команды подряд и они влезли в один пакет, это лично его проблемы, через 5 минут не пришлет ладно вот смотри пришел пакет с двумя сообщениями я прочитал заголовок, допрочитал длину, и отправил на обработку весь пакет или допрочитанное только? логично что допрочитанное, вот ток по заданию отправить надо весь пакет перед обработкой или типа делать так читать заголовок, читать прочитанную длину, потом снова заголовок и длину? и отправлять потом уже на обработку Edited January 29, 2022 by Rilay Quote Лучший юзер — Rilay Share this post Link to post
Kant #96 Posted January 29, 2022 ты рофлишь или действительно тупой? Quote Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью. Share this post Link to post
Grohuf #97 Posted January 29, 2022 Почему админы, когда обсуждают программирование, такие агрессивные? Quote Share this post Link to post
GoldRobot #98 Posted January 29, 2022 (edited) PS: Вообще дедмаге говорил что вы с TCP разобрались, но похоже что нет. Потому начнем с нуля. ладно вот смотри Тебе вообще похуй сколько там пакетов пришло, десять двадцать тридцать милиард трилиард сексилион или 0. Сколько там в них сообщений, десять двадцать сотня трилион. Это не твоя забота, вероятнее всего ты физически не имеешь доступ к TCP пакетам, ибо за тебя это делает ОС и библиотеки реализуюшие сеть. И так же ты не контролируешь сколько пакетов уйдет, и как данные тобой отправленные разобьются по пакетам, если отправляешь сам. Ты можешь отправить 10 сообщений, и они уйдут одним пакетом, по дороге встретится роутер с маленьким MTU, и этот пакет разобьется на 100 пакетов, а читающий может увидеть вообще только 5 "чтений" (типа то что ты называешь пакетами, их 5 будет). Поэтому TCP с точки зрения его пользования вообще не про пакеты, это не пакетный протокол в отличии от UDP. Для простоты, UDP - ПАКЕТНЫЙ протокол. TCP это ПОТОКОВЫЙ протокол. Тоесть в UDP ты получаешь и отправляешь ПАКЕТЫ, а c TCP ты отправляешь и получаешь последовательный неделимый поток данных (с гарантированным порядком само собой). Иными словами, когда ты читаешь, ты получаешь поток байт, которые отправил собственно отправляющий. Вот как он записал, в каком порядке, так оно и будет. Когда ты читаешь заголовок, ты читаешь именно то что отправил отправляющий, от TCP это не зависит. Там ничего не зависит от TCP уровня, вообще ничего, вообще никак он не влияет. Тоесть получается следующее, ты пишешь async_read (или как у тебя там), читаешь какое-то количество байт из потока данных в буффер, и далее зная кто с тобой соединен с той стороны, ты эти байты можешь интерпретировать согласно вашей договоренности. В твоем случае это вон тот протокол Командами. Будем называть именно Команды, как у тебя написано в доке, и команды это твои минимальные челостные единицы данных. Все, тут договариваемся что никаких пакетов, никаких сообщений нету, только команды и поток данных с временным хранилищем в буфере. Сейчас я помахаю хуем, и ты забываешь слова пакет, а так же ситуацию "пришло много сообщений сразу". Начинаю, .|. вжух ./. вжух .\. вжух .|. и ты забыл! Хорошо, с этим разобрались. Давайте решим как нам решать Цель? Стоп, а какая у нас цель? А хуй его знает, я ваш треп не читал, мне похуй. Я ее поставлю сам. Так вот, цель у нас следующая будет "Налабать кода который приняв объект реализующий TCP соединение прочитает из него команду, и вернет ее в распаршеном виде" Хорошо, теперь нужно понять, а что собственно делать с этим потоком данных из соединения, как их превратить в команды? Да и как оно вообще должно выглядеть по хорошему (идеал у каждого свой)? А по хорошему, нужно разбить получение десериализованной команды из сети на следующие задачи: 1) прочитать команду из потока; 2) распарсить ее; 3) отдать наверх. И всё...А стоп! У тебя то команды не фиксированного размера, у тебя некий CommandBody внутри команды есть, у которого размер разнится, и он указан в заголовке в поле CommandSize. Неудобно, и что же делать? А придется чутка разбить вышенаписанные пункты и их перемешать. 1) прочитать заголовок; 2) распарсить его; 3) дочитать тело команды и некий хвост (CRC); 4) распарсить их; 5) вернуть команду. Rilay написал 3 часа назад: да у меня блин требование что должны быть 2 функции грубо говоря, первая читает из сокета и передает весь пакет сразу и вторая уже парсит и выдает готовые значения, то есть читать парсить читать парсить не получится А вот эти требования ты запихиваешь в жопу тому, кто их тебе поставил. Сходу и не дробя, это будет твоим местом роста. Ты их не можешь удовлетворить физически, ты не можешь прочитать Команду не зная ее размер, а узнать ее размер ты можешь только прочитав заголовок из сети. Кстати, вполне возможно, что это была проверка твоей компетенции от поехавшого ментора. Итак, о чем это я говорил? Ах да веренемся к никому не нужной хуйне которую я пишу пока угли греются. Решение поставленной цели. Кто-то решает ее сверху вниз, кто-то снизу верх. Мы сделаем по второму пути, от малого к большому, но заранее определим сигнатуру функции главной функции func read_command(connection) (Command, Buffer); // возвращает распаршенную команду, и оставшиеся невостребованные байты в буффере Что у нас самое мало и первое? Верно, чтение из сокета (соединения) столько байт, сколько нужно для заголовка. Для этого нам нужно знать размер собственно заголовка, сколько в нем байт. У тебя там была кая-то структура, ты на нее мапил данные из буфера, ну так возмем ее. Эта структура называлась 'req' (ебанутая нотация, тьфу). В C++ можно было бы написать const header_size = sizeof(req);, и в header_size у тебя будет теперь хранится сколько байт нужно минимально прочитать из потока, что бы получить заголовок. Но можно сделать и по другому const size_t header_size = 11; // если го не может сказать размер структуры Из этого мы можем уже примерно собрать кусочек чтения заголовка ... buffer += connection.Read(header_size - buffer.size()); //ждем пока нам пришлют недостающие байты для заголовка, предполагается если в Read отдали <1, то она сразу вернется с пустым буфером header, buffer = parse_header(header_raw) // prase_header на твоей совести, возвращает собственно распаршенный заголовок и оставшийся кусок буфера, потому что в нем может оказаться больше данных чем нужно для заголовка ... Хорошо, мы получили заголовок, далее нам нужно прочитать оставшуюся часть команды. Но ведь мы еще не опредилил структуру для CRC и команды, потому определим ее ... struct CRC { uint_t command_quantity = 0; uint32_t crc_16 = 0; } const size_t crc_size = sizeof(CRC); struct Command { req header{}; Union[CommandDie, CommandGetCoords, CommandEtc...]command_body{}; // Я незнаю как в го, но вдруг у тебя имеется некоторый Union класс который может в себе содержать один из заранее определенных классов, и этими классами ты определить уже собственно варианты тела команды. в С++ имеется std::variant, для примера, оно отлично подходит в таких случаях } ... Теперь мы можем дописать кусок чтения остатка от команды. ... buffer += connection.read(header.command_body_length + crc_size - buffer.size()) //читаем недополученные из сети Command command{}; // создаем объект команды command.command_body, buffer = parse_body(buffer) // возвращает тело и оставшиеся неиспользуемые байты в буфере command.crc, buffer = parse_crc(buffer) // уже сам догадаешься command.header = header; // закидываем туда заголовок еще return command, buffer; ... Готово! И собираем кусочки struct CRC { uint_t command_quantity = 0; uint32_t crc_16 = 0; } const size_t crc_size = sizeof(CRC); struct Command { req header{}; Union[CommandDie, CommandGetCoords, CommandEtc...]command_body{}; // Я незнаю как в го, но вдруг у тебя имеется некоторый Union класс который может в себе содержать один из заранее определенных классов, и этими классами ты определить уже собственно варианты тела команды. в С++ имеется std::variant, для примера, оно отлично подходит в таких случаях } header_size = sizeof(req); func read_command(connection) (Command, Buffer) { buffer += connection.Read(header_size - buffer.size()); //ждем пока нам пришлют недостающие байты для заголовка, предполагается если в Read отдали <1, то она сразу вернется с пустым буфером header, buffer = parse_header(header_raw) // prase_header на твоей совести, возвращает собственно распаршенный заголовок и оставшийся кусок буфера, потому что в нем может оказаться больше данных чем нужно для заголовка buffer += connection.read(header.command_body_length + crc_size - buffer.size()) //читаем недополученные из сети Command command{}; // создаем объект команды command.command_body, buffer = parse_body(buffer) // возвращает тело и оставшиеся неиспользуемые байты в буфере command.crc, buffer = parse_crc(buffer) // уже сам догадаешься command.header = header; // закидываем туда заголовок еще return command, buffer; } И применять тобою написанное будую следующим образом func client_loop() { connect = tcp.connect(params); buffer = array{}; while(true) { command, buffer = read_command(connect, buffer); process_command(command); } } Как-то так. Опять стена непонятно зачем получилась, ну да ладно. А какой собственно вопрос был? Edited January 29, 2022 by GoldRobot ShadesOfGrey, madvlaydin, DeadMage and 1 other like this Quote ward написал 04.01.2022 в 02:54: Hades для стада долбоебичей которые прокликивали Дэш и думали ебать они в артхаузнвй рогалик играют, не такие как все. mazt3r написал 20.09.2019 в 11:27: ласт оф ас - хуета для лисят и прочих мальчиков с вагиной между ног. Share this post Link to post
Grohuf #99 Posted January 29, 2022 кто прочитал, тот сифа suez, Kant, sol1tary and 8 others like this Quote Share this post Link to post
Rilay #100 Posted January 29, 2022 спасибо за длиннопост да я уже писал вроде что понимаю что вы хотите мне донести просто это противоречит требованиям которые мне поставили получается что мне надо обработать/распарсить пакет после приема, и потом снова его распарсить в другой функции, тупость какая то выходит Quote Лучший юзер — Rilay Share this post Link to post