ハマっている「お菓子」を教えて!

相手のIPアドレスを取得する方法

1対1で、クロスのLANケーブルでつながっているPCの相手側のIPアドレスを取得する方法がわかる方、教えてください。

ちなみに、私が作成しているプログラムは以下のようなものです。
ある機器と通信するプログラムを、VisualC++で作成しています。
機器の中にはWindowsCEが入っています。制御するPCのOSは、XP、またはVista、または7です。

よろしくお願いします。

A 回答 (8件)

通信相手とソケット確立を自分のプログラムでしているのなら、gethostbyaddr関数で調べられますが・・・



そもそもどーやって通信しているのか書いてないので、誰も正確な回答はできないと思います。

この回答への補足

通信のプロトコルとしては、OPC通信というものを使用します。
機器側のIPアドレスが分かれば通信を確立することができます。
IPアドレスを調べる部分に関しては、OPC通信とは関係ありません。

これはこちらの事情なのですが、
機器の販売メーカーからは機器側のIPアドレスを探索するプログラムを提供されています。
現時点ではこれを使ってIPアドレスを調べて、当方のソフトウェアで使えるように設定しています。
IPアドレスを取得する部分を自分で作れれば、調べて入力する手間がなくなるため、とても助かります。

pingの応答はあるので、これで探索することはできそうですが、提供されているプログラムではpingで探索しているとは思えない速さで調べられるので、何か方法があるのかなぁと思いました。

ちなみに、機器の販売メーカーは教えてくれそうもありません。
こちらの事情ですみません。

補足日時:2010/04/09 16:07
    • good
    • 0

#5さんの回答で思い出しました・・・



自分のPCにパケットキャプチャをインストールし、パケットをキャプチャできる状態でその相手PCのIPを探すソフトを走らせれば、どこのどのポートにアクセスしようとしているかはわかります。

そのあたりから探すのも1つの方法かと・・・

参考URL:http://www.infraexpert.com/info/wiresharkindex.h …
    • good
    • 0
この回答へのお礼

お礼する場所が違うかもしれませんが。

提供されているプログラムで相手のホスト名を知るまたは変更できることがわかり、最初の方で教えて頂いたgethostbyname()でIPアドレスを取得できました。

問題は解決できそうです。
色々とありがとうございました。

お礼日時:2010/04/16 11:52

TCP/IPのソケットレベルでプログラムを書いているなら、


int st = getpeername(SOCKET clsock,struct sockaddr *addr,int *addr_len);
で、addrに相手アドレスが返ります。引数の詳細はマニュアル参照。

でも、こういうことがわからない人がソケットレベルでプログラミングしているとは思えませんので、たぶん、もっと上位の抽象化されたレベルのAPIを使っているんだと思います。
通信に使っているソケットを得るAPIがあれば、その値を使って上記関数を呼べばいいです。
「ソケット」という言葉の意味がわからなければ、ちょっと無理でしょうね。

この回答への補足

回答ありがとうございます。

正直、理解できていませんが、調べてみます。

補足日時:2010/04/11 08:37
    • good
    • 0

No3に一票。



そもそもIP通信の文化(歴史)として、

1.まずは、IPアドレスで繋ぐ。

2.1が面倒なのでhostsファイルにPC名とIPアドレスを記載し、
  PC名だけで通信出来るようにする。

3.2の場合、全PCのhostsファイルを修正しなくてはいけないため
  DNCで都度、PC名とIPアドレスのマップ情報を落とすようにする。

この経緯から、gethostbyaddrでホスト名(PC名)からIPアドレスが取得出来るようになっています。

機器側のホスト名を調べ、内部ネットワーク上にDNCサーバを立ち上げるかhostsに追加するプログラムを組むかしかないと思います。

特定のポートに対してブロードキャストしているような感じであれば、パケットキャプチャでしらべられるのでは?
    • good
    • 0

そういうツールがあるのであればパケットをキャプチャすれば一発でわかるのでは?

    • good
    • 0

>pingの応答はあるので、これで探索することはできそうですが、提供されているプログラムではpingで探索しているとは思えない速さで調べられるので、何か方法があるのかなぁと思いました。



その感じだと、特定のポートに対してブロードキャストを送信し、その機器が応答を返すことで検出しているみたいですね・・・
機器提供側が公開しないのであれば、#2さんのような方法しか無い気がします。

回答になってなくてすみません。

この回答への補足

回答ありがとうございます。

pingの応答を見る方法だと相当な時間がかかりそうです。
それ以外だとやはり機器提供側に公開してもらう以外になさそうですね。

補足日時:2010/04/09 17:23
    • good
    • 0

ベタに考えると、ポーリングでpingを投げて応答の返ってくるIPをさがすという手があります。



ま、規格上存在するIPに全部投げるなんてことは現実的に無理ですが、クロスケーブルで1対1で繋がってるなら、おそらくプライベートIPの範囲内でしょうか。
また、IPアドレスの付与の仕方でも範囲が限定出来ます。組織内で固定的に割当基準が決まってるようなIPなら、その割当基準の範囲内のIPアドレスを探します。固定的なIPを割り当てずWindowsのAPIPA機能で自動割り当てをしているのなら、そのリンクローカルアドレスの範囲です。

もっとも相手がファイアウォール等の設定でpingに反応しないようになってると意味はありませんが。

この回答への補足

回答ありがとうございます。

試してみようと思います。
サブネットマスクが「255.255.0.0」と設定されてあり、これを変えられるかどうかはまだ試していないのですが、変えられない場合、最大256×256個を探索しなければならず、結構時間がかかりそうなので、他に方法があればなぁと思っております。

補足日時:2010/04/09 15:26
    • good
    • 0

netstatコマンドを使えばできます。



参考URL:http://www.atmarkit.co.jp/fwin2k/win2ktips/234ne …

この回答への補足

回答ありがとうございます。

すみません。私の要求に不備がありました。
相手のIPアドレスを取得するプログラムを、作りたいです。

補足日時:2010/04/09 12:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報