【问题标题】:Closing a network connection without knowing the socket在不知道套接字的情况下关闭网络连接
【发布时间】:2019-03-21 04:58:17
【问题描述】:

我正在尝试找到一种方法来关闭已由另一个进程建立的网络连接。我的应用程序将自动运行过夜。如果网络资源已经在使用中(它不应该使用,但我没有假设),我需要在使用正确的凭据建立连接之前关闭连接。同样,不要假设现有连接具有正确的访问权限。

使用 GetTcpTable() 我可以在现有连接中搜索 IP。现在我需要关闭它。我可以找到很多关于基于其套接字关闭连接的信息,但我不知道套接字。我可以找出给定连接使用了哪些套接字(基于远程 IP?)还是有其他方法可以关闭基于远程 IP 的网络连接?

【问题讨论】:

  • 您应该能够让负责打开此连接的进程(GetOwnerModuleFromTcpEntry 看起来很有希望)然后杀死此进程。这比关闭使用它的进程下面的连接要干净得多(如果这种方式甚至存在的话)
  • 如果有可能,您可以获取进程 PID 并终止进程。
  • @AlexK。有什么理由不将其作为重复项关闭吗?
  • 听起来你应该设置一个本地防火墙来阻止其他应用在你的应用不希望它们访问网络资源的时候访问

标签: c++ sockets winapi winsock


【解决方案1】:

在 cmets 的帮助下,我整理了以下函数。请注意,在 Windows Vista 及更高版本上使用 SetTcpEntry 需要管理员权限。虽然这回答了上述明确的问题,但我仍在寻找与用户无关的解决方案。

// 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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 2015-10-24
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多