NS3套接字编程

问题描述 投票:0回答:1

#include "ns3/applications-module.h"
#include "ns3/core-module.h"
#include "ns3/csma-module.h"
#include "ns3/internet-module.h"
#include "ns3/network-module.h"
#include "ns3/socket.h"

#include <fstream>

using namespace ns3;

NS_LOG_COMPONENT_DEFINE("UdpClientServerExample");

void ReceivePacket(Ptr<Socket> socket)
{
    Ptr<Packet> packet;
    Address from;
    while ((packet = socket->RecvFrom(from)))
    {
        NS_LOG_UNCOND("Received " << packet->GetSize() << " bytes from " << from);
    }
}

int main(int argc, char *argv[])
{
    // Declare variables used in command-line arguments
    bool logging = true;
    uint16_t serverPort = 7777; // Use uint16_t for the port
    Address serverAddress(InetSocketAddress(Ipv4Address("172.26.34.69"), serverPort)); // Server address

    CommandLine cmd(__FILE__);
    cmd.AddValue("logging", "Enable logging", logging);
    cmd.Parse(argc, argv);

    if (logging)
    {
        LogComponentEnable("UdpClient", LOG_LEVEL_INFO);
        LogComponentEnable("UdpServer", LOG_LEVEL_INFO);
    }

    NS_LOG_INFO("Create nodes in above topology.");
    NodeContainer n;
    n.Create(2);

    InternetStackHelper internet;
    internet.Install(n);

    NS_LOG_INFO("Create channel between the two nodes.");
    CsmaHelper csma;
    csma.SetChannelAttribute("DataRate", DataRateValue(DataRate(5000000)));
    csma.SetChannelAttribute("Delay", TimeValue(MilliSeconds(2)));
    csma.SetDeviceAttribute("Mtu", UintegerValue(1400));
    NetDeviceContainer d = csma.Install(n);

    NS_LOG_INFO("Assign IP Addresses.");
    Ipv4AddressHelper ipv4;
    ipv4.SetBase("10.1.1.0", "255.255.255.0");
    Ipv4InterfaceContainer i = ipv4.Assign(d);

    NS_LOG_INFO("Create UdpServer application on node 1.");
    UdpServerHelper server(serverPort);
    ApplicationContainer serverApps = server.Install(n.Get(1));
    serverApps.Start(Seconds(1.0));
    serverApps.Stop(Seconds(10.0));

    NS_LOG_INFO("Create UdpClient application on node 0 to send to external server.");
    // Update client address to "192.168.175.128"
    Ipv4Address clientAddress("192.168.175.128");
    InetSocketAddress clientSocketAddress(clientAddress, serverPort);
    UdpClientHelper client(clientSocketAddress); // Updated to use external server's IP and port
    client.SetAttribute("MaxPackets", UintegerValue(0xFFFFFFFF));
    client.SetAttribute("Interval", TimeValue(Seconds(1.0)));
    client.SetAttribute("PacketSize", UintegerValue(1024));
    ApplicationContainer clientApps = client.Install(n.Get(0));
    clientApps.Start(Seconds(2.0));
    clientApps.Stop(Seconds(10.0));

    // Create a UDP socket on node 0 to receive external data
    TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
    Ptr<Socket> recvSocket = Socket::CreateSocket(n.Get(0), tid);
    InetSocketAddress local = InetSocketAddress(Ipv4Address::GetAny(), serverPort);
    recvSocket->Bind(local);
    recvSocket->SetRecvCallback(MakeCallback(&ReceivePacket));

    NS_LOG_INFO("Run Simulation.");
    Simulator::Run();
    Simulator::Destroy();
    NS_LOG_INFO("Done.");

    return 0;
}

我正在开发一个项目,其中 ns3 与外部应用程序通信并通过套接字接收数据,因为我正在 ns3 中使用 socketfactory 应用程序编写代码。我的代码正在成功构建并执行,没有任何错误,但我不确定通信是否正在建立或没有。如果有人以前做过此类工作,请指导我。

我正在 ns3 中使用 socketfactory 应用程序编写代码。我的代码已成功构建并执行,没有任何错误,但我不确定通信是否正在建立,我想使用套接字与两个应用程序进行通信。

c++ python-3.x sockets tcpclient ns-3
1个回答
0
投票

您可以使用

Wireshark or Net cat
进行调试和验证数据包传输。

或者这样做:-

1。验证 NS-3 中的日志: 检查日志: 确保 NS-3 中启用日志记录,以检查数据包是否正在发送和接收。

示例:

LogComponentEnable("UdpClient", LOG_LEVEL_INFO);
LogComponentEnable("UdpServer", LOG_LEVEL_INFO);

收到数据时使用 NS_LOG_UNCOND 打印数据包详细信息:

NS_LOG_UNCOND("Received " << packet->GetSize() << " bytes from " << from);

2。用于流量捕获的 Wireshark: 安装Wireshark:使用Wireshark监控网络流量。 捕获网络流量: 开始在相关网络接口(例如环回或以太网)上捕获。 设置过滤器以重点关注 NS-3 节点和外部应用程序之间的流量。

Example filter for IP:
ip.addr == 192.168.175.128

Example filter for UDP port:
udp.port == 7777

3.在 NS-3 中绑定 UDP 套接字: 使用 Bind 和 SetRecvCallback:确保您已绑定 UDP 套接字并设置回调来处理传入数据。

recvSocket->Bind(local);
recvSocket->SetRecvCallback(MakeCallback(&ReceivePacket));

4。分析 Wireshark 数据: 数据包分析:检查Wireshark看是否有数据包发送和接收: 验证源和目标 IP 地址。 确保端口号正确。 检查数据包大小和内容。

结论: 通过在 NS-3 中启用日志记录并使用 Wireshark 捕获和分析网络流量,您可以确认 NS-3 节点与外部应用程序之间的通信是否正确建立。

© www.soinside.com 2019 - 2024. All rights reserved.