質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

ns3で”ns3-hello-world.cc”を実行することができない

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 972

hatana25

score 11

ns3で"ns3-hello-world.cc"というプログラムを実行したところ,
コンパイルはできるのですが,エラーが出てしまいます.

ソースコードは

/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/* payload-test.cc: send a greeting message between two nodes

  • F.Qian, Oct. 2013
  •  
  •  src(source) -----net(10Mbps,5ms)----- dst(destination)
  •                192.168.1.0/24
    */

include <iostream>

include <fstream>

include <string>

include <iomanip>

include "ns3/core-module.h"

include "ns3/network-module.h"

include "ns3/internet-module.h"

include "ns3/point-to-point-module.h"

include "ns3/applications-module.h"

include "ns3/tcp-header.h"

include "ns3/udp-header.h"

define     NET_MASK   "255.255.255.0"

define     NET_ADDR   "192.168.1.0"

define     FIRST_NO     "0.0.0.1"

define     PORT             50000

using namespace ns3;

NS_LOG_COMPONENT_DEFINE ("PayloadTest");

void
ReceivePacket (Ptr<Socket> socket)
{
Ptr<Packet> packet;
Address from;

uint8_t buf[1024];
memset(buf, 0, sizeof(buf));

while ((packet = socket->RecvFrom (from))) {
if (packet->GetSize () > 0) {
packet->CopyData(buf, 1024);
InetSocketAddress iaddr = InetSocketAddress::ConvertFrom (from);
char t[10];
sprintf(t,"%8.5f",Simulator::Now ().GetSeconds ());
std::cout << std::setw(10) << std::setprecision(4)
<< t << " received "<< packet->GetSize ()
<< " bytes from: (" << iaddr.GetIpv4 ()
<< ", " << iaddr.GetPort () << ")"
<< " --- " << buf << std::endl;
}
}
}

InetSocketAddress
setSocketAddress(Ptr<Node> node, uint32_t port)
{
Ipv4InterfaceAddress adr = node->GetObject <Ipv4> ()->GetAddress(1, 0);
return InetSocketAddress (Ipv4Address(adr.GetLocal()), port);
}

int main (int argc, char *argv[], char *envp[])
{
CommandLine cmd;
uint16_t times=1;
std::string greeting_msg = "hello ns3 world !!!";

//timesには送信する回数、greetingには送信するメッセージを指定する
cmd.AddValue("times", "The number of times to send.", times);
cmd.AddValue("greeting", "The greeting message from source to destination.", greeting_msg);
cmd.Parse(argc, argv);

//ノードを生成する
NS_LOG_DEBUG("Creating Topology");
Ptr<Node> src = CreateObject<Node> ();
Ptr<Node> dst   = CreateObject<Node> ();
NodeContainer net_nodes;
net_nodes.Add (src);
net_nodes.Add (dst);

//データリンク層の設定を行う
PointToPointHelper p2p;
p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
p2p.SetChannelAttribute ("Delay", StringValue ("2ms"));
p2p.SetQueue ("ns3::DropTailQueue");

NetDeviceContainer devices;
devices = p2p.Install (net_nodes);

//ネットワーク層の設定を行う
InternetStackHelper stack;
stack.InstallAll ();

Ipv4AddressHelper address;
address.SetBase (NET_ADDR, NET_MASK, FIRST_NO);
Ipv4InterfaceContainer ifs = address.Assign (devices);
NS_LOG_INFO ("Network : " << ifs.GetAddress(0, 0) << " - " << ifs.GetAddress(1, 0));

NS_LOG_INFO ("Initialize Global Routing.");
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

// あて先ノードのソケットを生成する
TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");

NS_LOG_INFO ("set destination's socket.");
Ptr<Socket> sink_socket = Socket::CreateSocket (dst, tid);
InetSocketAddress dstSocketAddr = setSocketAddress (dst, PORT);
sink_socket->Bind (dstSocketAddr);
sink_socket->SetRecvCallback (MakeCallback (ReceivePacket));

// ソースノードのソケットを生成する
NS_LOG_INFO ("set source's socket.");
Ptr<Socket> src_socket = Socket::CreateSocket (src, tid);
InetSocketAddress srcSocketAddr = setSocketAddress (src, PORT);
src_socket->Bind (srcSocketAddr);
src_socket->SetAllowBroadcast (true);

//あて先のピアアドレスに接続する
src_socket->Connect (dstSocketAddr);

// 送信するパケットを組み立てる
uint8_t  buf[1024];
uint16_t bufsize;
bufsize = greeting_msg.size();
memcpy(buf, greeting_msg.c_str(),bufsize);
Ptr<Packet> packet = Create<Packet> (buf, bufsize);

//パケットを送信する
for(uint16_t i=0;i<times;i++)
src_socket->Send (packet);

Simulator::Stop (Seconds(10.0));
Simulator::Run ();
Simulator::Destroy ();

return 0;
}

です.

コマンドは
./waf --run "ns3-hello-world"

エラーは
Waf: Entering directory /home/hatanaka/ns-allinone-3.26/ns-3.26/build' Waf: Leaving directory /home/hatanaka/ns-allinone-3.26/ns-3.26/build'
Build commands will be stored in build/compile_commands.json
'build' finished successfully (0.562s)
Command ['/home/hatanaka/ns-allinone-3.26/ns-3.26/build/scratch/ns3-hello-world'] terminated with signal SIGSEGV. Run it under a debugger to get more information (./waf --run <program> --command-template="gdb --args %s <args>").

