MASATOの開発日記


前の開発日記 次の開発日記 一覧

2002/02/20

最近仕事でVisualSourceSafeを使ってこれは便利だと思いました。 プロジェクトが多数になり、自分専用のライブラリなんかを作ったりしていますと、 「ビルドできるソース下さい」って言われたときにあちこちからソースをかき集める必要があって やたらと大変である。VisualSourceSafeはそこらへんの問題をあっさり解決してくれます。 でもめちゃめちゃ高いんですよね。6〜7万位か。これだけ高いと手が出ないなぁ・・・。
ソース管理ソフトはVisualSourceSafeだけじゃないけれど、VC++との連携を考えたりすると VisualSourceSafeがダントツ使い勝手No.1だと思います。

関連を断つ

クラスAとクラスBがあって、両方とも互いのポインタを持って、 それを通じてお互いの多数の関数を呼び出す、なんて設計はときどきあります。 オブジェクト指向的には、クラス同士の関連が深いのはあまり好ましくないです。 そこで、どうやってこういった設計を解消していくかと考えてみます。
こういう場合どちらか片方の関係を断ってしまうのはまず無理ですので、 関係を薄くする方法を考えた方が良いです。その代わり反対向きの関係は 深くなっても良いです。クラスAはクラスBに深く依存するが、 クラスBはクラスAにはさほど依存しない、というふうにできれば良いのです。 このとき、依存される方(この場合はクラスB)は変更が少ないと理想的ですね。
そして、必ずAからBとBからA、両方の向きについて考えることをお勧めします。 良い設計への突破口が開けることがあります。
片方の関連さえ浅く出来ない場合というのも少なからずありますので、 どうしても無理そうだったらすっぱり諦めてしまうのも1つの手です。

自端末上の全てのIPアドレスを取得する方法

環境Visual C++ 6.0

LANカードが2つあるような、複数のIPを持っているような環境において、 全てのIPを取得する方法を調べてみました。
gethostnameとgethostbynameを用いる一般的な方法です。

まずはヘッダファイルをインクルードします。

#include <winsock.h>

次に、ライブラリをリンクします。

#pragma comment(lib, "ws2_32.lib")

もちろん、プロジェクトの設定で行っても構いません。

次に、ソケットの初期化をします。

WSADATA ws;
WSAStartup(MAKEWORD(1,1), &ws);

ここでは初期化失敗の時の処理は書いてないので注意しましょう。

そして、ようやくIP取得です。

char buf[256];
LPHOSTENT hostentry;

gethostname(buf, sizeof(buf));
hostentry = gethostbyname(buf);
for (int i = 0; hostentry->h_addr_list[i]; i++){
  IN_ADDR addr;
  addr.S_un.S_addr = *((ULONG*)hostentry->h_addr_list[i]);
  // ●ここでaddrを処理する。●
}

これで全てのIPが列挙できます。

なお、MFCの場合は、インクルードするファイルは

#include <afxsock.h.h>

初期化は

AfxSocketInit();

となります。

私の場合は、ネットマスク値も知りたかったので、また別の方法を使いました。 それについてはまた次回・・・

前の開発日記 次の開発日記 一覧