⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 networkmessage_rw.cc

📁 分布式仿真 开放源码
💻 CC
📖 第 1 页 / 共 2 页
字号:
// ----------------------------------------------------------------------------// CERTI - HLA RunTime Infrastructure// Copyright (C) 2002, 2003  ONERA//// This file is part of CERTI-libCERTI//// CERTI-libCERTI is free software ; you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public License// as published by the Free Software Foundation ; either version 2 of// the License, or (at your option) any later version.//// CERTI-libCERTI is distributed in the hope that it will be useful, but// WITHOUT ANY WARRANTY ; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU// Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser General Public// License along with this program ; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307// USA//// $Id: NetworkMessage_RW.cc,v 3.15 2004/01/09 16:13:49 breholee Exp $// ----------------------------------------------------------------------------#include <config.h>#include "NetworkMessage.hh"#include "PrettyDebug.hh"using std::vector ;namespace certi {static pdCDebug D("MESSAGER", "(messageR) - ");// You can comment this out if you don't want to optimize network messages.#define USE_HEADER_AND_BODY// ----------// -- Read --// ----------voidNetworkMessage::read(Socket *socket)    throw (NetworkError,           NetworkSignal){#ifdef USE_HEADER_AND_BODY    // 1- Read Header    bool result = readHeader(socket);    // 2- if ReadHeader returned RTI_TRUE, Read Body.    if (result)        readBody(socket);#else    Socket->receive(this, sizeof(NetworkMessage));#endif}// --------------// -- ReadBody --// --------------voidNetworkMessage::readBody(Socket *socket){    MessageBody Body ;    unsigned short i ;    if (Header.bodySize == 0)        throw RTIinternalError("ReadBody should not have been called.");    // 1. Read Body from socket.    socket->receive((void *) Body.getBuffer(), Header.bodySize);    // 3. Read informations from Message Body according to message type.    if ((Header.type == UPDATE_ATTRIBUTE_VALUES)        || (Header.type == REFLECT_ATTRIBUTE_VALUES)) {        object = Body.readLongInt();        readLabel(&Body);        Body.readBlock((char *) handleArray,                       handleArraySize * sizeof(AttributeHandle));        for (i = 0 ; i < handleArraySize ; i ++) {            Body.readString(ValueArray[i], MAX_BYTES_PER_VALUE);        }    }    else        switch(Header.type) {            // -- O_I Variable Part With Date(Body Not Empty) --          case SEND_INTERACTION:          case RECEIVE_INTERACTION:            readLabel(&Body);            Body.readBlock((char *) handleArray,                           handleArraySize * sizeof(AttributeHandle));            for (i = 0 ; i < handleArraySize ; i ++) {                Body.readString(ValueArray[i], MAX_BYTES_PER_VALUE);            }            break ;          case CREATE_FEDERATION_EXECUTION:          case DESTROY_FEDERATION_EXECUTION:            readFederationName(&Body);            break ;          case REGISTER_FEDERATION_SYNCHRONIZATION_POINT:          case ANNOUNCE_SYNCHRONIZATION_POINT:            readLabel(&Body);            readTag(&Body);            break ;          case SYNCHRONIZATION_POINT_ACHIEVED:          case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:          case FEDERATION_SYNCHRONIZED:          case REQUEST_FEDERATION_SAVE:          case INITIATE_FEDERATE_SAVE:          case REQUEST_FEDERATION_RESTORE:          case REQUEST_FEDERATION_RESTORE_SUCCEEDED:          case INITIATE_FEDERATE_RESTORE:            readLabel(&Body);            break ;          case REQUEST_FEDERATION_RESTORE_FAILED:            readLabel(&Body);            readTag(&Body);            break ;          case DELETE_OBJECT:          case REMOVE_OBJECT:            object = Body.readLongInt();            readLabel(&Body);            break ;            // -- No Variable Part --          case IS_ATTRIBUTE_OWNED_BY_FEDERATE:          case INFORM_ATTRIBUTE_OWNERSHIP:          case ATTRIBUTE_IS_NOT_OWNED:          case QUERY_ATTRIBUTE_OWNERSHIP:            object = Body.readLongInt();            handleArray[0] = Body.readShortInt();            readLabel(&Body);            break ;          case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:          case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:          case ATTRIBUTE_OWNERSHIP_ACQUISITION:          case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:            object = Body.readLongInt();            handleArraySize = Body.readShortInt();            for (i = 0 ; i < handleArraySize ; i ++)                handleArray[i] = Body.readShortInt();            readLabel(&Body);            break ;          case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE:          case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:          case ATTRIBUTE_OWNERSHIP_UNAVAILABLE:          case UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE:          case ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION:          case CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:          case ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE:          case CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION:          case CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION:            object = Body.readLongInt();            handleArraySize = Body.readShortInt();            for (i = 0 ; i < handleArraySize ; i ++)                handleArray[i] = Body.readShortInt();            break ;          case DDM_CREATE_REGION:            space = Body.readLongInt();            nbExtents = Body.readLongInt();            region = Body.readLongInt();            break ;            // -- Join Variable Part --          case JOIN_FEDERATION_EXECUTION:            readFederationName(&Body);            readFederateName(&Body);            break ;            // -- O_I Variable Part(Body not empty) --          case PUBLISH_OBJECT_CLASS:          case SUBSCRIBE_OBJECT_CLASS:            for (i = 0 ; i < handleArraySize ; i ++)                handleArray[i] = Body.readShortInt();            break ;          case REGISTER_OBJECT:          case DISCOVER_OBJECT:            object = Body.readLongInt();            readLabel(&Body);            break ;	  case DDM_MODIFY_REGION:	    readExtents(Body);	    break ;	  case DDM_ASSOCIATE_REGION:	    object = Body.readLongInt();	    region = Body.readLongInt();	    boolean = Boolean(Body.readShortInt());	    handleArraySize = Body.readShortInt();	    break ;	  case DDM_SUBSCRIBE_ATTRIBUTES:	    objectClass = Body.readLongInt();	    region = Body.readLongInt();	    boolean = Boolean(Body.readShortInt());	    handleArraySize = Body.readShortInt();	    for (i = 0 ; i < handleArraySize ; i ++)                handleArray[i] = Body.readShortInt();	    break ;	  case DDM_UNASSOCIATE_REGION:	    object = Body.readLongInt();	    region = Body.readLongInt();	    break ;	  case DDM_UNSUBSCRIBE_ATTRIBUTES:	    	    object = Body.readLongInt();	    region = Body.readLongInt();	    break ;	  case DDM_SUBSCRIBE_INTERACTION:	  case DDM_UNSUBSCRIBE_INTERACTION:	    interactionClass = Body.readLongInt();	    region = Body.readLongInt();	    boolean = Boolean(Body.readShortInt());	    break ;	                // -- Default Handler --          default:            D.Out(pdExcept, "Unknown type %d in ReadBody.", Header.type);            throw RTIinternalError("Unknown/Unimplemented type for Body.");        }}// ----------------// -- ReadHeader --// ----------------boolNetworkMessage::readHeader(Socket *socket){    // 1- Read Header from Socket    socket->receive((void *) &Header, sizeof(HeaderStruct));    // 2- Parse Header(Static Part)    type = Header.type ;    exception = Header.exception ;    federate = Header.federate ;    federation = Header.federation ;    // 2- Parse Header according to its type(Variable Part)    // NULL, UAV and SendInteraction are the most common ones.    if (type == MESSAGE_NULL)        date = Header.VP.time.date ;    else if ((type == UPDATE_ATTRIBUTE_VALUES)             || (type == REFLECT_ATTRIBUTE_VALUES)) {        objectClass = Header.VP.O_I.handle ;        handleArraySize = Header.VP.O_I.size ;        date = Header.VP.O_I.date ;    }    else        switch (Header.type) {          case SEND_INTERACTION:          case RECEIVE_INTERACTION:            interactionClass = Header.VP.O_I.handle ;            handleArraySize = Header.VP.O_I.size ;            date = Header.VP.O_I.date ;            break ;          case REQUEST_FEDERATION_SAVE:            date = Header.VP.O_I.date ;            break ;          case INITIATE_FEDERATE_SAVE:          case REQUEST_FEDERATION_RESTORE:          case INITIATE_FEDERATE_RESTORE:          case REQUEST_FEDERATION_RESTORE_SUCCEEDED:          case REQUEST_FEDERATION_RESTORE_FAILED:            break ;            // -- No Variable Part --          case CREATE_FEDERATION_EXECUTION:          case DESTROY_FEDERATION_EXECUTION:          case REGISTER_FEDERATION_SYNCHRONIZATION_POINT:          case SYNCHRONIZATION_POINT_ACHIEVED:          case SYNCHRONIZATION_POINT_REGISTRATION_SUCCEEDED:          case FEDERATION_SYNCHRONIZED:          case ANNOUNCE_SYNCHRONIZATION_POINT:          case DELETE_OBJECT:          case REMOVE_OBJECT:          case CLOSE_CONNEXION:          case RESIGN_FEDERATION_EXECUTION:          case IS_ATTRIBUTE_OWNED_BY_FEDERATE:          case INFORM_ATTRIBUTE_OWNERSHIP:          case ATTRIBUTE_IS_NOT_OWNED:          case QUERY_ATTRIBUTE_OWNERSHIP:          case ATTRIBUTE_OWNERSHIP_ACQUISITION_IF_AVAILABLE:          case ATTRIBUTE_OWNERSHIP_ACQUISITION_NOTIFICATION:          case ATTRIBUTE_OWNERSHIP_UNAVAILABLE:          case NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:          case REQUEST_ATTRIBUTE_OWNERSHIP_ASSUMPTION:          case UNCONDITIONAL_ATTRIBUTE_OWNERSHIP_DIVESTITURE:          case ATTRIBUTE_OWNERSHIP_ACQUISITION:          case REQUEST_ATTRIBUTE_OWNERSHIP_RELEASE:          case ATTRIBUTE_OWNERSHIP_DIVESTITURE_NOTIFICATION:          case CANCEL_NEGOTIATED_ATTRIBUTE_OWNERSHIP_DIVESTITURE:          case ATTRIBUTE_OWNERSHIP_RELEASE_RESPONSE:          case CANCEL_ATTRIBUTE_OWNERSHIP_ACQUISITION:          case CONFIRM_ATTRIBUTE_OWNERSHIP_ACQUISITION_CANCELLATION:          case DDM_CREATE_REGION:          case FEDERATE_RESTORE_COMPLETE:          case FEDERATE_RESTORE_NOT_COMPLETE:          case FEDERATION_RESTORE_BEGUN:          case FEDERATION_RESTORED:          case FEDERATION_NOT_RESTORED:	  case DDM_ASSOCIATE_REGION:	  case DDM_UNASSOCIATE_REGION:	  case DDM_SUBSCRIBE_ATTRIBUTES:	  case DDM_UNSUBSCRIBE_ATTRIBUTES:	  case DDM_SUBSCRIBE_INTERACTION:	  case DDM_UNSUBSCRIBE_INTERACTION:            break ;            // -- time Variable Part(No Body)[Continued]--          case SET_TIME_REGULATING:            date = Header.VP.time.date ;            regulator = Header.VP.time.R_or_C ;            break ;          case SET_TIME_CONSTRAINED:            date = Header.VP.time.date ;            constrained = Header.VP.time.R_or_C ;            break ;            // -- T_O Variable Part --          case CHANGE_ATTRIBUTE_TRANSPORT_TYPE:          case CHANGE_ATTRIBUTE_ORDER_TYPE:          case CHANGE_INTERACTION_TRANSPORT_TYPE:          case CHANGE_INTERACTION_ORDER_TYPE:            throw RTIinternalError("Read Message not implemented for T/O.");            break ;            // -- Join Variable Part(No Body) --          case JOIN_FEDERATION_EXECUTION:            numberOfRegulators = Header.VP.Join.NbReg ;            multicastAddress = Header.VP.Join.AdrMC ;            bestEffortAddress = Header.VP.Join.Addr ;            bestEffortPeer = Header.VP.Join.peer ;            break ;            // -- O_I Variable Part(No Body) --          case UNPUBLISH_OBJECT_CLASS:          case UNSUBSCRIBE_OBJECT_CLASS:            objectClass = Header.VP.O_I.handle ;            break ;          case PUBLISH_INTERACTION_CLASS:          case UNPUBLISH_INTERACTION_CLASS:          case SUBSCRIBE_INTERACTION_CLASS:          case UNSUBSCRIBE_INTERACTION_CLASS:          case TURN_INTERACTIONS_ON:          case TURN_INTERACTIONS_OFF:            interactionClass = Header.VP.O_I.handle ;            break ;            // DDM variable part          case DDM_DELETE_REGION:            region = Header.VP.ddm.region ;            break ;            // -- O_I Variable Part(Body not empty) --          case PUBLISH_OBJECT_CLASS:          case SUBSCRIBE_OBJECT_CLASS:            objectClass = Header.VP.O_I.handle ;            handleArraySize = Header.VP.O_I.size ;            break ;          case REGISTER_OBJECT:          case DISCOVER_OBJECT:            objectClass = Header.VP.O_I.handle ;	    break ;	  case DDM_MODIFY_REGION:	    region = Header.VP.ddm.region ;	    break ;            // -- Default Handler --          default:            D.Out(pdExcept, "Unknown type %d in ReadHeader.", Header.type);            throw RTIinternalError("Received unknown Header type.");        }    // 4- If Header.bodySize is not 0, return RTI_TRUE, else RTI_FALSE    return Header.bodySize ;}// ---------------// -- ReadLabel --// ---------------voidNetworkMessage::readLabel(MessageBody *Body){    Body->readString(label, MAX_USER_TAG_LENGTH);}// ----------------------------------------------------------------------------//! Read the tag contained into the message.void NetworkMessage::readTag(MessageBody *Body){    Body->readString(tag, MAX_USER_TAG_LENGTH);}// ----------------------------------------------------------------------------//! Read the federation name.voidNetworkMessage::readFederationName(MessageBody *Body){    Body->readString(federationName, MAX_FEDERATION_NAME_LENGTH);}// -------------------// -- ReadNomFedere --// -------------------void

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -