IPアドレスの競合をEVC++の関数で検知するには?

解決


eniac  2007-03-24 22:32:25  No: 64758

私は現在、WindowsCEにてTCP通信アプリの作成を行っているのですが、ネットワーク上に同様のIPアドレスを使用したPCが有ると、PCには『IPアドレスが競合している』とダイアログが出るのですが、WindowsCE側には出てきません。なにかEmbededVC++の関数などで、IPの競合を検知する方法は有りませんでしょうか?


ななしさん  2007-03-25 09:52:17  No: 64759

これも一種のマルチポスト?
ttp://pc11.2ch.net/test/read.cgi/tech/1173150974/35-40


瀬戸っぷ  2007-03-25 21:22:42  No: 64760

じゃあ、コレも。

http://oshiete1.goo.ne.jp/qa2861066.html


ななこ  2007-03-26 16:06:17  No: 64761

ここは皆でマルチポストを探す掲示板ですねw


eniac  2007-03-26 18:50:02  No: 64762

>ななし
その質問全然別人なんだけど。
勝手にきめつけるのやめろよな。
しかも2チャンネルとか見ないしさぁ。

  >瀬戸っぷさん
申し訳ないです。仰る通り、それは私のです。でも、見てくれる人が居なかったり、埋もれたり、なかなか、質問が解決してもらえないんですよね。
もし、この質問に対する回答をご存じだったら教えていただけませんか?


PATIO  2007-03-26 19:50:30  No: 64763

多分、WinCE FANの掲示板のもそうではないかなぁと思いますけれど、
CEネタはなかなかわかる人がいないので結構苦しいですね。
まずはPC側の何処で出しているのかわかれば、何かAPIの名称くらい
出てきそうな感じですけれど、CEだとPCのAPIの全てがサポートされているとは
限らない所が泣き所ですね。
ネットワーク系のエラー番号に該当するような物が無いかなぁ。


とーりすがり  2007-03-26 20:22:24  No: 64764

マルチポスト先にとっくの昔にレスついてるが
試したのか?

>申し訳ないです。仰る通り、それは私のです。でも、見てくれる人が居なかったり、埋もれたり、なかなか、質問が解決してもらえないんですよね。
数分とたたずにマルチポストする事を正当化する理由にはならないよな


eniac  2007-03-27 00:54:39  No: 64765

>とーりすがりさん

  私の力不足で、方法論だけでは、解決できないんですよね。
具体的なソース例とかあるURLとか教えて頂けると助かるんですけど。
もうちょっと能力がある人だったら、方法論からすぐにコーディングって
できるんでしょうけどね。でもそこまで実力有ったら、質問しないかもしれませんが。


ななこ  2007-03-27 01:14:26  No: 64766

ここは丁寧な口調で罵り合う掲示板ですねw


eniac  2007-03-27 01:21:40  No: 64767

>ななこさん

  『ななし』て人には丁寧じゃないですよ。


wclrp ( 'o')  2007-03-27 07:56:23  No: 64768

俺はマルチポストの指摘に肯定。

もしマルチポストの指摘がなかったら
別の掲示板で回答があったことも
その実装方法がわからないってことも
知らされずに放置されていた。


  2007-03-27 09:17:15  No: 64769

>見てくれる人が居なかったり、埋もれたり、なかなか、質問が解決してもらえないんですよね
一連の発言見てるとあなたの書きかたが原因なんじゃないかと思えてくる


瀬戸っぷ  2007-03-27 09:18:08  No: 64770

そうして放置された残骸があちこちに…

PATIOさんも書かれていますが、CEネタは少々厳しいですね。
検証できる環境が無いので。

んでわ、本題。
「ARPってのはナニモノや?」ってのは自分で調べていただくとして…
MSDNで調べると、IP HelperにSendARP()なんてのがあるようです。
が、その前にARPキャッシュに載っている場合は削除しないとならないかと。
(IPアドレス設定する前に、使用予定のものが使われていないか…ということならば、そもそもARPキャッシュも無いかも知れませんが。)
ARPキャッシュが無い状態ならばそのままSendARP()で結果を調べてください。
MACアドレスが取得できた場合は、『ブロードキャストが届く範囲』に該当するIPアドレスを持ったPCがいることになります。
結果の確認にもしかしたらGetIpNetTable()を使う必要があるかも知れません。

すでにARPキャッシュがある場合は…
DeleteIpNetEntry()で該当するIPアドレスのエントリを削除する必要があるかと思われます。
んで、削除するためにはアダプタ(ようするにNIC)のIndexを指定する必要が。
Indexの取得には…
GetAdaptersInfo()で列挙が必要でしょうか?
IP_ADAPTER_INFO構造体のTypeとIndexかな??

# ちなみに、CEないし確認してないです。
# 大まかな処理ならXPでも試せるかも知れませんが…そこまでやっている時間は無いので。
# ちなみにARP使う関係でルータ等の向こうにいるモノとの競合は確認できません。


eniac  2007-03-27 18:10:24  No: 64771

>PATIOさん、瀬戸っぷさん

  マルチポストと解ってながら御回答下さって有り難うございます。
