2011-06-27 13 views
8

W porządku, więc rozszerzam demona dostawcy flexlm mojej firmy, aby był on bardziej widoczny dla aplikacji klienckich.Znajdowanie portów TCP używanych przez aplikację

Muszę być w stanie dowiedzieć się, który port lmgrd nasłuchuje, zanim klienci się połączą. Dokumentacja API wydaje się raczej jałowa i uważam, że większość kodu zachowuje w skompilowanej formie, więc nie mogę po prostu spojrzeć na ich źródło.

Czy można wywołać niesamowitą moc interfejsu API systemu Windows, aby dowiedzieć się, z jakich portów korzysta dany proces? Jeśli Process Explorer od sysinternals może to zrobić, powinienem być w stanie to zrobić? Czy ktoś ma przykładowy kod do tego?

Musi obsługiwać system Windows XP i wyższy, ponieważ wielu naszych klientów nie zostało jeszcze uaktualnionych.

Edycja: Należy zauważyć, że okazuje się, że FLEX ma wsparcie dla wyciągnięcia portu z pliku licencji. Nie mam kodu przed sobą, ale wiem, że nie jest to najlepszy sposób na sprawdzenie, które porty działa demon twojego dostawcy/lmgrd.

Odpowiedz

7

GetTcpTable2 - zobacz EDIT

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

Funkcja GetTcpTable pobiera tabeli połączeń TCP IPv4.

Spowoduje to wypełnienie struktury MIB_TCPTABLE.

typedef struct _MIB_TCPTABLE { 
    DWORD  dwNumEntries; 
    MIB_TCPROW table[ANY_SIZE]; 
} MIB_TCPTABLE, *PMIB_TCPTABLE; 

A teraz MIB_TCPROW

typedef struct _MIB_TCPROW { 
    DWORD dwState; 
    DWORD dwLocalAddr; 
    DWORD dwLocalPort; 
    DWORD dwRemoteAddr; 
    DWORD dwRemotePort; 
} MIB_TCPROW, *PMIB_TCPROW; 

EDIT WAŻNE:

Trzeba użyć GetTcpTable2 w celu uzyskania odpowiedniego PID związane, jak również.

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

Crap. Nie da się. Wydaje się, że funkcja GetTcpTable2 jest funkcją Vista i wyższą. Powinienem był określić, że powinien działać z Windows XP jako minimum, ponieważ wielu z naszych klientów jeszcze się nie zaktualizowało. Zaktualizuję mój pierwotny wpis. Doskonałe znalezisko, muszę powiedzieć. – RandomInsano

+0

Tak ... wydaje się, że najbliższą wersją tego systemu jest AllocateAndGetTcpExTableFromStack http://msdn.microsoft.com/en-us/library/aa365804(v=vs.85).aspx – RandomInsano

+1

Funkcje GetTcpTable lub GetExtendedTcpTable powinny służy do pobierania tabeli połączeń TCP zamiast korzystania z funkcji AllocateAndGetTcpExTableFromStack. Uwaga Funkcja AllocateAndGetTcpExTableFromStack jest przestarzała i nie jest obsługiwana w systemie Windows Vista i nowszych.W zestawie Microsoft Windows Software Development Kit (SDK) wydanym dla systemu Windows Vista i nowszych prototyp funkcji dla AllocateAndGetTcpExTableFromStack jest nadal zdefiniowany w pliku nagłówkowym Iphlpapi.h dla dalszej obsługi w systemach Windows Server 2003 i Windows XP. – flumpb

3

W najgorszym wypadku zawsze można analizować dane wyjściowe:

netstat -bna 
+0

ciekawy pomysł. Więcej, aby znaleźć wersję tej aplikacji w wersji odwróconej. Wpadłem na stary kod źródłowy winternals i zobaczę, jak ten facet zaimplementował swoją aplikację TCPView. – RandomInsano

4

Oto kod skończyło się dla każdego, kto zobaczy ten problem po mnie

#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; 
} 
Powiązane problemy