2011-06-27 29 views
8

好的,所以我将我公司的flexlm供应商守护程序扩展到客户端应用程序的一点点。查找应用程序使用的tcp端口

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

是否可以调用Windows API的强大功能来找出特定进程正在使用的端口?如果sysinternals的Process Explorer可以做到这一点,我应该可以吗?有没有人有这样的示例代码?

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

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

回答

7

GetTcpTable2 - 见编辑

http://msdn.microsoft.com/en-us/library/bb408406(v=vs.85).aspx

的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; 

编辑重要

你需要以获得相应的PID相关联,以及使用GetTcpTable2。

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

+0

废话。没有可以做的。似乎GetTcpTable2函数是Vista和更高版本的函数。我应该指定它应该与Windows XP一起工作,因为我们的许多客户还没有升级。我会更新我的原始帖子。尽管如此,我必须说。 – RandomInsano

+0

因此...它似乎是最接近Windows XP版本的这是AllocateAndGetTcpExTableFromStack http://msdn.microsoft.com/en-us/library/aa365804(v=vs.85).aspx – RandomInsano

+1

GetTcpTable或GetExtendedTcpTable函数应该用于检索TCP连接表,而不是使用AllocateAndGetTcpExTableFromStack函数。 注意AllocateAndGetTcpExTableFromStack函数在Windows Vista和更高版本中已被弃用且不受支持。在为Windows Vista和更高版本发布的Microsoft Windows软件开发工具包(SDK)上,AllocateAndGetTcpExTableFromStack的函数原型仍在Iphlpapi.h头文件中定义,以便在Windows Server 2003和Windows XP上继续提供支持。 – flumpb

3

在最坏的情况下,你总是可以解析的输出:

netstat -bna 
+0

有趣的想法后打这个问题的代码。更多来找到该应用程序的反向工程版本。我已经落在旧的Winternals源代码中,并会看到那个人如何实现他的TCPView应用程序。 – RandomInsano

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