在Windows上获取对等套接字的PID

时间:2014-08-21 15:10:06

标签: winapi web proxy winsock pid

我正在编写一个Web代理,当一个请求进来时(通常来自机器上的浏览器),我也想获得pid和任何其他请求的应用程序。 有没有办法用Win32确定这个?

1 个答案:

答案 0 :(得分:3)

只有在客户端和服务器在同一台计算机上运行时才能提出要求。

当客户端连接到代理时,代理可以使用getpeername()查询远程客户端IP /端口的套接字(或使用accept()报告的IP /端口)和{{ 3}}获取其本地服务器IP /端口。然后,代理可以使用getsockname()(IPv4)或GetTcpTable2()(IPv6)来检索活动TCP连接的列表,并在其中循环查找与IP /端口对匹配的连接。如果找到,列表条目将告诉您拥有该连接的进程ID。

例如:

DWORD GetClientPid(SOCKET client)
{
    DWORD pid = 0;

    sockaddr_in ServerAddr = {0};
    int ServerAddrSize = sizeof(ServerAddr);

    sockaddr_in ClientAddr = {0};
    int ClientAddrSize = sizeof(ClientAddr);

    if ((getsockname(client, (sockaddr*)&ServerAddr, &ServerAddrSize) == 0) &&
        (getpeername(client, (sockaddr*)&ClientAddr, &ClientAddrSize) == 0))
    {
        PMIB_TCPTABLE2 TcpTable = NULL;
        ULONG TcpTableSize = 0;
        ULONG result;

        do
        {
            result = GetTcpTable2(TcpTable, &TcpTableSize, TRUE);
            if (result != ERROR_INSUFFICIENT_BUFFER)
                break;

            LocalFree(TcpTable);
            TcpTable = (PMIB_TCPTABLE2) LocalAlloc(LMEM_FIXED, TcpTableSize);
        }
        while (TcpTable != NULL);

        if (result == NO_ERROR)
        {
            for (DWORD dw = 0; dw < TcpTable->dwNumEntries; ++dw)
            {
                PMIB_TCPROW2 row = &(TcpTable->table[dw]);

                if ((row->dwState == MIB_TCP_STATE_ESTAB) &&
                    (row->dwLocalAddr == ClientAddr.sin_addr.s_addr) &&
                    ((row->dwLocalPort & 0xFFFF) == ClientAddr.sin_port) &&
                    (row->dwRemoteAddr == ServerAddr.sin_addr.s_addr) &&
                    ((row->dwRemotePort & 0xFFFF) == ServerAddr.sin_port))
                {
                    pid = row->dwOwningPid;
                    break;
                }
            }
        }

        LocalFree(TcpTable);
    }

    return pid;
}

SOCKET client = accept(server, NULL, NULL);
if (client != INVALID_SOCKET)
{
    DWORD ClientPid = GetClientPid(client);
    ...
}