Закрытие сетевого соединения без знания сокета - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь найти способ закрыть сетевое соединение, которое было установлено другим процессом.Мое приложение будет работать в течение ночи автоматически.В случае, если сетевой ресурс уже используется (что не должно быть, но я не предполагаю), мне нужно закрыть соединение, прежде чем устанавливать его с правильными учетными данными.Опять же, не предполагая, что существующее соединение имеет правильный доступ.

Используя GetTcpTable (), я могу искать в существующих соединениях IP.Теперь мне нужно закрыть его.Я могу найти много информации о закрытии соединения на основе его сокета, но я не знаю сокета.Могу ли я узнать, какие сокеты используются данным соединением (на основе удаленного IP-адреса?) Или существует какой-либо другой способ закрытия сетевого соединения на основе удаленного IP-адреса?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

С помощью комментариев я собрал следующую функцию.Обратите внимание, что для использования SetTcpEntry в Windows Vista и более поздних версиях требуются права администратора.Хотя это отвечает на явный вопрос выше, я все еще ищу решение, которое не зависит от пользователя.

// Fuction to close a collection of network connections
void networkConn::CloseRemoteIP(std::vector<MIB_TCPROW>& rows) {
    for (MIB_TCPROW tcpObject : rows) {
        tcpObject.dwState = MIB_TCP_STATE_DELETE_TCB;

        DWORD ret = SetTcpEntry(&tcpObject);

        if (ret) {
            printf("\nError closing TCP connection. Windows returned: %lu", ret);
        }
    }
}
0 голосов
/ 16 октября 2018

В Unix я бы сделал это путем туннелирования соединения через локальный ssh ​​(используя ключи -N -L на ssh-клиенте) и уничтожения ssh, когда вам нужно разорвать соединение.Не уверен, насколько это удобно в Windows.

...