#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 应用程序编写代码。我的代码已成功构建并执行,没有任何错误,但我不确定通信是否正在建立,我想使用套接字与两个应用程序进行通信。
您可以使用
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 节点与外部应用程序之间的通信是否正确建立。