• ベストアンサー

Winsock(またはWinInet)でグローバルIPを調べたい

WinsockかWiniNetのいずれかを用いてグローバルIPアドレスを 取得することは可能でしょうか? 192.~のようなプライベートIPならWinsock関数を組み合わせて取得できたのですが・・。

質問者が選んだベストアンサー

  • ベストアンサー
  • kamisui
  • ベストアンサー率50% (2/4)
回答No.3

>今回は2の方法で以降と思うのですが、CGIを踏ませる、 >ということはブラウザを開く関数を使うということでしょうか? ブラウザを開く必要はありませんよ。 ブラウザは無関係です。 >アクセスしたことにするにはブラウザが開いていた記憶があります。 何か勘違いされていると思います。 winsockでもWinInetでも可能ですが、ごく普通にページの取得を行えばWebサーバ上でCGIが実行され、結果を受け取ることができます。 WinInetならば、 InternetOpen() InternetOpenUrl() InternetReadFile() を順に実行して受け取ったデータからIPアドレスに該当する部分を切り出せば良いです。(InternetCloseHandle()も忘れずに・・・) (具体的には”WinInet ファイル読み込み”といったようなキーワードで検索すれば色々参考になるサイトがあると思います。) CGIでは$ENV{'REMOTE_ADDR'}(例:Perlの場合)を出力するようにしておいてください。

RockmanX
質問者

お礼

なるほど!これを見て解決しました。 本当にありがとうございます!感謝の極みです!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • kamisui
  • ベストアンサー率50% (2/4)
回答No.2

こんにちは。 192.x.x.xが取得できるということはLANのプライベートアドレスですね。 ネットワーク構成によりますが、グローバルアドレスの情報はルータが持っていると思います。 現実的に考えられるやり方は以下の2つでしょうか。 1.UPnPをつかってルータから取得 *ルータが対応している必要あり 2.どこかインターネット上のWebサーバにCGIを設置してアクセス元のIPアドレスを返すようにしておき、それをHTTPをつかって取得する 2が可能なら簡単です。 1の場合はUPnP、GetExternalIPAddressをキーワードに検索してみてください。実装は少し難しいです。

RockmanX
質問者

お礼

親切な回答ありがとうございます。 ちょっと追加で質問させて頂きたいのです。 今回は2の方法で以降と思うのですが、CGIを踏ませる、 ということはブラウザを開く関数を使うということでしょうか? WinsockにもWinINetにそんな関数があるのですが、確かURL先の ファイルの内容を取得・・まではブラウザを開かずに可能ですが、 アクセスしたことにするにはブラウザが開いていた記憶があります。 ブラウザを開かせず(表向きには見せずに)に対象のURLにアクセスして CGIを動作させることができるような関数があるのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

「ルータの内側からルータが持ってるグローバルIPアドレスを引けるか」という意味でしたら無理です。 その情報はOSが持っていないので。

RockmanX
質問者

お礼

