查找应用程序使用的TCP端口

时间:2011-06-27 22:49:09

标签: windows api process tcp port

好吧,所以我扩展了我公司的flexlm供应商守护程序,以便对客户端应用程序有所了解。

我需要能够在客户端连接之前找出lmgrd正在侦听的端口。 API文档似乎相当贫瘠,我相信他们将大部分代码保存在编译形式中,所以我不能只看它们的来源。

是否可以调用Windows API的强大功能来找出特定进程正在使用的端口?如果来自Sysinternals的Process Explorer可以做到,我应该可以,对吧?这会有什么示例代码?

它需要支持Windows XP及更高版本,因为我们的许多客户尚未升级。

我应该注意到,事实证明FLEX支持从许可证文件中提取端口。我没有在我面前的代码,但知道这不是找出供应商守护程序/ lmgrd正在运行的端口的最佳方法。

3 个答案:

答案 0 :(得分:8)

GetTcpTable2 - 见下文

GetTcpTable2 function

GetTcpTable函数检索IPv4 TCP连接表。

这将填写MIB_TCPTABLE结构。

typedef struct _MIB_TCPTABLE {
  DWORD      dwNumEntries;
  MIB_TCPROW table[ANY_SIZE];
} MIB_TCPTABLE, *PMIB_TCPTABLE;

现在是MIB_TCPROW

typedef struct _MIB_TCPROW {
  DWORD dwState;
  DWORD dwLocalAddr;
  DWORD dwLocalPort;
  DWORD dwRemoteAddr;
  DWORD dwRemotePort;
} MIB_TCPROW, *PMIB_TCPROW;

重要

您需要使用GetTcpTable2才能获得相应的PID关联。

typedef struct _MIB_TCPROW2 {
  DWORD                        dwState;
  DWORD                        dwLocalAddr;
  DWORD                        dwLocalPort;
  DWORD                        dwRemoteAddr;
  DWORD                        dwRemotePort;
  DWORD                        dwOwningPid;
  TCP_CONNECTION_OFFLOAD_STATE dwOffloadState;
} MIB_TCPROW2, *PMIB_TCPROW2;

dwOwningPid

答案 1 :(得分:4)

以下是我最终遇到的代码,对于那些在我之后遇到此问题的人

#include "stdafx.h"
#include <windows.h>
#include <iphlpapi.h>

// These are just for the ntohl function in the printf below
#include <winsock.h>
#pragma comment(lib, "Ws2_32.lib")

DWORD (WINAPI *pGetExtendedTcpTable)(
  PVOID pTcpTable,
  PDWORD pdwSize,
  BOOL bOrder,
  ULONG ulAf,
  TCP_TABLE_CLASS TableClass,
  ULONG Reserved
);

int _tmain(int argc, _TCHAR* argv[])
{
    MIB_TCPTABLE_OWNER_PID *pTCPInfo;
    MIB_TCPROW_OWNER_PID *owner;
    DWORD size;
    DWORD dwResult;

    HMODULE hLib = LoadLibrary("iphlpapi.dll");

    pGetExtendedTcpTable = (DWORD (WINAPI *)(PVOID, PDWORD, BOOL, ULONG, TCP_TABLE_CLASS, ULONG))
        GetProcAddress(hLib, "GetExtendedTcpTable");

    if (!pGetExtendedTcpTable)
    {
        printf("Could not load iphlpapi.dll. This application is for Windows XP SP2 and up.\n");
        return 1;
    }

    dwResult = pGetExtendedTcpTable(NULL,     &size, false, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0);
    pTCPInfo = (MIB_TCPTABLE_OWNER_PID*)malloc(size);
    dwResult = pGetExtendedTcpTable(pTCPInfo, &size, false, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0);

    if (dwResult != NO_ERROR)
    {
        printf("Couldn't get our IP table");
        return 2;
    }

    printf("Iterating though table:\n");
    for (DWORD dwLoop = 0; dwLoop < pTCPInfo->dwNumEntries; dwLoop++)
    {
        owner = &pTCPInfo->table[dwLoop];

        printf("  PID: %5u - Port: %5u\n", owner->dwOwningPid, ntohs(owner->dwLocalPort));
    }

    // Pause a moment
    printf("Done Processing\n");

    return 0;
}

答案 2 :(得分:3)

在最坏的情况下,您始终可以解析输出:

netstat -bna