Поскольку я использую C #, я не могу PInvoke SetTcpEntry, даже будучи администратором с файлом app.manifest, он всегда отправляет ошибку 317.Поэтому я создал C ++ .exe, чтобы закрыть список разделенных запятыми адресов ipv4 в командной строке, используя SetTcpEntry, работает нормально даже без файла app.manifest.Это решает проблему подключения к ipv4.
Я пытался использовать подход get handles с NtQuerySystemInformation, но никогда не мог заставить его работать совершенно правильно, и это частный в основном недокументированный API, и его использование небезопасно.
Итак, для ipv6 я использую windivert и внедряю флаг RST в пакеты ipv6 с определенными IP-адресами.Это так же просто, как установить флаг RST входящего пакета, прежде чем отправить его через windivert.Недостатком является то, что если клиент никогда не отправляет другой пакет, сокет ipv6 по-прежнему остается открытым неопределенно долго.
Возможно, когда-нибудь Microsoft добавит функцию SetTcpEntry6, но до тех пор это кажется единственным реалистичным способом.