- - PR -
ネットワークアドレス
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-08-16 20:32
こんばんは。c#初心者のしゅうといいます。
c#で作るWebアプリで、クライアントが同一ネットワーク内からのアクセスか ネットワーク外からのアクセスかでブラウザに表示する項目を区別する という処理を行いたいと思ってます。 (同一ネットワーク内なら項目a,b,cを表示して、外からなら項目a,cしか表示しない) 単純にクライアントのIPアドレスとサブネットマスクを取得して、 ネットワークアドレスを算出して、定数として持っておいた同一ネットワークを 示すアドレスと比較すればいいかと思ったんですが、ネットワークアドレスの 算出がうまくできません。 WMIのManagementObjectSearcherを使って、IPAddressとIPSubnetは取得できた のですが、そこから先の演算でつまってます。IPAddressとIPSubnetを 2進数か16進数にして、and演算しようと思ってるんですが・・・ 以下のやり方だと、IPAddressを2進数や16進数に変換した際、string型になって しまうため、and演算ができなくなってしまいます。 //IPアドレスの取得 foreach( ManagementObject mo in collection ) { _IPAddress = ((string [])mo.Properties["IPAddress"].Value)[0]; } IPAddress ipAddr_IPAddress; ipAddr_IPAddress = IPAddress.Parse(_IPAddress); byte[] bIPAddress=ipAddr_IPAddress.GetAddressBytes(); //バイト配列を16進数にしてstring配列に入れる string[] sIPAddress; sIPAddress= new string[bIPAddress.Length]; for(int i=0;i<bIPAddress.Length;i++) { sIPAddress[i]=Convert.ToString(bIPAddress[i],16); } //以下、IPSubnetも同様 そもそも、こういう目的に対し、このやり方(IPAddressとサブネットマスクで判断する)でいいのかというのも自信がありませんが、他のやり方が思いつきません。 どうかご教授ください。よろしくお願いします。 | ||||
|
投稿日時: 2005-08-17 12:46
文字列でIPアドレスが取得できているのなら、
で、変換できそうな気がする。 サブネットマスクも同様に...。 | ||||
|
投稿日時: 2005-08-17 13:05
IPAddress.Address プロパティ は、
「メモ : このメンバは旧バージョン用です。」ってなってますね。(VS.NET 2003) このプロパティは今後使用しません。代わりに、 GetAddressBytes を使用してください。 とのことなので、しゅうさんのプログラムのほうがよさそうです。 #これは整数型のエンディアンに影響を受けないための改善でしょう。 しゅうさんが誤解していると思うのは、 「2進数か16進数にして、and演算しよう」の部分だと思います。 2進数でも10進数でも16進数でもあらわしている数値は同じです。 つまり、and演算するために2進(表記)や16進(表記)をする必要は ないと言うことです。 GetAddressBytes()して帰ってきたbyte配列を各桁ごとに and演算すればよいと思います。 | ||||
|
投稿日時: 2005-08-17 18:50
かずくん さん、Java僧 さん、ありがとうございます。
>2進数でも10進数でも16進数でもあらわしている数値は同じです。 確かにそうですね。机上の計算の感覚で考えてました。 Java僧さんのアドバイスを参考にやってみます。ありがとうございました。 | ||||
|
投稿日時: 2005-08-19 05:21
GDNJ に、同じようなスレッドがあったので、リンク
_________________ |
1