Как закрыть сокетное соединение (ipv4 и ipv6) в Windows от какого-либо процесса? - PullRequest
1 голос
/ 10 апреля 2019

Как закрыть соединения tcp v4 и tcp v6 в Windows? Я не хочу убивать весь процесс, который имеет открытое соединение, поскольку это, очевидно, удалит всех остальных из этого процесса. Мне нужно сделать это из отдельного процесса, и поэтому у меня не будет доступа к дескрипторам сокетов и т. Д. Я использую Windows API для получения таблицы tcp и т. Д., Поэтому я знаю, какие соединения активны.

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Одним из способов может быть перечисление всех открытых дескрипторов в системе или, по крайней мере, открытых дескрипторов заданного целевого процесса, пока вы не найдете интересующий дескриптор SOCKET (см. HOWTO: Перечислить дескрипторы , Дескрипторы сокетов и C ++ Получить дескриптор открытых сокетов программы - хотя я не уверен, как вы сможете получить пары IP / порт для SOCKET для сравнения с интересующим вас активным соединением, без внедрения удаленных getsockname() / getpeername() вызовов в процесс владения SOCKET).

Как только вы найдете дескриптор SOCKETзатем вы можете закрыть его, используя DuplicateHandle() с флагом DUPLICATE_CLOSE_SOURCE 1 .

1: это как «Закрыть»«Обрабатывать» в Process Explorer работает.

0 голосов
/ 14 апреля 2019

Поскольку я использую 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, но до тех пор это кажется единственным реалистичным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...