Перейти к публикации
  • Сейчас на странице   Всего пользователей: 4   (0 пользователей, 4 гостя)

Rooster

Программирование[11]

var  

256 пользователей проголосовало

У вас нет прав на голосование в этом опросе, или на просмотр результатов опроса. Пожалуйста, войдите или зарегистрируйтесь для голосования в опросе.

Рекомендованные сообщения

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

Поделиться сообщением


Ссылка на сообщение
prokol9 написал 2 часа назад:

А что не так с Германией?

все так

Rintz написал 2 часа назад:

 

Rilay написал 3 часа назад:

Русверм тут при чем, тут не 2919191-ый размер, а нормальный

а они натуральные?

да

она жиробасска (в целом по гифке даже видно что там жир который чисто лифчиком удерживается в привлекательной форме)


 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение
Kant написал 2 часа назад:

офк резать придется

только там код должен быть вида

 

читать из сокета пока не прочитаешь длину заголовка

распарсить заголовок в структуру

посмотреть длину всего сообщения

 дочитать из сокета до длины сообщения

 обработать сообщение

готу1

 

а не та хуйня, что у тебя была написана с 100500 магических чисел "склеенных пакетов", которые нихуя не склеенные, просто сокет так их отдал, и всего прочего

да у меня блин требование что должны быть 2 функции грубо говоря

первая читает из сокета и передает весь пакет сразу

и вторая уже парсит и выдает готовые значения

то есть читать парсить читать парсить не получится


Лучший юзер — Rilay

 

Поделиться сообщением


Ссылка на сообщение
Just.Doit написал 17 часов назад:

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

 

Да да 20 лет ждем пока че то случится Нихуя не случилось пока


towBCf6.pngimage.png.6f88ac9ad688355eb803ba0b32e309ca.pngimage.png.c05354238865437022b3e4a97a835dbd.pngimage.png.0e8329f2b07e208ae8ef4e3f6878d126.png

 

 

 

Поделиться сообщением


Ссылка на сообщение
Rilay написал 20 минут назад:
Kant написал 2 часа назад:

офк резать придется

только там код должен быть вида

 

читать из сокета пока не прочитаешь длину заголовка

распарсить заголовок в структуру

посмотреть длину всего сообщения

 дочитать из сокета до длины сообщения

 обработать сообщение

готу1

 

а не та хуйня, что у тебя была написана с 100500 магических чисел "склеенных пакетов", которые нихуя не склеенные, просто сокет так их отдал, и всего прочего

да у меня блин требование что должны быть 2 функции грубо говоря

первая читает из сокета и передает весь пакет сразу

и вторая уже парсит и выдает готовые значения

то есть читать парсить читать парсить не получится

ну так вот всё в алгоритме кроме "обработать сообщение" это первая функция

 


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

Поделиться сообщением


Ссылка на сообщение
Grohuf написал 2 часа назад:

Я думал джастдуит получает почти десятку

 

По моему у него было около 80к евро когда то это 324,042 рублей в месяц чистыми

prokol9 написал 4 часа назад:

А что не так с Германией?

 

Зарплаты ниже чем на Украине


towBCf6.pngimage.png.6f88ac9ad688355eb803ba0b32e309ca.pngimage.png.c05354238865437022b3e4a97a835dbd.pngimage.png.0e8329f2b07e208ae8ef4e3f6878d126.png

 

 

 

Поделиться сообщением


Ссылка на сообщение

Если я верно помню немногим меньше 6к до налогов.


ward написал 04.01.2022 в 02:54:

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

mazt3r написал 20.09.2019 в 11:27:

ласт оф ас - хуета для лисят и прочих мальчиков с вагиной между ног.

 

Поделиться сообщением


Ссылка на сообщение

Ну это тотал пиздец тогда


towBCf6.pngimage.png.6f88ac9ad688355eb803ba0b32e309ca.pngimage.png.c05354238865437022b3e4a97a835dbd.pngimage.png.0e8329f2b07e208ae8ef4e3f6878d126.png

 

 

 

Поделиться сообщением


Ссылка на сообщение

Ну ты не забывай что у него жена и вроде дети, соотвественно налоги меньше чем ты там насчитал


ward написал 04.01.2022 в 02:54:

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

mazt3r написал 20.09.2019 в 11:27:

ласт оф ас - хуета для лисят и прочих мальчиков с вагиной между ног.

 

Поделиться сообщением


Ссылка на сообщение

Ну за 6к евро батрачить в Германии при этом не планируя получать там гражданство (судя по желанию переехать в Лондон)... ну такое себе. Я что-то смысла вообще не вижу. Вообще странно, что при такой высокой средней зарплате, программистам в ФРГ платят довольно мало.

Поделиться сообщением


