GetTcpTable不像netstat那样工作

时间:2014-02-09 21:14:04

标签: c++ winsock

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

因为我决定通过tcp连接表并使用我的端口杀死所有进程(从我之前的运行,但我在任务管理器中看不到它们)。我尝试了 GetTcpTable GetTcpTable2 GetExtendedTcpTable ,但它们都没有给我 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可以看到它。帮助

1 个答案:

答案 0 :(得分:1)

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