Задать вопрос
  • Теряются/бьются UDP пакеты на localhost, так и должно быть?

    @MarkusD Куратор тега C++
    Kalombyr, ясно. У тебя тут, вероятно, целый букет заболеваний. И я ведь правильно понимаю что ты не проверяешь ошибку при отправке данных в своем коде?
    Конкретику я все так же не могу выдать потому что по такому описанию надо смотреть код. А это может занять много времени, чего я не могу тебе предоставить.
    Поэтому я просто опишу то, что подозреваю исходя из твоего описания.

    Короткие датаграммы - это хорошо. В локальной петле MTU имеет размер 64КБ. Пакеты в 1КБ - это уже хорошо.
    Шаринг сокета - это одна из причин потери пакетов. Вот попробуй угадать, кто должен принять трафик, когда сокет одновременно читают N клиентов? Там просто кто первый прочитал, того и тапки.
    Пакеты в локальной петле для протокола UDP теряться будут только если ты их шлешь без меры. У локальной петли есть свой промежуточный буфер для передаваемых данных. Когда этот буфер забивается данными, а на том конце их так и не начали читать, sendto возвращает тебе ошибку, которую ты должен разобрать и понять.
    Поэтому я и подозреваю что у тебя ошибки не обрабатываются.

    Проверь попутно размеры буфера приема и буфера отправки в своем сокете. Это делается через getsockopt или его аналог для Qt. В POSIX свойства называются SO_RCVBUF и SO_SNDBUF.
  • Можно ли подменить WS2_32 библиотеку и есть ли готовая обёртка?

    @MarkusD Куратор тега C++
    Kalombyr, как насчет того чтобы дать ответ на мои вопросы?
    Ты, конечно, можешь не отвечать. Но это ведь тебе нужно чтобы у тебя всё начало работать.
  • Как можно исправить ошибку сборки jsonlib при ее установке через pip?

    Mr_Kurator , почему люди должны портить свои глаза в попытках разобрать мыло на твоих скриншотах?
    Может быть тебе стоит удалить скриншот с текстом и выставить текст в соответствующем теге?
    Примерно так, как того требует П3.8 регламента работы сервиса.
  • Теряются/бьются UDP пакеты на localhost, так и должно быть?

    @MarkusD Куратор тега C++
    Kalombyr , а конкретика где?
    Какой у тебя трафик? Какой размер датаграммы? Какая частота опроса сокета тут и там?
    С какими флагами делаешь отсылку и прием датаграмм?
  • Как обходить защиту от записи экрана на сайте?

    mercmarcus
    upd2. Решено. Установил OBS и в источнике показал браузер (ссылку).

    Это принято писать в самостоятельном ответе и помечать ответ как решение.
    Не оставляй свой вопрос без решения.
  • Возможно ли создать на с++ дополнительное консольное окно?

    @MarkusD Куратор тега C++
    v12maksv13
    вот код

    Прошу повторно ознакомиться с регламентом работы сервиса и обратить внимание на П3.8.
    Неразборчивый текст в мыльных изображениях никого не интересует. Код нужно оформлять согласно регламенту.
  • Как работают массивы в с++?

    @MarkusD Куратор тега C++
    Borshevistiy, ты фотопленку глазами видел же? Знаешь что это такое? Сможешь ведь отсчитать N кадров от первого чтобы попасть на N-й кадр?
    Если глазами не видел, посмотри как она выглядит на старых фотографиях или в гуглокартинках.
    Один кадр фотопленки - это один объект. Сама фотопленка - это массив кадров.
  • Существует ли тенденция избегать size_t, если это возможно?

    @MarkusD Куратор тега C++
    floppa322, инструмента боится тот, кто не умеет им пользоваться :)
    Integral promotion [?] имеет место всегда быть и нередко приводит к UB для знаковых типов.
    Советую тебе бороться со страхом через познание.

    EASTL ?)

    Не, свой, кондовый, самописный с нуля еще в нулевых и нерабочий сегодня более чем на половину.
    Дело в том, что среди слабо квалифицированных пользователей C++ бытует мнение что для беззнаковых типов генерируется более тяжелый код с поведением wrap around, в то время как UB - это поведение, которого не может быть. И вот в умах таких людей уже зреет мнение о том, что код работы со знаковыми значительно быстрее.
    Но реальности плевать на их фантазии, целочисленная арифметика работает как и должна.

    Чисто к слову. Для size_t Integral promotion не выполняется по своему определению.
  • Существует ли тенденция избегать size_t, если это возможно?

    @MarkusD Куратор тега C++
    floppa322, не, программист в реальном коде увидел бы сразу что тут написана дичь :)
    Однако, приведенный тобой код с оговорками иногда случается на практике. И от таких ситуаций люди просто предохраняются всего одним сравнением. Это очень просто сделать и такую ситуацию очень легко предотвратить.

    Гораздо сложнее обстоят дела с точно такой же проверкой знакового целого. Представь себе что в блоке else ожидается строго неотрицательное значение (sizeof(int) - 10). О проверке на неотрицательность мы ровно так же забыли, как и о проверке переполнения с беззнаковым размером.
    И в результате твой же собственный код ровно так же приплыл, просто в другом месте.

    И еще интереснее дела обстоят с переполнением знакового - т.е. с UB в коде. Я когда-то уже имел дело с профессиональным кодом профессионального игрового движка, где есть свой STL и в нем все размеры указываются в int. И знаешь что? Там UB изо всех щелей торчит в коде. Тут размер выделили, там умножили, сям прибавили и... ой... UB...
    А ведь, на секундочку, переполнение int наступает уже просто тогда, когда ты решаешь выделить битовую матрицу 8192x8192 с ячейкой в 64 бита. Или битовый объем 512*512*512 с ячейкой 32 бита. Там выходит ровно 4ГБит информации. Да, такие размеры иногда бывают нужны. Это всего 536МБ.
    А еще с int в качестве размера все время приходится проверять на соответствие диапазону вместо одиночной проверки для беззнакового.

    Но и это еще не все. Чтобы увидеть надуманность твоих доводов в комментариях к решению, достаточно просто прочитать документацию. Яб оформил свою речь в ответ если бы обладал достаточным временем. Но времени у меня сейчас нет. Поэтому оставляю этот момент с документацией на тебя. :)
  • Существует ли тенденция избегать size_t, если это возможно?

    @MarkusD Куратор тега C++
    floppa322 ,
    тенденция избегать size_t из-за того, что он является беззнаковым, например, чтобы не попасть на неожиданные signed/unsigned promotion'ы или остатки по модулю 2^N ?

    Специально выделю в цитату чтобы показать что я это прочитал. Потому что.

    И все же, есть ли какие-либо причины действительно избегать типа size_t? К обозначенному в цитате еще вернемся отдельно.
    Или, наверное так. Есть ли какие-либо причины использовать тип знакового целого вместо size_t?
  • Надо ли добавлять сессию в каждый пакет UDP?

    Армянское Радио, для меня, на самом деле, оба транспортных протокола выглядят равнозначными при соблюдении условий их применения.
    UDP действительно позволяет быстрее доставить данные. Более того, зачастую я могу даже отключить проверку целостности датаграммы чтобы повысить шанс ее доставки ценой порчи ее данных. Доставка хоть части данных бывает выгоднее ее потери из-за повреждений.
    TCP же позволяет рекордно сократить расходы на разработку протокола за счет своих свойств тогда, когда важна не только гарантированная доставка, но и доставка со строгим соблюдением очередности данных.

    Исходя из свойств игры, требований к сети и условий разработки можно сделать выбор между одним или другим. И не всегда этот выбор бывает окончательным. При необходимости TCP можно позже заменить более быстрой схемой гарантированной доставки на базе UDP от Гленна Фидлера.
  • Надо ли добавлять сессию в каждый пакет UDP?

    Армянское Радио, эти мифические действия работают всегда и у всех. Говорю об этом как разработчик уже трех ММО проектов с сетью на базе TCP протокола (кастомы RO, Minecraft и проект Skylore) и разработчик сетевого уровня таких проектов, как Quake Champions и WWZ, сеть в которых строится поверх UDP.
    Мы решали разные проблемы трафика для iOs, Android, PS4, XBox, ПК и Switch. И всегда добивались нужного результата. И я сразу сказал что с UDP проблем фрагментации значительно больше.

    Статей в открытом доступе нет, есть только за деньги и за участие в игровой индустрии. Но это не беда, ведь есть документация сокетов Беркли. Там все хорошо описано, при ее изучении можно до всего дойти самостоятельно.
  • Надо ли добавлять сессию в каждый пакет UDP?

    Армянское Радио,
    потому что пакеты UDP быстрее проскакивают через маршрутизаторы, не встречая на своем пути интересные алгоритмы управления потоком, которые применяются к пакетам TCP

    Это не так. Для сетей маршрутизации пакет все равно представлен IP датаграммой, будь это TCP- или UDP-пакет.
    Правила роутинга по протоколам транспортного уровня имеются, но не являются страшными.

    TCP не используют в связи с тем, что чаще всего не знают как по каналу передавать свои данные. Зачастую я в сетевом коде проектов наблюдаю полнейший бедлам без структуры и какого-то намека на здравый смысл. Люди в датаграмму UDP пишут как будто в файл со своей строго определенной тематикой и отсылают десятки и сотни таких датаграмм за один такт симуляции.
    Отдельные люди, кому посчастливилось читать Гленна Фидлера, пробуют реализовать свой сеансовый уровень поверх UDP тоже не изобилуя структурностью данных в пакете.
    А по TCP обычно вижу передачу json-ов и xml-ек а-ля SOAP и такое прочее. За голову хвататься в пору с таких зрелищ. :)

    Талян
    TCP можно использовать и его используют. Просто считается, не без эффекта весомости мнения Гленна, что TCP увеличивает латентность передачи данных. Слухи молвят что TCP безусловно буферизирует исходящий трафик до заполнения всего кадра отправки. И что это может привести к латентности в сотни миллисекунд, что недопустимо для игр.
    Это тоже неправда, задержку от буферизации TCP можно нивелировать техническими приемами и настройками протокола.

    При этом у UDP есть другая, куда более серьезная, проблема, связанная с MTU, фрагментацией и алгоритмами этой самой фрагментации в роутерах разных производителей.
    MTU (Maximum Transmission Unit) определяет максимальный размер пакета, который не подвергнется фрагментации при передаче по определенному маршруту.
    Алгоритмы фрагментации бывают разные, но основных - два: Traffic Shaping и Traffic Control.
    Шейпинг просто режет датаграмму "под орбу". Все что больше MTU отсекается, остальное отправляется дальше по маршруту. Множество дешевых домашних роутеров занимаются именно этим при маршрутизации.
    Контроль организует фрагментацию датаграммы до размера MTU и отправляет уже как цепочку фрагментированных датаграмм.
    Оба этих алгоритма резко повышают шансы большой датаграммы стать потерянной. И если при контроле датаграмма может быть только частично потеряна, то в результате шейпинга датаграмма вообще всегда считается потерянной, даже если доставлена. Такие датаграммы на обработку могут поступить только если были отправлены с соответствующими флагами.
    И вот еще вишенка на этом торте: по разным маршрутам могут встречаться разные устройства с разными алгоритмами фрагментации. Тут пакет законтроллили, а там - уже зашейпили и всё.
    Многие протоколы сегодня из-за этого боятся слать датаграммы больше 500Б. При этом, таких датаграмм отсылается в избытке, что создает значительную сервисную нагрузку на сетевой канал. Ведь каждая датаграмма будет нести в себе один и тот же IP заголовок (28/48Б в зависимости от версии протокола IP), а это до 10% трафика при датаграммах по 500Б.

    В этом плане TCP значительно выгоднее за счет только того, что берет на себя весь этот сервис с пакетами.
    Профиль современной игры (на дистанции уже 12 лет) требует канал от 512КБит/сек до 2.5МБит/сек, что складывается из 30, 60 или 96 операций приема-передачи трафика около 1-2КБ за одну операцию приема-передачи.
  • Как проверить если ли буква в массиве?

    @MarkusD Куратор тега C++
    JavaSscriptNoob, в таком случае тебе стоит отметить ответ как решение.
  • Как проверить если ли буква в массиве?

    @MarkusD Куратор тега C++
    KIberWarriorJs, как твои успехи в решении вопроса?
  • Как создать новый экземпляр класса переменной?

    @MarkusD Куратор тега C++
    Mercury13,
    Нет второй части мерлезонского балета

    Правда нету? А если присмотреться?
  • Стоит ли учить C++, если нет возможности использовать Unreal Engine?

    RabraBabr, ну погорячился немного. Исправляю ситуацию как могу. :)
    Я думаю, он пока еще не в курсе реальности игровой индустрии.
  • Стоит ли учить C++, если нет возможности использовать Unreal Engine?

    OcToF, да не беспокойся ты так. Ты задал вопрос и у тебя будут соответствующие уровню твоего вопроса ответы.
    От меня ответа не стоит ждать, у тебя вопрос не ко мне.
  • Как создать новый экземпляр класса переменной?

    @MarkusD Куратор тега C++
    Mercury13, второй вариант - это не миксин. Я, кстати, не совсем понимают терминологию рекурсивного шаблона.
    Второй вариант крайне редко реализуем на практике.

    А вот миксин реализуется всегда. Суть миксиа ведь не в том чтобы встроиться в цепочку родства, а в том, чтобы примешать функциональность.
    template< typename TImplementation >
    class Cloneable
    {
    public:
      std::unique_ptr<TImplementation> Clone() const;
    // ...
    };
    
    class MyClass : public BaseClass, public Cloneable<MyClass>
    {
      friend class Cloneable<MyClass>;
      // ...
    };

    Виртуальность в миксине не нужна, в цепочку наследования он не встраивается, функциональность подмешивает через свой интерфейс и использование внутреннего интерфейса класса реализации.
    Начиная с C++20 такие примеси не будут занимать места в памяти экземпляра.
    Проблемы в static_cast лично я никакой не вижу. Приведение типа времени трансляции с полной проверкой на соответствие. Никаких проблем нет.
    Макросы в этом коде совершенно не нужны.