Ссылка на сообщение
Kant написал 53 минуты назад:
Rilay написал 1 час назад:
Kant написал 3 часа назад:

офк резать придется

только там код должен быть вида

 

читать из сокета пока не прочитаешь длину заголовка

распарсить заголовок в структуру

посмотреть длину всего сообщения

 дочитать из сокета до длины сообщения

 обработать сообщение

готу1

 

а не та хуйня, что у тебя была написана с 100500 магических чисел "склеенных пакетов", которые нихуя не склеенные, просто сокет так их отдал, и всего прочего

да у меня блин требование что должны быть 2 функции грубо говоря

первая читает из сокета и передает весь пакет сразу

и вторая уже парсит и выдает готовые значения

то есть читать парсить читать парсить не получится

ну так вот всё в алгоритме кроме "обработать сообщение" это первая функция

 

Да, но прочитав заголовок, мы узнаем длину первого сообщения, а там идут два сообщения одновременно он посылает

То есть вид такой

Заголовок сообщение срс16 заголовок2 сообщение2 срс16(2)

В заголовке длина ток отдельного пакета

 

 

 


Лучший юзер — Rilay

 

Поделиться сообщением


Ссылка на сообщение

ТЕБЕ ПОЕБАТЬ СУКА В ОДНО ТСП ПАКЕТЕ ОНО ПРИШЛО ИЛИ НЕТ, СУКА ТЫ ЗАЕБАЛ

 

если ты в книжке прочитал первую строчку на странице, потом отошел на 5 минут и прочитал вторую строчку, а твой сосед прочитал их вместе, у тебя что смысл как-то поменялся?

 

никого не ебет в каком тсп пакете какая часть команды пришла, если твой девайс прислал 2 команды подряд и они влезли в один пакет, это лично его проблемы, через 5 минут не пришлет

DeadMage понравилось это

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

Поделиться сообщением


Ссылка на сообщение
Kant написал 4 минуты назад:

ТЕБЕ ПОЕБАТЬ СУКА В ОДНО ТСП ПАКЕТЕ ОНО ПРИШЛО ИЛИ НЕТ, СУКА ТЫ ЗАЕБАЛ

 

Можно вечно смотреть на три вещи:

На то как горит огонь;

На то как выебывается вова;
И на то как сеньер сгорев орёт на джуна.


ward написал 04.01.2022 в 02:54:

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

mazt3r написал 20.09.2019 в 11:27:

ласт оф ас - хуета для лисят и прочих мальчиков с вагиной между ног.

 

Поделиться сообщением


Ссылка на сообщение
(изменено)
Kant написал 22 минуты назад:

ТЕБЕ ПОЕБАТЬ СУКА В ОДНО ТСП ПАКЕТЕ ОНО ПРИШЛО ИЛИ НЕТ, СУКА ТЫ ЗАЕБАЛ

 

если ты в книжке прочитал первую строчку на странице, потом отошел на 5 минут и прочитал вторую строчку, а твой сосед прочитал их вместе, у тебя что смысл как-то поменялся?

 

никого не ебет в каком тсп пакете какая часть команды пришла, если твой девайс прислал 2 команды подряд и они влезли в один пакет, это лично его проблемы, через 5 минут не пришлет

ладно вот смотри

пришел пакет с двумя сообщениями

я прочитал заголовок, допрочитал длину, и отправил на обработку весь пакет или допрочитанное только?

логично что допрочитанное, вот ток по заданию отправить надо весь пакет перед обработкой

или типа делать так

читать заголовок, читать прочитанную длину, потом снова заголовок и длину?

и отправлять потом уже на обработку


Изменено пользователем Rilay

Лучший юзер — Rilay

 

Поделиться сообщением


Ссылка на сообщение

ты рофлишь или действительно тупой?


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

Поделиться сообщением


Ссылка на сообщение

Почему админы, когда обсуждают программирование, такие агрессивные?

Поделиться сообщением


Ссылка на сообщение
(изменено)

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);
    }
}

Как-то так. Опять стена непонятно зачем получилась, ну да ладно. А какой собственно вопрос был?


Изменено пользователем GoldRobot

ward написал 04.01.2022 в 02:54:

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

mazt3r написал 20.09.2019 в 11:27:

ласт оф ас - хуета для лисят и прочих мальчиков с вагиной между ног.

 

Поделиться сообщением


Ссылка на сообщение

спасибо за длиннопост

да я уже писал вроде что понимаю что вы хотите мне донести

просто это противоречит требованиям которые мне поставили :sad:

получается что мне надо  обработать/распарсить пакет после приема, и потом снова его распарсить в другой функции, тупость какая то выходит


Лучший юзер — Rilay

 

Поделиться сообщением


Ссылка на сообщение

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

×
×
  • Создать...