瀬戸っぷさん、eniacにとっては、解らない単語だらけなので、できるかどうか心配ですが、がんばってみます。もしかしたら、また質問してしまうかもしれません。
  申し訳ないですが、その時はまた教えてもらってもいいですか?
よろしくお願いします。


eniac  2007-03-27 22:55:50  No: 64772

>瀬戸っぷさん

  途中経過なんですけど、WindowsCE V3.0では無理かもです。(V4.0以降なら大丈夫かもなんですけど…。)
とりあえず、SendARP関数を入れてコンパイルが通るようにはなったんですが、リンク時に、『LNK2019』が出てきて、実行ファイルが出来ないんです。
『winsock2.h』と『iphlpapi.h』のインクルードがSendARP関数を使用する条件みたいなんです。
  でもV3.0のincludeフォルダ内に『winsock.h』は有るんですけど『winsock2.h』が無い………。(悲)
  せっかくコンパイルまで通ったのでもうちょっと粘ってみます。すみません。


へむ  2007-03-28 02:38:56  No: 64773

>『winsock2.h』と『iphlpapi.h』のインクルードがSendARP関数を使用する条件みたいなんです。
iphlpapi.hはともかくwinsock2.hが必要って言うのはないと思います。
Iphlpapi.libがリンクされていないだけではないですか?

http://msdn2.microsoft.com/en-us/library/ms912815.aspx
ページの下のほうにある
>Requirements
> Runs On           Versions     Defined in Include       Link to 
>Windows CE OS   3.0 and later       Iphlpapi.h       Iphlpapi.lib 
この辺の部分は必ず読まないと開発できません。(それもWindowsCE用のヘルプ)

#WindowsCEの質問は開発環境やOS(バージョン)、場合によってはCPUも書かないと
#有効な回答が得られません。


eniac  2007-03-28 06:41:29  No: 64774

>へむさん

  仰る通りです。しかもなんとお恥ずかしい事にファイル名の綴りミスでした。
有り難う御座いました。おかげさまでなんとか実行ファイルまでこぎつけました。
今から検証です。


eniac  2007-03-29 18:46:11  No: 64775

SendARPの引数の1番目にWindowsCE自身のIPを入れて、
                  2番目にはWindowsCE自身のIPを入れたり、『0』を入れたり、
                  3番目には関数実行時マックアドレス格納用変数
                 4番目には関数実行時取得した長さを格納用変数
で実行してます。
どういった状況の時に起こるのか解らないのですが、SendARPするとWindows2000側が自分自身にpingが通らなくなったりしている感じがします。(ipconfigするとipが0.0.0.0になってるけど、ネットワークプロパティはWindowsCEと同様のipが設定されてました。)ちなみにこの時にWindowsCEの取得したマックアドレスは『FF-FF-FF-FF-FF-FF』です。
SendARPする前は、IP重複警告ダイアログは出るものの、両者とも自分自身へのpingが通ります。(これって正しいんでしょうか?)
理想としては、他者(ここではWindows2000)に影響を与えず、WindowsCE側で通信不能(今回のケースと逆にWindowsCE側がipconfigするとipが0.0.0.0になる)等にして、できるだけ、WindowsCE側が一番立場が弱くなるようにしたいです。
設定や、関数の追加で何とかなりますでしょうか?
もしかすると、とても些細な私のミスなのかもしれないのですが、アドバイス頂けたら幸いです。


tetrapod  2007-03-29 21:48:43  No: 64776

俺なら WinCE のような非力な環境側で何とかしたいなんて最初から考えない
なんとかするとしたら高機能機器のほうでやるべきだし、そもそも
運用でカバーしてもらう (ためにマニュアル/FAQ 類を充実させる) ほうが
ユーザ側もらくだと思うのだがどうだろうか
DHCP で運用すりゃ重複しねーだろ、とか
WinCE 機器は 192.168.1.0/24 中の 200-249 のどれかに設定汁とか
重複がある場合の調査方法とか

こんな記事を紹介
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=37529&forum=6


eniac  2007-03-29 23:24:03  No: 64777

ですよねぇ、僕もそう思うし、そお言いたいんですけど…言えない(悲)
どんな劣悪な環境でも、ユーザーが赤ちゃんでも大丈夫にするように言われてるので…。あっ、でも紹介していただいた記事のおかげで重複の検知の難しさがアピールできそうで助かりました。有り難う御座います。

  現在、SendARPを用いた方法でなんとかならないか、検証継続中。


瀬戸っぷ  2007-03-30 09:00:53  No: 64778

ノートPC(XP Pro SP2)で試してみました。
設定したIPアドレスは192.168.1.250。
自宅のLAN環境では無線LANルータ(WN-G54/R2)のWAN側のIPアドレスです。

起動状態のノートPCにLANケーブルを接続。
固定IPで設定しているのですが…DHCPに問い合わせしているかのような表示が。
(UPnPか?)
しばらく放置してみましたが、「競合している」とのポップアップを表示して終わりでした。
そのままSendARP()。
エラーでした。(デバイスが起動していない…とか)
IPアドレスを競合していない状態に変更して、
自IPアドレスを指定してSendARP()。
正常終了で、NICのMACアドレス取れました。
…自IPアドレスでも取れるのか……


