比治山日記

比治山スカイウォーカーです

ns-3で指定したノードのIPv4アドレスを文字列で得る

ns-3でモデルを書いていると,今着目しているノードのアドレスが何なのかわからなくなるときがよくある.そんなときのためノードとインターフェースを指定してIPv4アドレスを文字列で得るためのメモ.

string getIpAddress (Ptr<Node> node)
{
  Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();

  uint32_t ipvif = 1; // 0はループバックアドレス
  Ipv4InterfaceAddress ifAddr = ipv4->GetAddress (ipvif, 0);
  Ipv4Address addr = ifAddr.GetLocal ();

  uint32_t rawAddr = addr.Get ();
  ostringstream oss;
  oss << ((rawAddr >> 24) & 0xff) << "." << ((rawAddr >> 16) & 0xff) << "."
      << ((rawAddr >> 8) & 0xff) << "." << ((rawAddr >> 0) & 0xff);

  return oss.str ();
}

ノードのポインタを渡して,そのノードにインストールされているインターフェースの番号(0番がループバックアドレスになるので,今回はその次の番号.)を指定し,そのインターフェースに紐付いている最初のアドレスをuint32_tで取得して文字列に整形しています.

次のスクリプトで2台のノードをPointToPointネットワークで接続して,10.1.1.0/24を自動的に割り当てたあと,割り当てたアドレスを参照してみます.

int main (int argc, char **argv){
  const int NUM = 2;
  NodeContainer nodes;
  nodes.Create (NUM);

  PointToPointHelper pointToPoint;
  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

  NetDeviceContainer devices;
  devices = pointToPoint.Install (nodes);

  InternetStackHelper stack;
  stack.Install (nodes);

  Ipv4AddressHelper address;
  address.SetBase ("10.1.1.0", "255.255.255.0");

  Ipv4InterfaceContainer interfaces = address.Assign (devices);

  for (int i = 0; i < NUM; i++){
    cout << getIpAddress (nodes.Get (i)) << endl;
  }
  return 0;
}

手元で実行すると以下のように出力されたのでとりあえずあってそうです.

10.1.1.1
10.1.1.2