У меня очень общий вопрос. Я пытаюсь установить связь между двумя модулями на двух уровнях OSI (предположим, что транспортный уровень реализован в классе A, а класс B реализует сетевой уровень). Я понимаю, что класс A может просто использовать класс B, вызывая его методы для пересылки полезной нагрузки данных дальше на нижние уровни. Следовательно, класс A обладает знаниями класса B, но не наоборот.
Вопрос в том, когда класс B получает данные из нижних уровней, как данные передаются в класс A (верхний уровень), поскольку он не знает о классе A. Как такая функциональность реализована в C ++? Какую важную тему выучить для такого рода задач?
Просто написав функции установки / получения в классе сетевого уровня. Когда класс транспортного уровня обновляется, он считывает данные сети через функцию получения.
Может даже иметь смысл сделать сеть частным участником транспорта, поскольку транспорт никогда не может существовать без сети.
Начните с составления всех классовых зависимостей пером и бумагой. Пересмотрите их пару раз, пока у вас не появится дизайн, который, кажется, имеет смысл.
В ядре работает так, что транспортный уровень регистрирует обратный вызов на сетевом уровне. Когда сетевой уровень принимает дейтаграмму, которая должна быть передана на сетевой уровень, он вызывает эту функцию обратного вызова, передавая полезную нагрузку дейтаграммы сетевого уровня. Дейтаграмма сетевого уровня знает, что она должна передавать полезную нагрузку дейтаграммы в конкретный протокол транспортного уровня из-за одного конкретного поля, указывающего протокол верхнего уровня. В случае дейтаграммы IPv4 это поле протокол.
Вы можете реализовать этот обратный вызов в C ++ различными способами:
Когда B получает дейтаграмму для протокола X, он уведомляет наблюдателей, зарегистрированных для этого протокола, или вызывает зарегистрированный обратный вызов или лямбду.