如何在OMNET ++中的某些事件后正确地向服务器发送自定义消息

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

我的消息有问题,我在OMNET ++模拟中从我的自定义TCP客户端应用服务发送到服务器(也使用我的自定义应用层服务)。

我的TCPCustomClientApp服务是从INET框架的TCPBasicCientApp服务创建的。我覆盖了一些方法,如initialize,handleMessage,socketEstablished,我为我的需求添加了一些帮助方法。

我有自定义消息,现在,在从网络触发一些后,我想将此消息发送到封装到GenericAppMsg的服务器。

这是我的代码:

...
if (trigger){
    connect(); // connect to the server - 3way TCP handshake

    auto customMsg = new MyCustomMessage();
    customMsg->set ...
    msgBuffer.push_back(customMsg); // list with messages
}

然后在方法socketEstablished(int connId, void *ptr)我有这个代码发送:

    auto msg = new GenericAppMsg();
    msg->setByteLength(requestLength);
    msg->setExpectedReplyLength(replyLength);
    msg->setServerClose(false);
    msg->setKind(1); // set message kind to 1 = TCP_I_DATA (definned in enum TcpStatusInd in TCPCommand.msg)
    msg->encapsulate(msgBuffer.front()); // encapsulate my custom message into GenericAppMsg
    sendPacket(msg);

问题是,当这个消息到达服务器类时是3 = ESTABLISHED。

我错过了什么?这发错了吗?

tcp omnet++ sendmessage inet
1个回答
0
投票

kind字段是可用于任何内容的消息中可自由使用的字段,但您应该知道,绝对不能保证您将在接收端获得相同的kind字段值。这被视为绑定到实际消息对象的元数据。在各种较低OSI层中向下,可以聚合或分段分组,从而不保留消息对象的标识。

简而言之,仅当kind字段中的数据用于直接连接的两个模块之间的通信时,才能安全地交换数据。如果它们之间存在任何内容,则无法确定是转发消息,还是使用相同内容重新创建消息,或者它们之间的路径上的某些模块决定将kind字段用于其他内容。

您想要传递到另一端的任何内容都必须封装在消息中。

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