我的消息有问题,我在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。
我错过了什么?这发错了吗?
kind
字段是可用于任何内容的消息中可自由使用的字段,但您应该知道,绝对不能保证您将在接收端获得相同的kind
字段值。这被视为绑定到实际消息对象的元数据。在各种较低OSI层中向下,可以聚合或分段分组,从而不保留消息对象的标识。
简而言之,仅当kind
字段中的数据用于直接连接的两个模块之间的通信时,才能安全地交换数据。如果它们之间存在任何内容,则无法确定是转发消息,还是使用相同内容重新创建消息,或者它们之间的路径上的某些模块决定将kind
字段用于其他内容。
您想要传递到另一端的任何内容都必须封装在消息中。