なるほど・・原理的に難しいのですね。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Winsockコントロールにて・・・。

     Winsockコントロールでホスト名からIPアドレスを求めることはできたので、今度はIPアドレスからホスト名を取得しようと試みています。 APIを用いた場合、     ret =gethostbyname("ホスト名") でホスト名からIPアドレスを求めることができ、     ret =gethostbyaddr("IPアドレス",len,type) でIPアドレスからホスト名を取得することができるので、もしかしたらできるのでは?と思いチャレンジしていますがなかなか上手くいきません…。  やはりWinsockコントロールでは限界があるのでしょうか? ※環境はVisualBasic6.0 pro です。

  • WinINet関数について質問です。

    WinINet関数を使いVCプログラムしています。 HTMLをダウンロードしてきて、情報を解析しているのですが。 InternetOpen InternetOpenUrl ↓ InternetReadFile 手順で、HTMLの所得はできるのですが、 ユーザー認証がいるサイトの情報を取る方法がわかりません。 (例えば:mixi,facebookなど) WinINet関数を使用してサイトにログインしてから、 指定のURLのHTMLを取得する様な感じだと思っているのですが、やり方がわかりません。 参考になる、サイト等知っている方がいましたら、教えて頂けると嬉しいです。

  • wininet.dllとwsock32.dllについて

    クライアントのVBAから、サーバにHTTPで文字データを送信しようとしています。 1. WinAPIの"InternetOpenURL"(wininet.dll)が使えると思いましたが、MSDNLibraryではWinCE用と英語で言っているようでした。W2Kの自PCにも上記DLLは入っていますが、W2Kで使うのは一般的ではないのでしょうか? 2. クライアントのIPアドレスも送信したいので、wsock32.dllのAPIで取得しようとしています。wininetやwsock32が、いつインストールされるものなのか(OS入れた時か、Officeか、IEか等)を調べる手段はあるでしょうか?また、MS社以外の製品によって、これらのDLLがアップデートされてしまうことは通常ないと考えていてよいものでしょうか? ご教授下さいますよう、よろしくお願いします。

  • 複数のIP取得

    WinsockでIP取得できるのは知っているんですが、複数のIPが設定してある場合に全部のIPを取得することは可能でしょうか?

  • UDP/IPでのソケット作成について(winsock)

    UDP/IPでのソケット作成について(winsock) 開発環境VC++.NET、O/S WIN2000にてソケットプログラミング(winsock2.0)をしています。 コンソールプログラミングではありませんが、WindProcは持っていません。 UDPサーバーを作り、複数クライアントの対応をしたいと考えています。 クライアントAからの通信やりとり中に クライアントBからの通信がきたら、そちらとも通信やりとりを(自動で)行いたい。 ここで問題なのが、クライアントAの要求ポートが15000で、 クライアントBの要求ポートも15000なのです。 同じ既に開いているポートでソケット作成しようとしても、socket()関数はエラーを返してくるのですが、 やり方を工夫すれば、同一ポートでの複数クライアント対応は可能なのでしょうか。不可能なのでしょうか。 可能であれば、やり方、ヒント等教えてください。よろしくお願いします。 追記 (1)TCP/IPでは、同一ポートでソケット作成が可能でした。ネットで探したサンプルプログラムが  そのような動きをしていたのですが、UDPに書換えることはできませんでした。  http://eternalwindows.jp/network/winsock/winsock04s.html (2)UNIXの場合fork()処理後に socket()作成 → bind()で同一ポートでの複数クライアント対応が  上手くいくらしいのですが、Windowsではマルチスレッド等をうまく活用すれば、  fork()と同様の処理が可能になり、目的が達成できるでしょうか。

  • VC++ 2008 Express EditionでWinInet.hのインクルードができない

    Visual C++ 2008 Express EditionにてWinInet.hを使いたいのですが、インクルードすると283件のエラーが吐き出されます。 そのエラーの内容はWinInet.hのソースに不備があるというもので、「;」による構文エラー、型指定がありません、シンボルがオーバーロードできないなどです。 しかしエラー箇所のソースに不備はありません。色々調べましたがこの現象に該当するものが見つかりませんでした。 WinInetを使うときは何か特別な手続きが必要なのでしょうか? WinSock.hのインクルードだとエラーなくコンパイルできるのですが・・・。

  • IPアドレスについて

    バッファローのBraodStationを使っています。 IPアドレスというのは1つだけ付与されるものだと思っていました。 しかし、ルータの現在値をみてみると次のようになっているのに気付きました。 (注・数値は勝手に書き換えてあります) IPアドレス    220.218.114.116 DNS1(プライマリ)202.248.1.17 (自動取得) DNS2(セカンダリ)210.160.22.126(自動取得) IPアドレスは私に与えられたものだと思いますが、 後の2つのIPアドレスらしきものはなんなのでしょう? 俗にいうプライベートアドレスとも違うようですが・・・

  • IPアドレス(2)

    以前IPアドレスの事で質問させていただいたんですが またつまづいてしまいご助言願いたいと思いました。 現在使用しているグローバルIPが・・・ クラスBで、128.10.xxx.xxx の通りです そしてLANに繋いでる各端末に割当てている プライベートIPも128.10.xxx.xxxですが クラスBで割振るプライベートIPは 172.16.0.0~172.31.255.255 上記の範囲で割振らなければいけないと聞いたのですが 現行のグローバルIP 128.10.xxx.xxxで プライベートIPを単純に172.16.0.0~172.31.255.255 を割振って構わないのでしょうか?? それともグローバルIPを取得し直さなければダメか?? という所とその他諸々で悩んでいます。 プライベートIPはあくまでLAN内だけのアドレスだと思っていましたが何故使用出来る範囲が決まっているのか? すいませんが詳しい方がいましたら助けて下さい。

  • WinSock API

    IP変換器を使用してRS-232C → 変換器 → PC を1本のLAN上で行う処理を考えています。 しかし、VBも通信もまったくの初心者でなにから手をつけてよいのかがわかりません。ご指導お願いします。 1.APIを使用してのPG作成  WinSock APIは WinSockコントロールとの違いは何でしょうか?  またWinSock APIを使用する場合、VBへの組み込み方法を教えてください。

  • 文字列操作について(winsockの関数を用いています)

    こんばんは。 Winsockを用いてネットワークプログラミングを行っています。 A→Bへパケットを送信し、B側にてinet_ntoa関数(IPアドレスを文字列として表示させる関数)を用いて、以下のif文の条件を記述したのですが、if文内の条件がうまく動作しません。 デバッガを使用し、IPaddr内を見てみたところ、フフフフフフフフ……と言う文字列?が入っている状態です。 IPaddrに例えば、192.168.100.50等のIPアドレスを格納可能でしょうか? IPaddr[256] strcpy(IPaddr,inet_ntoa(from.sin_addr)); if(IPaddr == inet_ntoa(from.sin_addr)){  //別関数へ } よろしくお願い致します。