無常  2007-03-30 11:27:08  No: 64779

>ユーザーが赤ちゃんでも大丈夫にするように言われてるので…。
こういうのって、言葉で言うのは簡単ですが実際には無理です。無理にすればかえって挙動がおかしくなって本末転倒になったりします。

それが分からずに求めてくるのは、それを言う人が素人なのか、知識不足なのか、無能なのか、そのあたりの理由です。

そういう人の下に付くと色々苦労しますが、(仕事なら)別の会社に転職するぐらいしか解決方法が無い場合が多いので、どうしようもないっすね。


eniac  2007-03-31 01:17:17  No: 64780

>瀬戸っぷさん、無常さん

馬鹿な質問に付き合ってくださって有り難う御座います。  
現在、SendARP()を用いた検証中なのですが、相変わらず、自IPを調べると、マックアドレスは『FF-FF-FF-FF-FF-FF』です。(競合相手として、同一IPのWin2000パソコンを繋いでも繋がなくても。)
  ネットワークには他にWin95パソコンが繋がっているのですが、こいつにたいして、SendARP()すると、Win95パソコン自身で『winipcfg』したときのマックアドレスと同一の値が出力されてくるので、恐らく、コーディング自体には問題無いと考えています。
  WinCEというのは、基本的にデスクトップOSより機能が削られているというのを良く聞きます。ひょっとして、自IPにARPする時は自分がそのIPに該当する場合、他パソコンは調べないのではと推測してます。
  またWinCEだからSendARP()が期待通り動作しない事を検証しようとWin2000パソコンにてアプリを作成したところ、また問題発生です。『iphlpapi.h』がインクルード出来ないのです。そこで、Win2000パソコンの中で『iphlpapi.h』を検索したところ、evcのincludeフォルダには、『iphlpapi.h』が有り、vcのincludeフォルダには『iphlpapi.h』が無いのです。ちなみに、VC++バージョン6.0にSDKアップデートをかけてもだめでした。今回は忘れずに、『iphlpapi.link』もリンクしました。
  ……。このまま行くと初心者の私では、疑問が増えるばかりで一向に問題解決に向かわないような気がしてきました。

  そこで、代替案を考えたのです。『http://itpro.nikkeibp.co.jp/article/COLUMN/20060122/227653/』のページによると、後から、重複IPパソコンを繋ぐと、IPが『0.0.0.0』になるということなので、自分のIPを覚えておいて、『0.0.0.0』に変化した事が確認されたら、IP重複の可能性が有る旨表示するのはまずいでしょうか?(もし、重複相手が『0.0.0.0』になったらそれはOSが自動で投げるARPのせいだからアプリでは防ぎようが無いとする。)


eniac  2007-03-31 01:32:28  No: 64781

すいません。上記だと説明不足で理解しづらいと思うので、ウザイですが追記させて下さい。
  代替案における自分とは『WindowsCE』の事で、WindowsCEが自IPを記憶しておき、『0.0.0.0』に変化したら他者からARPがかかったものとするという事です。
  代替案における重複相手とは、『2007/03/29(木) 09:46:11』書き込みの『Windows2000』を指します。『Windows2000』のIPが『0.0.0.0』になった場合、OSが勝手に投げてるARPなのでアプリでは防げないかと……。代替案というより、妥協案でしょうか(笑)。


tetrapod  2007-03-31 01:53:26  No: 64782

その手の泥縄な解決策は、開発部隊の当初想定と違う運用してる現場で
障害になることが多いっす (んで、事件は現場で起きる、っと)

DHCP 配下では DHCP 失敗でも IP が 0.0.0.0 になるので
実際には DHCP 失敗であるとか LAN ケーブル断線とかであるにもかかわらず
表示されるメッセージに「IP アドレスが重複しました」と書いちゃうと
ますます混乱の元になるだけであったりトカ
でもメッセージを「LAN に障害が発生しました」とかにできなかったり...

現場の運用パターンをすべて想定するのなんて無理なんだから、
勝手な思い込みでイランことをするとよりいっそう混乱を招くだけ、と
上司に上申してみるのが早そう。

VC++6 には iphlpapi.h 無いっすね
cygwin に include/w32api/iphlpapi.h と lib/w32api/libiphlpapi.a がある
みたいなんで試してみるトカ (時間の無駄っぽい)


eniac  2007-03-31 03:54:42  No: 64783

>御回答くださった皆様

  有り難う御座いました。色々考えた末、やはり、IPの管理は運用で厳密に規定して頂く事にして、やはり、アプリでの対策は無しとしたいと思います。
さんざん質問して申し訳無かったですが。特に、瀬戸っぷさん、何回も回答頂いた上に、方針変更しようとして、とても申し訳ないです。
  ソフトは一週間前と何も変わらないという結果になりましたが、個人的には、とても勉強になってよかったと思います。
  以上で解決とさせて下さい。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加