Как правильно отправить пользовательское сообщение на сервер после какого-либо события в OMNET ++ - PullRequest
0 голосов
/ 04 апреля 2019

У меня проблема с сообщением, которое я отправляю из своей пользовательской службы приложений клиента TCP на сервер (также со своей собственной службой уровня приложений) в моделировании OMNET ++.

Моя служба TCPCustomClientApp создается из службы TCPBasicCientApp из инфраструктуры INET. Я переопределил некоторые методы, такие как 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 = УСТАНОВЛЕН.

Чего мне не хватает? Это отправка не так?

1 Ответ

0 голосов
/ 05 апреля 2019

Поле kind является свободно используемым полем в сообщениях, которое может использоваться для чего угодно, но вы должны знать, что нет абсолютно никакой гарантии, что вы получите то же значение для поля kind на принимающей стороне.,Это считается метаданными, которые связаны с реальным объектом сообщения.Вниз на различных более низких уровнях OSI пакет может быть агрегирован или фрагментирован, поэтому идентификация объекта сообщения не сохраняется.

Короче говоря, обмен данными в поле kind безопасен только в том случае, если он используется для связи между двумя модулями, которые подключены напрямую.Если между ними что-то есть, вы не можете быть уверены, пересылается ли сообщение или воссоздается с тем же содержимым, или что некоторые модули на пути между ними решают использовать поле kind для чего-то другого.

Все, что вы хотите передать на другой конец, должно быть инкапсулировано внутри сообщения.

...