前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3

16.1. ネットワークアドレス管理

ネットワークアドレス(ドメイン名、IP アドレス、ポート番号)管理用のクラスとして、 以下の 2 種類のクラスがあります。

表 16.1. ネットワークアドレス管理クラス

クラス名 解説
SFXInetAddress ドメイン名や IP アドレスを管理するためのクラスです。 ドメイン名の解決(IP アドレスの解決)を行う機能も提供します。
SFXSocketAddress ドメイン名や、IP アドレス、ポート番号を管理するためのクラスです。 SFXInetAddress クラスを継承します。
[Note] 注意事項

SFXTCPSocket / SFXSSLSocket / SFXUDPSocket クラスでは、 ドメイン名の解決は自動的に行われます。

[Caution] mif ファイルの特権設定

ネットワーク機能を利用するには、 mif ファイルの特権レベル設定で「ネットワーク」の項目をオンにする必要があります。

16.1.1. ドメイン名や、IP アドレス、ポート番号の設定

ドメイン名や、IP アドレス、ポート番号は、SFXInetAddress::Set / SFXSocketAddress::Set 関数、 またはSFXInetAddress::SFXInetAddress / SFXSocketAddress::SFXSocketAddress コンストラクタで設定します。

SFXAnsiString 文字列のアドレスを設定する場合、 以下の書式で指定します。

<プロトコル> :// <ドメイン名> : <ポート番号> / <パス>  

または

<アカウント> @ <ドメイン名>
[Note] アドレスの書式

SFXInetAddress クラスの場合、ドメイン名以外は省略可能です。 アドレスに含まれるドメイン名だけが抜き出されて設定されます。

SFXSocketAddress クラスの場合、ドメイン名以外は省略可能です。 アドレスに含まれるドメイン名と、もしあれば、ポート番号(省略時は "0")が抜き出されて設定されます。

例 16.1. 定義

SFXSocketAddress address1("127.0.0.1");           // IP アドレス(ポート番号を省略した場合、ポート番号は "0" になる)
SFXSocketAddress address2("127.0.0.1:80");        // IP アドレスとポート番号
SFXSocketAddress address3("www.example.com:80");  // ドメイン名とポート番号
SFXSocketAddress address4("www.example.com", 80); // ドメイン名とポート番号

例 16.2. アドレスの設定

SFXSocketAddress address;

address.Set("www.example.com:80"); 
address.Set("http://www.example.com:80/dir1/dir2/index.html");
address.Set("user@example.com");

16.1.2. ドメイン名の解決

16.1.2.1. 自動的なドメイン名解決

SFXTCPSocket / SFXSSLSocket / SFXUDPSocket クラスでソケット通信を行う場合、 SFXSocketAddress 型のソケットアドレスを渡すと、 ドメイン名は自動的に解決されます。

例 16.3. 自動的にドメイン名を解決する方法

// ソケットアドレス(ドメイン名とポート番号)を設定する
SFXSocketAddress address("www.example.com:80");

SFXTCPSocket _socket;

// ソケットを開く
_socket.Open();

// サーバーに接続を要求する(SFXTCPSocket クラス内の処理により、ドメイン名は自動的に解決される)
_socket.Connect(address, XALLBACK_INTERNAL(OnConnect));

16.1.2.2. 手動によるドメイン名解決

[Caution] 注意

SFXTCPSocket / SFXSSLSocket / SFXUDPSocket クラスを利用してソケット通信を行う場合、 SFXSocketAddress 型のソケットアドレス(ドメイン名とポート番号)を渡せばドメイン名は自動的に解決されます。 そのため、通常、以下に述べる「手動によるドメイン名解決」は不要です。

手動でドメイン名を解決するには、 SFXInetAddress::Resolve 関数を呼び出します。 ドメイン名解決の結果は、この関数の引数に指定したコールバック関数に通知されます。 コールバック関数が呼び出されるまでに、 SFXInetAddress::Cancel 関数を呼び出すことによりドメイン名の解決をキャンセルできます。

ドメイン名が解決した IP アドレスは、 SFXInetAddress::GetIP / SFXInetAddress::AsINAddr 関数を使用して取得します。

複数の IP アドレスに変換された場合は、 SFXInetAddress::GetIP / SFXInetAddress::AsINAddr 関数の引数にインデックスを指定することにより、すべての IP アドレスを取得することが可能です。 IP アドレスの総数は、SFXInetAddress::GetCount 関数で取得できます。

[Note] IP アドレスを設定した場合

IP アドレスが設定されている場合、または ドメイン名が "nnn.nnn.nnn.nnn" (nnn: 数字) の形式で設定されている場合は、 SFXInetAddress::Resolve 関数を呼び出してドメイン名を解決する必要はありません。

例 16.4. 手動によるドメイン名解決

// コールバック関数で使うので、SFXSocketAddress インスタンスはクラスのメンバ変数として定義する
class MyClass {
private:
    SFXSocketAddress _address;
public:
    Void Start(Void);
    XALLBACK_DECLARE_SFXSOCKETADDRESS(ResolveCallback);
};

Void MyClass::Start(Void)
{
    SFCError error;

    // ドメイン名とポート番号を設定する
    if ((error = _address.Set("www.example.com:80")) == SFERR_NO_ERROR) {

        // ドメイン名を解決する (ドメイン名が解決すると、ResolveCallback 関数が呼び出される)
        error = _address.Resolve(XALLBACK_INTERNAL(ResolveCallback));
    }
    if (error != SFERR_NO_ERROR) {

        // エラーが発生したとき(コールバック関数は呼ばれない)
        ...
    }
}

// ドメイン名解決の完了が通知されるがコールバック関数
XALLBACK_IMPLEMENT_SFXSOCKETADDRESS(MyClass, ResolveCallback, error)
{
    SFXAnsiString ip;
    SInt32 i;

    if (error == SFERR_NO_ERROR) {

        // ドメイン名とポート番号をデバッグウィンドウに表示する
        TRACE("%s", _address.Get().GetCString());      // ドメイン名とポート番号
        TRACE("%s", _address.GetHost().GetCString());  // ドメイン名
        TRACE("%s", _address.GetPort().GetCString());  // ポート番号

        // IP アドレスの個数分繰り返す
        for (i = 0; i < _address.GetCount(); ++i) {

            // IP アドレスを取得し、デバッグウィンドウに表示する
            ip = _address.GetIP(i); 
            TRACE("%s", ip.GetCString());
        }
    } else {

        // エラーが発生したとき
        ...
    }
}
[Caution] SFXSocketAddress インスタンスの解放

コールバック関数が呼び出される前に、 SFXSocketAddress インスタンスが解放されると正しく動作しません。

[Note] コールバック関数の第 1 引数

SFXInetAddress::Resolve 関数は、 内部で BREW API INETMGR_GetHostByName 関数を呼び出します。 BREW API INETMGR_GetHostByName 関数の呼び出しに伴うエラー値は、 コールバック関数の第 1 引数に渡されます。