です.

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • keicha_hrs

    2017/09/04 20:26 編集

    (長すぎたので修正)まずはteratailのヘルプを読んでMarkdown記法を理解し、質問の体裁を何とかしてください。

    キャンセル

回答 1

0

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"
#include "ns3/tcp-header.h"
#include "ns3/udp-header.h"
#define     NET_MASK   "255.255.255.0"
#define     NET_ADDR   "192.168.1.0"
#define     FIRST_NO     "0.0.0.1"
#define     PORT             50000
using namespace ns3;

NS_LOG_COMPONENT_DEFINE ("PayloadTest");

void
ReceivePacket (Ptr<Socket> socket)
{
  Ptr<Packet> packet;
  Address from;

  uint8_t buf[1024];
  memset(buf, 0, sizeof(buf));

  while ((packet = socket->RecvFrom (from))) {
    if (packet->GetSize () > 0) {
      packet->CopyData(buf, 1024);
      InetSocketAddress iaddr = InetSocketAddress::ConvertFrom (from);
      char t[10];
      sprintf(t,"%8.5f",Simulator::Now ().GetSeconds ());
      std::cout << std::setw(10) << std::setprecision(4)
      << t << " received "<< packet->GetSize ()
      << " bytes from: (" << iaddr.GetIpv4 ()
      << ", " << iaddr.GetPort () << ")"
      << " --- " << buf << std::endl;
    }
  }
}

InetSocketAddress
setSocketAddress(Ptr<Node> node, uint32_t port)
{
  Ipv4InterfaceAddress adr = node->GetObject <Ipv4> ()->GetAddress(1, 0);
  return InetSocketAddress (Ipv4Address(adr.GetLocal()), port);
}

void 
SendPacket (Ptr<Socket> socket, Ptr<Packet> packet)
{
  socket->Send (packet);
}

int main (int argc, char *argv[], char *envp[])
{
  CommandLine cmd;
  uint16_t times=1;
  std::string greeting_msg = "hello ns3 world !!!";

//timesには送信する回数、greetingには送信するメッセージを指定する
  cmd.AddValue("times", "The number of times to send.", times);
  cmd.AddValue("greeting", "The greeting message from source to destination.", greeting_msg);
  cmd.Parse(argc, argv);

//ノードを生成する
  NS_LOG_DEBUG("Creating Topology");
  Ptr<Node> src = CreateObject<Node> ();
  Ptr<Node> dst   = CreateObject<Node> ();
  NodeContainer net_nodes;
  net_nodes.Add (src);
  net_nodes.Add (dst);

//データリンク層の設定を行う
  PointToPointHelper p2p;
  p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
  p2p.SetChannelAttribute ("Delay", StringValue ("2ms"));
// p2p.SetQueue ("ns3::DropTailQueue");

  NetDeviceContainer devices;
  devices = p2p.Install (net_nodes);

//ネットワーク層の設定を行う
  InternetStackHelper stack;
  stack.InstallAll ();

  Ipv4AddressHelper address;
  address.SetBase (NET_ADDR, NET_MASK, FIRST_NO);
  Ipv4InterfaceContainer ifs = address.Assign (devices);
  NS_LOG_INFO ("Network : " << ifs.GetAddress(0, 0) << " - " << ifs.GetAddress(1, 0));

  NS_LOG_INFO ("Initialize Global Routing.");
  Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

// あて先ノードのソケットを生成する
  TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");

  NS_LOG_INFO ("set destination's socket.");
  Ptr<Socket> sink_socket = Socket::CreateSocket (dst, tid);
  InetSocketAddress dstSocketAddr = setSocketAddress (dst, PORT);
  sink_socket->Bind (dstSocketAddr);
  sink_socket->SetRecvCallback (MakeCallback (ReceivePacket));

// ソースノードのソケットを生成する
  NS_LOG_INFO ("set source's socket.");
  Ptr<Socket> src_socket = Socket::CreateSocket (src, tid);
  InetSocketAddress srcSocketAddr = setSocketAddress (src, PORT);
  src_socket->Bind (srcSocketAddr);
  src_socket->SetAllowBroadcast (true);

//あて先のピアアドレスに接続する
  src_socket->Connect (dstSocketAddr);

// 送信するパケットを組み立てる
  uint8_t  buf[1024];
  uint16_t bufsize;
  bufsize = greeting_msg.size();
  memcpy(buf, greeting_msg.c_str(),bufsize);
  Ptr<Packet> packet = Create<Packet> (buf, bufsize);

//パケットを送信する
  for(uint16_t i=0;i<times;i++) {
    // src_socket->Send (packet);
    Simulator::Schedule(ns3::Seconds(i), &SendPacket, src_socket, packet);
  }

  Simulator::Stop (Seconds(10.0));
  Simulator::Run ();
  Simulator::Destroy ();

  return 0;
}

変更点としては
・SendPacket関数の定義、Simulator::ScheduleからSendPacket関数を呼び出してSend処理を行うように変更
・p2p.SetQueue ("ns3::DropTailQueue")のコメントアウト
です。

Socket->Send()の処理はSimulator::Scheduleで登録してあげないと上手く動きません(以前自分も同じところでエラーになりました)
DropTailQueueについては仕様が変わってると思うので、どうしても必要な場合は自分で探してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる