OMNeT++ ALOHA sample代码阅读

本文介绍了OMNeT++中ALOHA协议的Server模块代码,包括Server.ned、Server.h和Server.cc文件的详细解析。讲解了.cMessage在模拟中的作用,以及handleMessage函数如何处理消息,特别是数据包到达时间和冲突检测的逻辑。同时,提到了sendDirect函数在直接发送消息中的应用。

写在最前

前一篇博客谢了关于ALOHA的一些原理,现在看OMNeT++这个网络仿真软件的sample是如何实现ALOHA网络的。

代码

Server.ned

simple Server
{
    parameters:
        @display("i=device/antennatower_l");
        @signal[receiveBegin](type="long");  // increases with each new frame arriving to the server and drops to 0 if the channel becomes finally idle
        @signal[receive](type="long");  // for successful receptions (non-collisions): 1 at the start of the reception, 0 at the end of the reception
        @signal[collision](type="long"); // the number of collided frames at the beginning of the collision period
        @signal[collisionLength](type="simtime_t");  // the length of the last collision period at the end of the collision period
        @signal[channelState](type="long");

        //source 
        @statistic[serverChannelState](source="channelState";title="Channel state";enum="IDLE=0,TRANSMISSION=1,COLLISION=2";record=vector);
        @statistic[receiveBegin](source="receiveBegin"; record=vector?; interpolationmode=sample-hold; title="receive begin");
        @statistic[channelUtilization](source="timeavg(receive)"; record=last; interpolationmode=linear; title="channel utilization");
        @statistic[collisionMultiplicity](source=collision; record=vector?,histogram; title="collision multiplicity");
        @statistic[collisionLength](record=vector?,histogram,mean,sum,max; title="collision length");
        @statistic[receivedFrames](source="sum(receive)"; record=last; title="received frames");
        @statistic[collidedFrames](source="sum(collision)"; record=last; title="collided frames");
    gates:
        input in @directIn;
}

.ned文件一般是用于OMNeT中模块与仿真内核的配置,里面一般包含该模块的parameter,gates,connections等等。其中这里Server.ned文件中,开头定义了一些signal,主要是配合后面的statistic来使用,用于统计仿真过程中需要的统计指标(如时延,信道利用率等)。还定义了一个输入用的gate。


Server.h

//
### 关于NULL的理解 #### NULL 的本质 `NULL` 是 C 和 C++ 中的一个宏定义,其核心意义是用来表示空指针。它的值被定义为 `0` 或 `(void*)0`,但这并不意味着它是一个普通的整数零[^1]。实际上,`NULL` 表示的是一个特殊的内存地址——即 **0 地址**。 在计算机体系结构中,通常会将 0 地址保留作为非法访问的标志位。因此,如果程序尝试通过 `NULL` 指针访问数据,则会产生运行时错误(例如段错误)。这种设计有助于开发者快速定位潜在的逻辑问题。 以下是 GCC 下对于 `NULL` 宏的具体实现方式: ```c #undef NULL #if defined(__cplusplus) #define NULL 0 #else #define NULL ((void *)0) #endif ``` 上述代码片段展示了如何根据不同编程环境调整 `NULL` 的定义形式,在 C++ 中直接将其设为数值型常量 `0`;而在纯 C 环境里则采用显式的强制转换 `(void*)0` 来强调它是针对指针类型的特殊处理[^2]。 #### Available 和 Utilization 的概念解释 虽然提问涉及到了 `NULL` 的讨论,但同时也提到了两个术语:“available”以及“utilization”。这两个词一般用于资源管理领域或者性能评估场景: - **Available**: 可用性描述了一种状态或条件的存在与否。比如在一个系统中有多少比例的时间某个服务处于正常工作状态下可以接受请求。 - **Utilization**: 利用率指的是某一特定时间段内某项资产实际使用的程度相对于最大可能容量而言所占百分比。高利用率表明该设备正在高效运转接近满负荷运作;低利用率可能是由于需求不足或者是存在瓶颈造成的浪费现象。 需要注意的是,“available”和“utilization”的具体含义可能会依据上下文有所变化,特别是在不同的技术文档或报告(`report`)当中它们的应用范围非常广泛。 ### 示例代码展示NULL的实际应用 下面给出一段简单的例子演示了如何安全地使用 `NULL` 进行判断操作以防止意外崩溃情况发生: ```c #include <stdio.h> #include <stdlib.h> int main() { int* ptr = NULL; if (ptr != NULL) { // 正确做法: 显式比较是否等于NULL printf("Pointer is valid.\n"); free(ptr); } else { printf("Pointer is not initialized or has been freed.\n"); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值