Ran*_*ano 9 windows api port tcp process
好吧,所以我扩展了我公司的flexlm供应商守护程序,以便对客户端应用程序有所了解.
我需要能够在客户端连接之前找出lmgrd正在侦听的端口.API文档似乎相当贫瘠,我相信他们将大部分代码保存在编译形式中,所以我不能只看它们的来源.
是否有可能调用Windows API的强大功能来找出特定进程正在使用的端口?如果来自sysinternals的Process Explorer可以做到,我应该能够做对吗?有没有人有这样的示例代码?
它需要支持Windows XP及更高版本,因为我们的许多客户尚未升级.
编辑:我应该注意到,事实证明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;
Run Code Online (Sandbox Code Playgroud)
现在是MIB_TCPROW
typedef struct _MIB_TCPROW {
DWORD dwState;
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
} MIB_TCPROW, *PMIB_TCPROW;
Run Code Online (Sandbox Code Playgroud)
编辑重要说明:
您需要使用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;
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7652 次 |
最近记录: |