Поиск tcp-портов, используемых приложением
хорошо, поэтому я расширяю демон поставщика flexlm моей компании, чтобы быть немного более открытым для клиентских приложений.
Мне нужно иметь возможность узнать, какой порт lmgrd прослушивает перед подключением клиентов. Документация API кажется довольно пустой, и я считаю, что они хранят большую часть своего кода в скомпилированной форме, поэтому я не могу просто посмотреть на их источник.
можно ли призвать удивительную силу API Windows, чтобы узнать, какие порты a конкретный процесс использует? Если Process Explorer от sysinternals может это сделать, я должен быть в состоянии правильно? У кого-нибудь есть образец кода для этого?
Он должен поддерживать Windows XP и выше, так как многие из наших клиентов еще предстоит обновить.
изменить: Я должен отметить, что, оказывается, FLEX поддерживает вытягивание порта из файла лицензии. У меня нет кода передо мной, но знаю, что это не лучший способ узнать, какие порты ваш демон поставщика / lmgrd бегущий.
3 ответов
GetTcpTable2 -- см. EDIT
http://msdn.microsoft.com/en-us/library/bb408406 (v=против 85).aspx
функция GetTcpTable извлекает таблицу соединений TCP IPv4.
это заполнит структуру 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;
}