【问题标题】:GetTcpTable doesn't work like netstatGetTcpTable 不像 netstat 那样工作
【发布时间】:2014-02-09 21:14:04
【问题描述】:

在我的 winsock 应用程序中,我在某个端口上调用 bind。我现在正在测试,所以应用程序经常崩溃并且没有达到所有套接字都关闭的点。当我下次运行应用程序时,我在 bind 调用时收到 10048 错误。

因此,我决定通过 tcp 连接表并终止所有使用我的端口的进程(从我之前的运行中,但我在任务管理器中看不到它们)。我尝试了 GetTcpTableGetTcpTable2GetExtendedTcpTable,但它们都没有提供 netstat -ano 的功能。我的端口号和 id 出现在 netstat -ano 输出中,但不在任何这些函数检索到的 tcp 表中。

如何以编程方式获取 netstat -ano 数据。 setsockopt 具有可重复使用的地址不是一种方法,因为如果我连接而不是接受“丢失的进程”将被调用。请帮忙。

    addrinfo hints, *result;
    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    //... get ip and so on

    getaddrinfo(ip, DEFAULT_PORT, &hints, &result);
    sock = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    bind(sock, result->ai_addr, (int)result->ai_addrlen);  // here is error 10048

另一个进程已经在侦听 DEFAULT_PORT(该进程可能仍在我之前的程序测试中运行,但是我在任务管理器中看不到它),这就是出现错误 10048 的原因。

这里是找到这个过程的代码:

void TerminateProcOnPort2(const char* port_str)
{
    int size = 0;
    if(ERROR_INSUFFICIENT_BUFFER == GetTcpTable2(NULL, (ULONG*)&size, false))
    {
        MIB_TCPTABLE2* pids = (MIB_TCPTABLE2*)malloc(size);
        if(NO_ERROR == GetTcpTable2(pids, (ULONG*)&size, false))
        {
            MIB_TCPROW2* owner;
            UINT port = atoi(port_str);

            for(UINT i = 0; i < pids->dwNumEntries; ++i)
            {
                owner = &pids->table[i];
                if(owner->dwLocalPort == port)
                {
                    printf("GOOD\n");
                    // now we can kill this process by id...
                }
            }
        }
        else PrintError("GetTcpTable 2 error");
    }
    else PrintError("GetTcpTable 1 error");
} 

我的端口不在检索到的表中,但是 netstat -ano 看到了它。帮助。

【问题讨论】:

  • 没有代码,我们无法判断您尝试了什么。
  • 发现了这篇文章,其中 C# 应用程序使用 GetExtendedTcpTable 的包装器来获取包括 PID 在内的信息。文章下方还有下载互操作包装器代码的链接,其中显示了传递给 GetExtendedTcpTable 的参数。 timvw.be/2007/09/09/build-your-own-netstatexe-with-c

标签: c++ winsock


【解决方案1】:

解决方案是对从GetTcpTable 检索到的所有数字使用ntohs() Windows 函数,以获得与从 netstat 相同的输出,例如,ntohs(owner-&gt;dwLocalPort)

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。 - From Review
  • 我编辑了答案,它确实提供了一个答案,而且可能是正确的。我不能评论他的问题,因为我没有足够的声誉。我在这里看不到问题,也不明白你为什么投票赞成删除。
  • @PCLuddite 是的,它确实提供了问题的答案,甚至在编辑之前,答案是使用ntohs(),它不仅是一个答案,而且是一个正确的答案。行动前请阅读。
  • @user207421 我在 3 年前查看过这个,回想起来,我犯了一个错误。一个完美的例子,说明为什么在删除答案之前需要多次投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 2012-05-27
相关资源
最近更新 更多