I-O DATAのWiFiルーター WN-DX1167R の管理画面をWEBブラウザで開く方法

コロナの影響で在宅勤務となりました。WiFiルーターが古くて(11a/b/gまでしか対応していなかった)、新しいWiFiルーターを購入しました。I-O DATAのWN-DX1167Rです。電気屋に行ったら標準タイプ、強力タイプ、超強力タイプと分かれていて、WN-DX1167Rは標準タイプに分類されてました。無線LANの速度で標準〜超強力まで分かれているように思えましたが「電波がちゃんと届く」ことが大事だと思ったので推奨環境が戸建て3階/マンション4LDKとなっているコレにしました。何より安かったというのが決め手なのですが。でもAmazonのほうがもっと安かったです。。

で、本題です。WiFiルーターのセットアップは問題なくできました。PCやスマホも無線LANで繋がります。で、細かい設定をしようと思いWiFiルーターの管理画面にWEBブラウザでアクセスしたのですが、これが繋がらない。セットアップするときにユーザー名とパスワードを設定したので、これでログインをしようと思ってもできない状態です。説明書には設定画面が表示されないときは「WEBブラウザを開き”192.168.0.1″を入力して開いてみる」とありましたので、それを信じていました。

ユーザー名とパスワードの入力を求める画面です。

入力した後に表示される画面です。認証エラーとなってしまいます。

なお、説明書には「Magical Finder」というアプリをインストールして設定画面にアクセスするようなことも書かれているのですがPCがLinux(ubuntu)なのでアプリをインストールできませんでした(windows向けしかなさそう)。

で、しぶしぶスマホにMagical Finderをインストールしてアクセスしてみたところ「192.168.0.201」のアドレスにアクセスしていることがわかりました。試しにPCのWEBのブラウザから「http://192.168.0.201/」でアクセスしてみたところ、無事接続できました!ファームウェアのバージョンが1.02.000となっていて、このバージョンであれば192.168.0.201で接続できるんじゃないかと思います。

ちなみに認証エラーの画面(先ほど示した192.168.0.1でアクセスした画面)にもファームウェアバージョンが記載されていて、こちらは22.01となっています。別物なのだと思います。メーカーが推奨していないやり方かもしれないので自己責任でお願いします。

ちなみに管理画面の左側にある「モバイル表示」にするとこんな感じです。PCで使うにはちょっと見づらいです。

無線LAN自体は特に不満なく使えてます。

C言語のポインタ変数にはどうして型が必要なのか?

C言語のポインタ変数はメモリ上のアドレス位置を格納する変数です。アドレス位置を格納する場合、ポインタ変数には32bit OSでは4バイト、64bit OSでは8バイトが割り当てられます。これは、32bit OSの場合は2の32乗(約4ギガバイト)までのメモリを扱える(制御できる)ということになります。64bit OSの場合は2の64乗(約18エクサバイト)です。

本題に入る前に以下のプログラムを実行してみて実際の型のサイズを確認してみます。ポインタ変数のサイズの確認ですが、char型、int型、float型、double型のサイズも表示するようにしています。コンパイル、および、実行した環境は64bit Linux(ubuntu)です。


#include <stdio.h>

int main( void )
{
	char  *charp;
	int  *intp;
	float  *floatp;
	double  *doublep;
	void  *voidp;

	printf( "整数型のサイズ\n" );
	printf( "sizeof( char ) = %d\n", (int)sizeof( char ));
	printf( "sizeof( short ) = %d\n", (int)sizeof( short ));
	printf( "sizeof( int ) = %d\n", (int)sizeof( int ));
	printf( "sizeof( long ) = %d\n\n", (int)sizeof( long ));

	printf( "浮動小数点型のサイズ\n" );
	printf( "sizeof( float ) = %d\n", (int)sizeof( float ));
	printf( "sizeof( double ) = %d\n", (int)sizeof( double ));
	printf( "sizeof( long double ) = %d\n\n", (int)sizeof( long double ));

	printf( "ポインタのサイズ\n" );
	printf( "sizeof( charp ) = %d\n", (int)sizeof( charp ));
	printf( "sizeof( intp ) = %d\n", (int)sizeof( intp ));
	printf( "sizeof( floatp ) = %d\n", (int)sizeof( floatp ));
	printf( "sizeof( doublep ) = %d\n", (int)sizeof( doublep ));
	printf( "sizeof( voidp ) = %d\n", (int)sizeof( voidp ));

	return 0;

}

実行した結果は以下です。

整数型のサイズ
sizeof( char ) = 1
sizeof( short ) = 2
sizeof( int ) = 4
sizeof( long ) = 8

浮動小数点型のサイズ
sizeof( float ) = 4
sizeof( double ) = 8
sizeof( long double ) = 16

ポインタのサイズ
sizeof( charp ) = 8
sizeof( intp ) = 8
sizeof( floatp ) = 8
sizeof( doublep ) = 8
sizeof( voidp ) = 8

ここから本題に入ります。ポインタ変数はメモリ上のアドレス位置を格納できれば良いので8バイト分を確保すれば済みます。わざわざchar型のポインタ変数、int型のポインタ変数などと分ける必要があるのでしょうか?

これについては僕が思っている答えを書いておきます。ポインタ変数に格納されているアドレス位置はその変数の開始位置であって、それ以上の情報はありません。実際にプログラムが変数を取り出すには変数の開始位置と終了位置(開始位置からどれだけの領域を確保しているか)の情報が必要です。以下に図で示します。

ポインタは変数の開始位置を指し示していますが、アドレス位置だけでは変数が何バイト分の領域を要しているかはわかりません。この「何バイト分の領域か?」を示すのがポインタ変数の型となります。char型であれば開始位置から1バイト分、int型であれば開始位置から4バイト分となります。ポインタ変数に型を指定することで、ポインタを使用して参照する変数への値の代入や書き換えが可能になると考えます。

C言語のポインタは配列と強い関係性があります。配列の先頭位置をポインタ変数に格納してそれに整数を加算すると、配列の要素を数え上げることになります。

void型のポインタについても書いておきます。void型のポインタは、char、int、float、doubleのどの型のポインタでも格納することができます。ですが、void型のポインタは「開始位置から何バイトを保持しているのか?」の情報を持っていないので、void型のポインタを使用して変数へのアクセス(値の参照や代入など)はできません。

最後に。
C言語を学ぶ上でバイブルと呼ばれている本です。初心者向けの本を一通り読み終えた後に読むと理解が一層深まります(初心者が読むには少し難しい)。かなり昔の本ですが、Cの思想や考え方などは今読んでもとても参考になります。