Welcome to SapporoWorks! We create stimulating network programs.
By a demand from user, SapporoWorks evolves.
トップページ| ソフトウエア| シェアウエア登録| セキュリティ情報| 開発情報| ドキュメント|
開発情報 > TCP状態の一覧取得


概要

GetTcpTable()を使用すると、現在のTCP状態の一覧が取得できます。
これ、いわゆる、netstat -atn そのまんまです。

定期的にESTABLISHEDの監視をするだけでも、トロイの起動を検出するなどが可能かも・・・・

Iphlpapi.lib のリンクが必要です。


ソース
 
 #include <iphlpapi.h>   //iphlpapi.lib をリンクする必要がある
 
 char *StateStrings[]={"","CLOSED","LISTEN","SYN_SENT","SYN_RCVD","ESTABLISHED","FIN_WAIT1","FIN_WAIT2",
             "CLOSE_WAIT","CLOSING","LAST_ACK","TIME_WAIT","DELETE_TCB"};
 
 void __fastcall TForm1::Button1Click(TObject *Sender)
 {
     char Buf[1024];
     DWORD d=0 ;
     unsigned int port;
     unsigned char *p;
 
     Memo1->Lines->Clear();
 
     //第1パラメータにNULLをおいて、必要サイズを DWORD d に取得する
     GetTcpTable(NULL,&d,FALSE);
 
     //MIB_TCPTABLEへのポインタに、必要サイズを確保する
     PMIB_TCPTABLE pTcpTable = (PMIB_TCPTABLE)new char[d] ;
 
     if( pTcpTable ){
        //TCPテーブルの取得
 	if( GetTcpTable( (PMIB_TCPTABLE)pTcpTable,&d,FALSE) == NO_ERROR ){
             Memo1->Lines->Add("Proto  Local Address\tForeign Address\tState");
 
        //取得したテーブル数は、dwNumEntriesで分かる
             for( int i = 0 ; i < (int)pTcpTable->dwNumEntries ; i++ ){
                 unsigned char *local_ip = (unsigned char * )&(pTcpTable->table[i].dwLocalAddr);
                 p = (unsigned char * )&(pTcpTable->table[i].dwLocalPort);
 
                 unsigned int local_port = *(p+0)*256 + *(p+1);
 
                 unsigned char *remote_ip = (unsigned char * )&(pTcpTable->table[i].dwRemoteAddr);
 
                 p = (unsigned char * )&(pTcpTable->table[i].dwRemotePort);
 
                 unsigned int remote_port = *(p+0)*256 + *(p+1);
                 // LISTEN 状態のリモート側のポート番号は無効な値が入っているようです
                 if(*remote_ip==0)
                     remote_port=0;
 
                 wsprintf(Buf,"TCP  %d.%d.%d.%d:%d\t%d.%d.%d.%d:%d\t%s"
                     ,*(local_ip+0),*(local_ip+1),*(local_ip+2),*(local_ip+3)
                     ,local_port
                     ,*(remote_ip+0),*(remote_ip+1),*(remote_ip+2),*(remote_ip+3)
                     ,remote_port
                     ,StateStrings[pTcpTable->table[i].dwState]);
 
                 Memo1->Lines->Add(Buf);
             }
 	}
         //MIB_TCPTABLEへのポインタに、確保したメモリを解放する
 	delete [] pTcpTable;
     }
 }
 



サンプル

サンプルプログラム実行画面


ソースファイルのダウンロード 005-src.LZH 6Kbyte 実行ファイルのダウンロード 005-bin.LZH 201Kbyte


開発者のための実装系Webマガジンへの投稿
TCP/IPを利用しているプロセス情報を視覚的に表示する
各種のOSで利用可能なAPIとAPIが存在しない場合(WindowsNT/2000)のカーネルオブジェクト参照による情報取得方法を解説。

開発情報 > TCP状態の一覧取得

copyright(c) 1995- SapporoWorks
当サイトはリンクフリーです。リンク時に連絡などは必要有りません。また、どのページにリンクして頂いても構いません。