Поиск портов TCP, используемых приложением - PullRequest
9 голосов
/ 28 июня 2011

Хорошо, поэтому я расширяю демон поставщика flexlm моей компании, чтобы он был немного более откровенным для клиентских приложений.

Мне нужно выяснить, какой порт слушает lmgrd, прежде чем клиенты подключатся. Документация по API кажется довольно бесплодной, и я считаю, что они хранят большую часть своего кода в скомпилированной форме, поэтому я не могу просто посмотреть на их исходные коды.

Можно ли воспользоваться удивительной мощью Windows API, чтобы выяснить, какие порты использует конкретный процесс? Если Process Explorer от Sysinternals может сделать это, я должен быть в состоянии, верно? Какой будет пример кода для этого?

Он должен поддерживать Windows XP и выше, поскольку многие наши клиенты еще не обновились.

Должен заметить, что у FLEX есть поддержка извлечения порта из файла лицензии. У меня нет кода передо мной, но я знаю, что это не лучший способ узнать, какие порты работает у вашего поставщика-демона / lmgrd.

Ответы [ 3 ]

8 голосов
/ 28 июня 2011

GetTcpTable2 - см. Ниже

Функция GetTcpTable2

Функция 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

4 голосов
/ 05 июля 2011

Вот код, с которым я столкнулся, для тех, кто решает эту проблему после меня

#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;
}
3 голосов
/ 28 июня 2011

В худшем случае вы всегда можете проанализировать вывод:

netstat -bna
...