Варианты использования перехвата соединений
Модификация пакетов
После перехвата пакета, вы можете изменить его содержимое перед тем, как
переслать его дальше. Вам надо просто помнить о следующих правилах:
Перед пересылкой должна пересчитываться контрольная сумма в заголовке IP-пакета
Поле IP ID будет заполняться за вас, если вы оставите его равным 0.
Обновление длины пакета зависит от вас.
Вы можете изменять любые другие поля заголовка, и правильность этого заполнения зависит от вас.
Посылка пакетов без перехвата
Абсолютно необязательно перехватывать пакет для того, чтобы послать его
дальше. Вы можете сформировать свои собственные пакеты и послать их через
открытый подключенный divert-сокет. Правила заполнения заголовка аналогичны
тем, что описаны в предыдущем разделе.
В дополнение к этому, вы должны будете передать divert-сокету структуру sockaddr_in (см. программу), в которой будет описываться, куда передать пакет. Если вы заполните эту структуру нулями или передадите вместо нее NULL, то divert-сокет будет пытаться передать пакет наружу. Если же вы укажете в структуре sockaddr_in адрес одного из сетевых интерфейсов, то divert-сокет попытается послать пакет "внутрь" машины, как будто он пришел извне. Все адреса, конечно, должны быть заданы в соответствии с порядком байт в сетевом адресе.
Пересылка пакетов, которые выглядят так, как будто переадресованы вашей
машиной, должны включать в себя адрес входящего интерфейса (на самом деле,
подойдет любой правильный адрес интерфейса).
Фрагментация
Как уже было упомянуто выше, divert-сокеты не поддерживают (де)фрагментацию перехваченных пакетов - вы всегда получаете фрагменты пакетов в том виде, в котором они были в сети, и вы не можете переслать пакет, имеющий размер больше PMTU. Предполагается, что поддержка фрагментации и дефрагментации пакетов будет реализована в ближайшем будущем.
Пред. | Начало | След. |
Использование перехвата соединений | | Источники дополнительной информации |