- PR -

[C#]プロセスに接続しているIPアドレスを取得するには?

1
投稿者投稿内容
Cube
会議室デビュー日: 2005/06/14
投稿数: 4
投稿日時: 2005-06-14 18:38
VC#で開発しております。
ネットワークアプリケーション(メッセンジャーやP2Pなど)を起動しているときに、
そのアプリケーションに接続しているコンピュータのIPアドレスを取得したいのです
が、自分なりにいろいろ調べてみましたが、方法が解りません。
プロセスを指定して監視・取得する方法があれば、ベストです。
ポートを指定して監視・取得する方法でもいいです。
どうか、よろしくお願いします。
mm
会議室デビュー日: 2004/09/25
投稿数: 17
投稿日時: 2005-06-14 18:54
役に立つかどうか分かりませんが・・・
http://www.atmarkit.co.jp/fwin2k/win2ktips/234netstat/netstat.html
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-06-14 19:38
方法は色々あるんですよ。単純なのだとnetstatコマンド。

フィルタドライバを使ってネットワークアダプタを経由するデータをすべて取得することもできるし、RAWソケットを使ってIPパケットを収集すると言う方法もあります。API HOOKを使ってWinSockAPIの呼び出しを監視すると言う方法もあるでしょう。

もしかしたらWindows Management Instrumentationにも関連コマンドがあるかも。
Cube
会議室デビュー日: 2005/06/14
投稿数: 4
投稿日時: 2005-06-14 21:55
マミさん、甕星さんありがとうございます。
netstatコマンドで標準出力を利用する方法は考えました。
新規接続をリアルタイムで監視し取得たいので、netstatコマンド以外の方がスマートのような気がします。
甕星さんのおっしゃっているAPI HOOKを使う方法やフィルタドライバを使う方法の参考になるドキュメントとかあれば、教えていただけませんでしょうか。
ちょっと探してみましたが、見つかりませんでした。
また、netstatでもintervalオプションで前回の出力と比較する以上にスマートな方法があれば、御指南頂けますでしょうか。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-06-15 02:31
API HOOKはDLLのインポートテーブルを書き換えて、WindowsAPIの呼び出しをフックする手法です。ネットワーク関係のAPI呼び出しをフックして、自前の処理に置き換えれば、挙動を変更したり監視することに使えます。

フィルタドライバはデバイスドライバの一種です。デバイスドライバは階層構造をとっており、特定の階層と階層の間を流れるデータを横取りすることができます。自分でフィルタドライバを作るとなると大事ですが、WinPCap等の規制品のフィルタドライバを使えば比較的容易に実現できます。

RAWソケットはTCP/IPのIPパケットを、そのまま送受信するモードです。他のTCP/IPアプリケーションが送受信しているIPパケットも受信できるので、通信内容を監視する目的にも使えます。これはマネージドコードで記述可能です。
未記入
会議室デビュー日: 2004/08/17
投稿数: 10
投稿日時: 2005-06-15 13:06
iphlpapi.dllのGetTcpTable()とかをP/Invokeでどうでしょう。
Cube
会議室デビュー日: 2005/06/14
投稿数: 4
投稿日時: 2005-06-16 11:33
甕星さん、未記入さんありがとうございます。
ちょっと自分にはハードル高いですが、調べて実装してみます。
具体的な例があればそれを拝借して・・・とか思ったのですが、自分でweb上を調べた限りではなさそうなので、がんばって地道にひとつひとつ勉強してみます。
1

スキルアップ/キャリアアップ(JOB@IT)