- 締切済み
C#でIPアドレスの取得について
現在C#で、IPアドレスの取得で苦戦しています。 例えばNICが2枚ささっている状態で、 特定の通信先と通信を行っているNICのIPアドレスを取得するには どうすればいいでしょうか。 最終的には、通信を行っているIPアドレスから、 どちらのNICで通信を行っているか判別して そのNICのMACアドレスを取得したいです。 現在考えているのは、pingを通信先に飛ばしてその送信元のIPアドレスを取得するという事です。 ただ、これも実現方法がいまいち曖昧で、現在取得できていません・・・。 Pingを飛ばすところまではできているのですが、送信元のIPアドレスの取得のやり方がわかりません。 通信先は固定の予定なので、その通信先と通信する際に使用しているIPアドレスを知りたいです。 pingの送信元のIPアドレスを取得する方法、 またはほかに良い方法があれば教えていただけますでしょうか。 よろしくお願いします。
- sawadayusuke
- お礼率0% (0/4)
- C・C++・C#
- 回答数2
- ありがとう数0
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- x415f484f
- ベストアンサー率71% (57/80)
TCP での接続が確立しているなら、以下のコードで確認できます。 ※全角文字でインデントしてあります。 // filename: get_mac.cs // compile: %WINDIR%\Microsoft.NET\Framework\v3.5\csc get_mac.cs // or // %WINDIR%\Microsoft.NET\Framework\v2.0.50727\csc get_mac.cs using System; using System.Net; using System.Net.NetworkInformation; namespace get_mac { class Program { static void Main(string[] args) { if(args.Length == 2) { print_mac(args[0], Convert.ToInt32(args[1])); } else { Console.WriteLine("Usage: get_mac <remore IP address> <remote port>"); } } private static void print_mac(string remote_ip, int port) { string ip = get_local_ip_address(remote_ip, port); if(ip != "") { string mac = get_mac_address(ip); if(mac != "") { Console.WriteLine("MAC address: " + mac); } } else { Console.WriteLine("Not found"); } } private static string get_local_ip_address(string remote_ip, int port) { IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); IPEndPoint[] endPoints = ipProperties.GetActiveTcpListeners(); TcpConnectionInformation[] tcpConnections = ipProperties.GetActiveTcpConnections(); foreach (TcpConnectionInformation tcp_info in tcpConnections) { if (tcp_info.RemoteEndPoint.Address.ToString() == remote_ip && tcp_info.State == TcpState.Established && tcp_info.RemoteEndPoint.Port == port ) { return tcp_info.LocalEndPoint.Address.ToString(); } } return ""; } private static string get_mac_address(string ip) { NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface adapter in adapters) { if (adapter.OperationalStatus == OperationalStatus.Up) { IPInterfaceProperties ip_prop = adapter.GetIPProperties(); UnicastIPAddressInformationCollection addrs = ip_prop.UnicastAddresses; foreach (UnicastIPAddressInformation addr in addrs) { if (addr.Address.ToString() == ip) { PhysicalAddress phy = adapter.GetPhysicalAddress(); return phy.ToString(); } } } } return ""; } } }
- Tacosan
- ベストアンサー率23% (3656/15482)
ルーティングテーブルを取得してなんかできないかなぁ.
関連するQ&A
- なぜMACアドレスだけでなく、IPアドレスが必要なのか
現在ネットワークについて勉強しております。 ・MACアドレスはNICに固定で、隣接区間でのデータリンク通信に必要。 ・IPアドレスはネットワークを越える、エンドツーエンドでのあて先・送信元指定に必要。 という点は理解しております。 ネットワーク超えの通信においても、ホストを特定するための要素はMACアドレスだけで十分では?という疑問が生じました。 上記のエンドツーエンドでのあて先・送信元指定にもMACアドレスを用いる事はできるはずです。 (IPパケットの中に最終的な宛先・送信元MACアドレスを書けばいいのでは?) なぜ「IPアドレス」という概念が必要なのでしょうか。 MACアドレスとIPアドレスという、似たような概念をあえて2つ作っている理由を教えてください。
- ベストアンサー
- ネットワーク
- 異なるネットワークアドレスについて
例えば以下のような構成を考えます。 PC-----ルーター-----インターネット PCのIPアドレス 192.168.0.100 PCのMACアドレス AAA(簡単に) ルータのIPアドレス 192.168.0.1 ルータのMACアドレス BBB(簡単に) ここでPCから100.100.100.100というIPアドレスに ping通信をしたとします(別にhttpdでもftpでもいいです。)そして応答が返ってきた場合の応答パケット内の送信先、送信元のIPとMACは以下のようになっています。 送信先IP 192.168.0.100(PCの) 送信先MAC AAA(PCの) 送信元IP 100.100.100.100(ping対象の) 送信元MAC BBB(ルーターの) 上記では送信先IPと送信元IPのネットワークアドレスは異なります。ネットワークアドレスが異なれば通信はできないはずです。具体的にはネットワークアドレスの異なるパケットを受信した場合はPCは破棄するはずです。しかし実際には上記のような場合でもpingは通ります。 これはどういうしくみ(決まり)で動作しているのでしょうか? ご教授よろしくお願いします。
- ベストアンサー
- ネットワーク
- 送信元のIPアドレスとMACアドレスについて
送信先IPアドレスとMACアドレスが必要なのはわかるのですが、送信元のIPアドレスとMACアドレスがなぜ必要なのでしょうか?
- ベストアンサー
- その他([技術者向] コンピューター)
- IPアドレスとMACアドレス
異なるネットワーク間でデータが、ホスト→ハブ→ルータ→ルータ→ハブ→ホストと流れるとき、それぞれの区間ではIPアドレスとMACアドレスのどちらを元にデータを送ってるのでしょうか? また、送信先のMACアドレスはどうやって知るのでしょうか?
- ベストアンサー
- その他([技術者向] コンピューター)
- IPアドレスとMACアドレス
IPアドレス、MACアドレスについて質問です。 手紙を送るのに東京都新宿区~と一箇所の住所でとどきますよね。 しかし、パソコンなどの通信にはIPアドレス、MACアドレスの二つの住所?が存在します。 情報をとどけるだけなら固体それぞれについているMACアドレスに向かって送信するだけでいいのではないでしょうか? なぜIPアドレスが必要なのでしょうか?
- ベストアンサー
- その他(インターネット接続・通信)
- グローバルIPアドレスを取得したいです。
グローバルIPアドレス取得について 現在、私は賃貸マンションに住んでいます。 インターネットが無料の物件で、グローバルIPアドレスは 各入居者には割り当てられていません。 グローバルIPアドレスがないと、 NASやパナソニックの「おうちディーガ」で 外出先から自宅のデバイス(この場合、NASやディーガ)にアクセスが できないようです。 そこですぐにグローバルIPアドレスを取得できる 方法があるとサイトを見ました。 「DDNS」というサービスです。 https://nvr.bz/topics/information/dns.php こちらは私の今のネット環境から、こちらに切替は可能でしょうか?つまりグローバルIPアドレスを取得したいのです。 どなたかご存じであればご教示お願い致します。
- ベストアンサー
- ネットワーク
- DHCPでIPアドレスを取得できません
こんばんは。 普通に家庭のLANに繋がっていてインターネットにも接続できていたPCが、突然繋がらなくなってしまい困っています。 問題のPCは自作のDOS/V機で、WindowsXP Proで先月SP2を当てましたが一昨日までは問題なく使えていました。 インターネットにはフレッツADSLで接続しています。 LANにはADLSモデムの他にルータが入っていて、各PCのIPアドレスはDHCPによりルータから割り振られます。 繋がらなくなったPCとルータの間にはスイッチングHUBが入っていて、同じHUBには他にもノートPCが繋がっています。 一昨日、問題のPCからWebの閲覧などしていたところ(そのときは普通に繋がっていました)、突然、まったくネットワークに繋がらなくなりました。 ルータのIPアドレスにPINGを打ってみたところ「Destination host unreachable」となり、ipconfig /renewを行っても当然「DHCPサーバに接続できない」という内容のエラーが出てIPアドレスを再取得できません。 PCの再起動を行っても状況は変わりません。 同じHUBに繋がっていた別のノートPCはその時点でも普通にネットワークに接続でき、ルータへのPINGもIPアドレスの再取得も問題なくできていたので、試しに問題のPCに刺さっていたLANケーブルをノートPCにさしてみたのですが、やはり普通にLANにもインターネットにも接続できます。 そこで、問題のPCのNIC(オンボード)が壊れたのかと思い、今日新しく別にNICを買ってきてつけてみたのですが、新しいNICを使っても同じ問題が生じています。 SP2のセキュリティセンターのファイアウォールを無効にしてみても状況は変わりません。 以上の状況から、モデム・ルータ・HUB・LANケーブル・NICのいずれの問題でもないような気がするのですが、他に思い当たる原因はありますでしょうか。 もしくは、他に試してみるべき事項があれば教えていただけませんか。 よろしくお願いします。
- 締切済み
- その他(インターネット接続・通信)
- IPアドレスとMACアドレスを取得したい(C言語)
OSはLinuxで、コンパイラはgccです。 C言語でプログラムを作っていて、自分のIPアドレスとMACアドレスを取得しようと考えています。下のソースでIPアドレスは入手できたのですが、MACアドレスも取得しようとしたら、IPアドレスが上手く取得できなくなりました。ioctl(fd, SIOCGIFHWADDR, &ifr);で取得できるとおもうのですが、同時に取得しようとするとIPアドレスの表示が正しくされなくなっている状況です。 /* 自IPアドレスの取得 */ int fd; struct ifreq ifr; fd = socket(AF_INET, SOCK_STREAM, 0); ifr.ifr_addr.sa_family = AF_INET; /* eth0のIPアドレスの取得 */ strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1); ioctl(fd, SIOCGIFADDR, &ifr); /* MACアドレスの取得 */ ←上書きされている?? ioctl(fd, SIOCGIFHWADDR, &ifr); close(fd); どなかたご教授お願いいたします。
- ベストアンサー
- C・C++・C#
- macアドレス
現在tcp/ipに関する参考書を読んでいます。 そこに、LANはIPアドレスによって通信するのではなくMACアドレスでデータを渡す相手を判別すると書いてありました。 そこで、MACアドレスが分からない場合は(ARPキャッシュに無い場合)「ブロードキャスト」を行いMACアドレスを調べると明記してありましたが、通信相手が違うセグメントにいる場合はどうするのでしょうか? やはり、IPアドレスからユニキャストで調べるのではないでしょうか?
- ベストアンサー
- その他(インターネット接続・通信)
- ネットワーク上でデータ転送するときのMACアドレス取得
「3分間ネットワーク基礎講座」という本でネットワークの勉強をしています.本書内の『データ転送をするまでの流れ』で分からないことがあるので質問します. 本書によると, 「データ転送をする場合,宛先IPアドレス,宛先MACアドレス,送信元IPアドレス,送信元MACアドレスの4つが必要」 とあります. そして,次の4つのSTEPを説明しています. (1)自分のIPアドレスは手動またはDHCPから割り振られ,MACアドレスは自動的にわかっている (2)ユーザアプリケーションが宛先のホスト名を決定するとDNSでIPアドレスを取得する (3)IPアドレスが決定後,ARPによりMACアドレスを取得する (4)これで,送信元,宛先のMACアドレス,IPアドレスがそれぞれわかったため,データの転送が可能になる この説明の例では,同じネットワーク内のホスト同士(192.168.1.1と192.168.1.11)のデータ転送を行っています. ここで私の疑問ですが,異なるネットワーク同士(例えば,192.168.1.1と192.168.2.1)でデータ転送を行う場合,上記(3)のARPによるMACアドレス取得の動作はどうなりますか? ARPでは自分のネットワーク上のホストにブロードキャストでMACアドレスを聞いていると思いますが,異なるネットワークにもブロードキャストでMACアドレスを問合せするのですか?
- ベストアンサー
- その他([技術者向] コンピューター)