OMNeT++ SDN场景配置多控制器仿真运行崩溃问题求助
错误原因分析
你遇到的退出码-1073741819是Windows平台下典型的空指针访问错误(STATUS_ACCESS_VIOLATION),问题全部出在你修改后的My_OFA_switch::connect代码中:
connectAddr和ctl变量未初始化,如果某台交换机的connectAddress参数既不是controller1也不是controller2,两个判断分支都不命中,后续调用地址解析时访问野指针直接崩溃- 你直接对
getSubmodule的返回值调用getFullPath(),如果对应名称的控制器模块不存在,getSubmodule返回空指针,直接调用成员函数会触发崩溃 - 没有加地址解析成功的校验逻辑,解析失败时连接空地址也会触发崩溃
修复后的connect函数代码
void My_OFA_switch::connect() { socket.renewSocket(); int connectPort = par("connectPort"); const char *connectAddress = par("connectAddress"); EV << "connectAddress = " << connectAddress << " connectPort =" << connectPort << endl; const char *connectAddr = connectAddress; // 用参数值做兜底默认值 cModule *ctl = nullptr; // 显式初始化为空指针 if (strcmp(connectAddress, "controller1") == 0) { ctl = getSystemModule()->getSubmodule("controller1"); } else if (strcmp(connectAddress, "controller2") == 0) { ctl = getSystemModule()->getSubmodule("controller2"); } if(ctl != nullptr) { connectAddr = ctl->getFullPath().c_str(); EV << "ctl->getFullPath() = " << connectAddr << endl; } L3Address ctlIPAddr; bool resolveRes = L3AddressResolver().tryResolve(connectAddr, ctlIPAddr); EV << "connect L3Address resolve result = " << resolveRes << " addr = " << ctlIPAddr << endl; // 增加解析成功判断,避免连接无效地址 if (resolveRes && !ctlIPAddr.isUnspecified()) { socket.connect(ctlIPAddr, connectPort); } else { throw cRuntimeError("Failed to resolve controller address: %s", connectAddr); } }
同时需要在ini配置中为每台交换机指定对应的控制器:
*.switch[0].connectAddress = "controller1" *.switch[1].connectAddress = "controller2" *.switch[*].connectPort = 6633
额外确认你的NED网络定义中,根网络下确实存在命名为controller1和controller2的两个控制器子模块。
Switch.cc代码是否需要修改
不需要修改。这段代码是控制器行为模块获取同控制器单元下ofa_controller实例的逻辑,只要你两个控制器的NED定义中都包含ofa_controller子模块、且都绑定了Switch行为类,该代码可以正常运行。
内容的提问来源于stack exchange,提问作者Amthal
相关产品推荐
相关产品推荐

