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

好吧,所以我将我公司的flexlm供应商守护程序扩展到客户端应用程序。

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

是否有可能调用Windows API的强大function来查找特定进程正在使用的端口? 如果从sysinternals进程资源pipe理器可以做到这一点,我应该能够吗? 有没有人有这样的示例代码?

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

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

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; 

编辑重要

你需要使用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

这是我最后的代码,对于那些在我之后遇到这个问题的人

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

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

 netstat -bna