INET框架自定义CbdProto网络层协议出现Unknown protocol报错如何解决
错误根因
该报错由节点的MessageDispatcher(消息调度器)无法识别自定义的CbdProto协议导致,调度器找不到协议对应的接收模块,因此抛出未知协议异常。
解决步骤
- 修正协议注册逻辑,不要自定义
ProtocolNew类
INET的协议识别依赖全局共享的Protocol类注册表,单独定义的ProtocolNew子类实例不会被内置调度器识别,需要直接基于INET原生Protocol类注册自定义协议:
ProtocolNew.h代码修改为:
namespace inet { extern const Protocol CbdProto; }
ProtocolNew.cc代码修改为:
namespace inet { Register_Protocol(CbdProto, "CbdProto", Protocol::NetworkLayer); }
使用INET内置的Register_Protocol宏注册,才能将协议加入全局注册表,被MessageDispatcher正常识别。
- 绑定传输层到自定义协议
当前使用的UDP模块默认向IP协议发包,需要修改配置告知UDP使用CbdProto作为下层网络协议,在ini配置中添加如下配置项:
**.udp.networkProtocol = "CbdProto"
- 补充SimpleNetworkLayer协议映射
确保SimpleNetworkLayer配置了正确的协议对应关系,在ini配置中补充如下配置项:
**.generic.networkProtocol = "CbdProto"
- 校验协议注册参数
现有initialize方法的注册阶段(INITSTAGE_NETWORK_LAYER)符合要求,需要确保registerProtocol方法传入的协议实例为全局注册表中注册的Protocol::CbdProto,而非自定义的ProtocolNew实例,否则调度器会匹配失败。
内容的提问来源于stack exchange,提问作者Gérard KPONHINTO
相关产品推荐
相关产品推荐

