2011-06-27 11 views
8

申し訳ありませんが、私は自社のflexlmベンダーデーモンをクライアントアプリケーションにもう少し詳しく説明しています。アプリケーションで使用されるTCPポートを見つける

クライアントが接続する前にlmgrdがリッスンしているポートを調べる必要があります。 APIドキュメントはむしろ不毛なようですが、私はそれらのコードの大部分をコンパイルした形で保存しているので、ソースを見るだけでは不十分です。

Windows APIの素晴らしい機能を利用して、特定のプロセスで使用されているポートを見つけることは可能ですか? sysinternalsのプロセスエクスプローラで実行できる場合、私は正しいことができるはずですか?誰もこれのためのサンプルコードを持っていますか?

多くのお客様からアップグレードが必要なため、Windows XP以降をサポートする必要があります。

編集: FLEXは、ライセンスファイルからポートをプルすることをサポートしていることに注意してください。私の前にコードはありませんが、ベンダーデーモン/ lmgrdが実行しているポートを調べる最良の方法ではありません。最悪の場合には

答えて

7

GetTcpTable2を - GetTcpTable機能は、IPv4のTCPコネクションテーブルを検索EDIT

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

を参照してください。

これは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; 

重要EDIT

あなたにも関連し、対応するPIDを取得するためにGetTcpTable2を使用する必要があります。

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

クラップス。いいえ。 GetTcpTable2関数がVista以上の機能であると思われます。私は、多くのクライアントがまだアップグレードしていないので、少なくともWindows XPで動作するはずです。元の投稿を更新します。優秀な発見が、私は言う必要があります。 – RandomInsano

+0

だから、これはWindows XPの最も近いバージョンです。AllocateAndGetTcpExTableFromStack http://msdn.microsoft.com/en-us/library/aa365804(v=vs.85).aspx – RandomInsano

+1

GetTcpTableまたはGetExtendedTcpTable関数は、 AllocateAndGetTcpExTableFromStack関数を使用する代わりに、TCP接続テーブルを取得するために使用されます。 メモWindows Vista以降では、AllocateAndGetTcpExTableFromStack関数は非推奨であり、サポートされていません。Windows Vistaおよびそれ以降用にリリースされたMicrosoft Windowsソフトウェア開発キット(SDK)では、AllocateAndGetTcpExTableFromStackの関数プロトタイプは、Windows Server 2003およびWindows XPでの継続的なサポートのためにIphlpapi.hヘッダーファイルで定義されています。 – flumpb

3

、あなたはいつもの出力解析できます

netstat -bna 
+0

面白いアイデアです。さらにそのアプリケーションのリバースエンジニアリングバージョンを見つけることができます。私は古いwinternalsのソースコードに落ちて、どのように彼のTCPViewアプリケーションを実装した人がいるのか分かります。 – RandomInsano

4

ここに私がなってしまったコードは、私の後に、この問題を打つ人のために、

#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; 
} 
関連する問題