Варианты использования перехвата соединений

Модификация пакетов

После перехвата пакета, вы можете изменить его содержимое перед тем, как переслать его дальше. Вам надо просто помнить о следующих правилах:

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

Посылка пакетов без перехвата

Абсолютно необязательно перехватывать пакет для того, чтобы послать его дальше. Вы можете сформировать свои собственные пакеты и послать их через открытый подключенный divert-сокет. Правила заполнения заголовка аналогичны тем, что описаны в предыдущем разделе.

В дополнение к этому, вы должны будете передать divert-сокету структуру sockaddr_in (см. программу), в которой будет описываться, куда передать пакет. Если вы заполните эту структуру нулями или передадите вместо нее NULL, то divert-сокет будет пытаться передать пакет наружу. Если же вы укажете в структуре sockaddr_in адрес одного из сетевых интерфейсов, то divert-сокет попытается послать пакет "внутрь" машины, как будто он пришел извне. Все адреса, конечно, должны быть заданы в соответствии с порядком байт в сетевом адресе.

Пересылка пакетов, которые выглядят так, как будто переадресованы вашей машиной, должны включать в себя адрес входящего интерфейса (на самом деле, подойдет любой правильный адрес интерфейса).

Фрагментация

Как уже было упомянуто выше, divert-сокеты не поддерживают (де)фрагментацию перехваченных пакетов - вы всегда получаете фрагменты пакетов в том виде, в котором они были в сети, и вы не можете переслать пакет, имеющий размер больше PMTU. Предполагается, что поддержка фрагментации и дефрагментации пакетов будет реализована в ближайшем будущем.