From: <sv...@ww...> - 2004-05-16 03:05:45
|
Author: wolverine Date: 2004-05-15 20:05:34 -0700 (Sat, 15 May 2004) New Revision: 954 Modified: trunk/CSP/CSPSim/CHANGES.current trunk/CSP/CSPSim/Include/CSPSim.h trunk/CSP/CSPSim/Include/Networking.h trunk/CSP/CSPSim/Makefile.in trunk/CSP/CSPSim/Source/CSPSim.cpp trunk/CSP/CSPSim/Source/ClientNode.cpp trunk/CSP/CSPSim/Source/DynamicObject.cpp trunk/CSP/CSPSim/Source/Makefile.in trunk/CSP/CSPSim/Source/Networking/MessageSocketDuplex.cpp trunk/CSP/CSPSim/Source/Networking/NetworkMessage.cpp trunk/CSP/CSPSim/Source/Networking/NetworkMessenger.cpp trunk/CSP/CSPSim/Source/Networking/NetworkNode.cpp trunk/CSP/CSPSim/Source/Networking/ObjectUpdateMessage.cpp trunk/CSP/CSPSim/Source/ServerNode.cpp Log: changes and cleanup to networking Modified: trunk/CSP/CSPSim/CHANGES.current =================================================================== --- trunk/CSP/CSPSim/CHANGES.current 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/CHANGES.current 2004-05-16 03:05:34 UTC (rev 954) @@ -1,6 +1,9 @@ Version 0.4.0 (in progress) =========================== +2004-05-15: wolverine + * Changes to and cleanup to networking code. + 2004-05-12: delta * Removed obsolete ComputeTransformCallback in Source/VirtualScene.cpp and replaced it by an osg::Transform (lunalog's post). Modified: trunk/CSP/CSPSim/Include/CSPSim.h =================================================================== --- trunk/CSP/CSPSim/Include/CSPSim.h 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/Include/CSPSim.h 2004-05-16 03:05:34 UTC (rev 954) @@ -97,6 +97,7 @@ VirtualScene const * getScene() const; simdata::Ref<Theater> getTheater() const; simdata::Ref<EventMapIndex> getInterfaceMaps() const; + NetworkMessenger * getNetworkMessenger(); void togglePause(); void runConsole(PyConsole *console); @@ -181,6 +182,7 @@ */ NetworkMessenger * m_NetworkMessenger; NetworkNode * m_RemoteServerNode; + NetworkNode * m_localNode; osg::ref_ptr<Producer::RenderSurface> m_RenderSurface; }; Modified: trunk/CSP/CSPSim/Include/Networking.h =================================================================== --- trunk/CSP/CSPSim/Include/Networking.h 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/Include/Networking.h 2004-05-16 03:05:34 UTC (rev 954) @@ -40,38 +40,45 @@ typedef int SockFd; typedef simdata::uint16 Port; +class NetworkNode; +const short NETWORK_PACKET_SIZE = 512; + +struct MessageHeader +{ + simdata::uint16 m_magicNumber; + simdata::uint16 m_payloadLen; + simdata::uint16 m_messageType; + simdata::uint32 m_ipaddr; + simdata::uint16 m_port; + simdata::uint16 m_id; +}; + class NetworkMessage { protected: + MessageHeader m_header; + simdata::uint8 m_payloadBuf[]; - simdata::uint8 * m_Buf; - simdata::uint8 * m_PayloadBuf; - simdata::uint16 m_BufferLen; - simdata::uint16 m_MessageType; - simdata::uint16 m_PayloadLen; - bool m_Initialized; - - static unsigned short magicNumber; + static unsigned short m_magicNumber; static unsigned short m_HeaderLen; - public: + private: NetworkMessage(); - virtual ~NetworkMessage(); - bool initialize(simdata::uint16 type, simdata::uint16 payloadLength); + public: + + bool initialize(simdata::uint16 type, simdata::uint16 payloadLength, NetworkNode * senderNode); simdata::uint16 getType(); - void * getBufferPtr(); void * getPayloadPtr(); - - simdata::uint16 getBufferLen(); simdata::uint16 getPayloadLen(); - simdata::uint16 getHeaderLen(); + Port getOriginatorPort(); + bool isInitialized(); bool isHeaderValid(); @@ -83,32 +90,34 @@ }; -class ObjectUpdateMessage : public NetworkMessage -{ +//class ObjectUpdateMessage : public NetworkMessage +//{ +// +// public: +// ObjectUpdateMessage(simdata::uint16 id, simdata::Vector3 position, simdata::Vector3 velocity); +// +// +//}; - public: - ObjectUpdateMessage(simdata::uint16 id, simdata::Vector3 position, simdata::Vector3 velocity); - - -}; - class NetworkNode { private: - uint32 m_node_id; ost::InetHostAddress m_addr; Port m_port; + uint16 m_node_id; public: NetworkNode(); NetworkNode(int node_id, ost::InetHostAddress addr, Port port); + NetworkNode(int node_id, const char * hostname, Port port); + void setAddress(ost::InetHostAddress addr); void setPort(Port port); - void setId(int node_id); + void setId(short node_id); - int getId(); + short getId(); Port getPort(); ost::InetHostAddress getAddress(); @@ -119,16 +128,6 @@ ost::UDPSocket * m_UDPReceiverSocket; ost::UDPSocket * m_UDPSenderSocket; - /* - SockFd m_receiverSockFd; - SockFd m_senderSockFd; - */ - - /* - struct sockaddr_in m_receiverSocketAddress; - NetworkAddress * m_receiverAddress; - */ - ost::InetAddress * m_receiverAddr; Port m_receiverPort; @@ -137,15 +136,10 @@ MessageSocketDuplex(ost::InetAddress & Address, Port port); // set the bound address and port. MessageSocketDuplex(Port port); // set the bound port. - /* - void bind(NetworkAddress * address, Port port); // binds the listener port. - */ + int sendto(NetworkMessage * message, ost::InetHostAddress * remoteAddress, Port * remotePort); + int sendto(NetworkMessage * message, NetworkNode * node); - int sendto(NetworkMessage & message, ost::InetHostAddress * remoteAddress, Port * remotePort); - int recvfrom(NetworkMessage & message, ost::InetHostAddress * remoteAddress=NULL, Port * remotePort=NULL); - - int sendto(NetworkMessage & message, NetworkNode * node); - int recvfrom(NetworkMessage & message, NetworkNode * node); + int recvfrom(NetworkMessage ** message); ost::InetAddress * getReciverAddress() { return m_receiverAddr; } Port getReceiverPort() { return m_receiverPort; } @@ -158,15 +152,22 @@ private: MessageSocketDuplex * m_messageSocketDuplex; std::list<NetworkMessage*> m_messageList; + NetworkNode * m_orginatorNode; public: NetworkMessenger(); - NetworkMessenger(Port port); + NetworkMessenger(NetworkNode * orginatorNode); - void queueMessage(NetworkNode * node, NetworkMessage * message); + void queueMessage(NetworkNode * remoteNode, NetworkMessage * message); void sendMessages(); void receiveMessages(); + + NetworkNode * getOrginatorNode(); + void setOrginatorNode(NetworkNode * orginatorNode); + + NetworkMessage * getMessageFromPool(int type, int payloadLen); + void returnMessageToPool(NetworkMessage * message); }; Modified: trunk/CSP/CSPSim/Makefile.in =================================================================== --- trunk/CSP/CSPSim/Makefile.in 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/Makefile.in 2004-05-16 03:05:34 UTC (rev 954) @@ -2,6 +2,7 @@ export DEMETER_RELATIVE = ../Demeter export CHUNKLOD_RELATIVE = ../CSPChunkLod +export SIMDATA_RELATIVE = ../SimData export GDEBUGF = -g -Wall export GCFLAGS = -fPIC -O2# -DSWIG_GLOBAL Modified: trunk/CSP/CSPSim/Source/CSPSim.cpp =================================================================== --- trunk/CSP/CSPSim/Source/CSPSim.cpp 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/Source/CSPSim.cpp 2004-05-16 03:05:34 UTC (rev 954) @@ -151,6 +151,8 @@ m_Shell = new PyShell(); m_NetworkMessenger = NULL; + m_RemoteServerNode = NULL; + m_localNode = NULL; } @@ -211,6 +213,10 @@ return m_Scene.get(); } +NetworkMessenger * CSPSim::getNetworkMessenger() { + return m_NetworkMessenger; +} + VirtualScene const * CSPSim::getScene() const { return m_Scene.get(); } @@ -410,7 +416,12 @@ // create the networking layer int localMessagePort = g_Config.getInt("Networking", "LocalMessagePort", 10000, true); CSP_LOG(APP, DEBUG, "init() - Creating Message listener on port: " << localMessagePort); - m_NetworkMessenger = new NetworkMessenger(localMessagePort); + std::string remoteAddr = g_Config.getString("Networking", "RemoteMessageHost", "127.0.0.1", true); + + Port remotePort = (Port)g_Config.getInt("Networking", "RemoteMessagePort", 0, true); + m_RemoteServerNode = new NetworkNode(1, remoteAddr.c_str(), remotePort ); + m_localNode = new NetworkNode(1, "localhost", localMessagePort); + m_NetworkMessenger = new NetworkMessenger(m_localNode); #if 0 // set the Main Menu then start the main loop @@ -708,6 +719,7 @@ simdata::Ref<DynamicObject> dynamicObject = (simdata::Ref<DynamicObject>)m_ActiveObject; NetworkMessage * message = dynamicObject->getUpdateMessage(); + CSP_LOG(APP, DEBUG, "CSPSim::run... queuing test network updates"); m_NetworkMessenger->queueMessage(m_RemoteServerNode, message); m_NetworkMessenger->sendMessages(); m_NetworkMessenger->receiveMessages(); Modified: trunk/CSP/CSPSim/Source/ClientNode.cpp =================================================================== --- trunk/CSP/CSPSim/Source/ClientNode.cpp 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/Source/ClientNode.cpp 2004-05-16 03:05:34 UTC (rev 954) @@ -1,10 +1,7 @@ - - - #include "Networking.h" +#include "ClientNode.h" #include <stdio.h> #include <stdlib.h> -#include "ClientNode.h" ClientNode::ClientNode() { @@ -14,28 +11,21 @@ int ClientNode::run() { printf("Network test client starting up...\n"); - Port clientPort = 20010; - Port serverPort = 20011; - MessageSocketDuplex * socketDuplex = new MessageSocketDuplex(clientPort); - NetworkMessage message; - message.initialize(1, 100); - char * payloadPtr = (char*)message.getPayloadPtr(); + Port localPort = 3150; + Port remotePort = 3160; + NetworkNode localNode(1, "localhost", localPort); + NetworkNode remoteNode(1, "localhost", remotePort); + NetworkMessenger * messenger = new NetworkMessenger(&localNode); + NetworkMessage * message = messenger->getMessageFromPool(1, 100); + char * payloadPtr = (char*)message->getPayloadPtr(); memset(payloadPtr, 0 , 100); strcpy(payloadPtr, "Hello From CSP Network Test Client!"); - ost::InetHostAddress * serverAddress = new ost::InetHostAddress("localhost"); - socketDuplex->sendto(message, serverAddress, &serverPort); + Port port = message->getOriginatorPort(); + messenger->queueMessage(&remoteNode, message); + messenger->sendMessages(); return 0; } -#ifdef CSP_STANDALONE -int main(int argc, char * argv[]) -{ - ClientNode node; - return node.run(); -} -#endif - - Modified: trunk/CSP/CSPSim/Source/DynamicObject.cpp =================================================================== --- trunk/CSP/CSPSim/Source/DynamicObject.cpp 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/Source/DynamicObject.cpp 2004-05-16 03:05:34 UTC (rev 954) @@ -394,12 +394,12 @@ NetworkMessage * DynamicObject::getUpdateMessage() { + CSP_LOG(APP, DEBUG, "DynamicObject::getUpdateMessage()"); unsigned short messageType = 2; unsigned short payloadLen = sizeof(int) + sizeof(double) + 3*sizeof(simdata::Vector3) + sizeof(simdata::Quat) /* + sizeof(simdata::Matrix3) + sizeof(double) */; - NetworkMessage * message = new NetworkMessage(); - message->initialize( messageType, payloadLen); + NetworkMessage * message = CSPSim::theSim->getNetworkMessenger()->getMessageFromPool(messageType, payloadLen); unsigned char * ptrBuf = (unsigned char*)message->getPayloadPtr(); @@ -428,6 +428,7 @@ // memcpy((void*)ptrBuf, (void*)&b_Mass->value(), sizeof(double)); // ptrBuf += bytescopied; + CSP_LOG(APP, DEBUG, "DynamicObject::getUpdateMessage() - returning message"); return message; @@ -478,6 +479,8 @@ // return message to shared pool. // NetworkMessagePool.putMessageObject(message); // delete message; +// +// CSPSim::theSim->getNetworkMessenger()->returnMessageToPool(message); } Modified: trunk/CSP/CSPSim/Source/Makefile.in =================================================================== --- trunk/CSP/CSPSim/Source/Makefile.in 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/Source/Makefile.in 2004-05-16 03:05:34 UTC (rev 954) @@ -12,6 +12,9 @@ CHUNKLOD_LIBRARY = -L$(CHUNKLOD_PREFIX)/lib -losgChunkLod_csp CHUNKLOD_INCLUDE = -I$(CHUNKLOD_PREFIX)/include +SIMDATA_PREFIX = $(TOPDIR)/$(SIMDATA_RELATIVE) +SIMDATA_LIBRARY = -L$(SIMDATA_PREFIX)/SimData -lSimData + LIBS = $(DEMETER_LIBRARY) $(CHUNKLOD_LIBRARY) -lccgnu2 INCLUDE = -I$(TOPDIR)/Include $(DEMETER_INCLUDE) $(CHUNKLOD_INCLUDE) -I@PYTHON_INCLUDE@ -I/usr/local/include/cc++2 @@ -21,17 +24,11 @@ SWCXXF = $(GCFLAGS) $(INCLUDE) @SIGC_FLAGS@ LDOPTS = -Wl,-z,lazyload $(GLDOPTS) @LIBS@ SWOPTS = $(GSWOPTS) $(INCLUDE) +EXTERN_LIBS = @LIBS@ -NETWORK_SOURCES = Networking/NetworkNode.cpp \ - Networking/NetworkMessage.cpp \ - Networking/ObjectUpdateMessage.cpp \ - Networking/NetworkMessenger.cpp \ - Networking/NetworkBroadcaster.cpp \ - Networking/NetworkListener.cpp \ - Networking/NetworkSocket.cpp \ - Networking/MessageSocketDuplex.cpp \ - Networking/NetworkAddress.cpp \ - +SHARED_LIB = libcspsim.so +STATIC_LIB = libcspsim_static.a +WRAPED_LIB = _cCSP.so SOURCES = \ Systems/AircraftFlightSensors.cpp \ @@ -117,7 +114,6 @@ VirtualScene.cpp OBJECTS = $(SOURCES:%.cpp=%.o) -NETWORK_OBJECTS = $(NETWORK_SOURCES:%.cpp=%.o) DEPDIR = .deps MKDEP = $(CXX) -M $(CFLAGS) @@ -135,10 +131,10 @@ rm -f $(SOURCES:%.cpp=%.o) rm -f lib*.a rm -f $(BIN)/_cCSP.so $(BIN)/cCSP.py cCSP_wrap.* - rm -f $(DEPDIR)/*.d clean-dependencies: - @echo $(RM) -r $(RMFLAGS) $(DEPDIR) + @echo + find $(DEPDIR) -name *.d -exec ${RM} {} \; clean-deps: clean-dependencies @@ -168,9 +164,16 @@ @echo "Computing dependencies for $<..." @$(SWDEP) $(DEPFILTER) -o $(<:.i=_wrap.cpp) $< > $@ -_cCSP.so: $(OBJECTS) cCSP_wrap.o - $(CXX) $(LDOPTS) -o$(BIN)/$@ $^ $(LIBS) +$(WRAPED_LIB) : $(OBJECTS) cCSP_wrap.o + $(CXX) $(LDOPTS) -o$@ $^ $(LIBS) + cp $(WRAPED_LIB) $(BIN)/$(WRAPED_LIB) +$(STATIC_LIB): $(OBJECTS) + rm -rf $(BIN)/$(STATIC_LIB) + $(AR) rc $(BIN)/$(STATIC_LIB) $(OBJECTS) + rm -rf $(BIN)/$(SHARED_LIB) + $(CXX) -shared $(OBJECTS) -o $(BIN)/$(SHARED_LIB) + #CSPapp: $(OBJECTS) main.o # $(CXX) -lswigpy -lpython2.2 -o$@ $^ $(LIBS) @@ -181,20 +184,15 @@ cCSP_wrap.o: cCSP_wrap.cpp $(CXX) -c $(SWCXXF) $(@:.o=.cpp) -ClientNode_StandAlone.o : ClientNode.cpp - $(CXX) -c $(CFLAGS) $(INCLUDE) -DCSP_STANDALONE -o ClientNode_StandAlone.o ClientNode.cpp - -ClientNode: $(NETWORK_OBJECTS) ClientNode_StandAlone.o - $(CXX) -L/usr/local/lib -lccgnu2 -ldl -lpthread -o$(BIN)/$@ $(NETWORK_OBJECTS) ClientNode_StandAlone.o -ServerNode_StandAlone.o : ServerNode.cpp - $(CXX) -c $(CFLAGS) $(INCLUDE) -DCSP_STANDALONE -o ServerNode_StandAlone.o ServerNode.cpp +#clientNode: ClientNodeDriver.o +# $(CXX) $(EXTERN_LIBS) $(OBJECTS) $(SIMDATA_LIBRARY) -o$@ $^ $(LIBS) -ServerNode: $(NETWORK_OBJECTS) ServerNode_StandAlone.o - $(CXX) -L/usr/local/lib -lccgnu2 -ldl -lpthread -o$(BIN)/$@ $(NETWORK_OBJECTS) ServerNode_StandAlone.o - +#serverNode: ServerNodeDriver.o +# $(CXX) $(EXTERN_LIBS) $(OBJECTS) $(SIMDATA_LIBRARY) -o$@ $^ $(LIBS) + -test: ClientNode ServerNode +test: clientNode serverNode %.o: %.cpp @@ -203,8 +201,14 @@ AeroDynamics.o: AeroDynamics.cpp $(CXX) -c $(CFLAGS) -O3 $(@:.o=.cpp) +#ClientNodeDriver.o: ClientNodeDriver.cpp +# $(CXX) -c $(CFLAGS) $(INCLUDE) -o ClientNodeDriver.o ClientNodeDriver.cpp + +#ServerNodeDriver.o: ServerNodeDriver.cpp +# $(CXX) -c $(CFLAGS) $(INCLUDE) -o ServerNodeDriver.o ServerNodeDriver.cpp + Makefile: Makefile.in cd $(TOPDIR) && ./configure -all: Makefile build-subdirs _cCSP.so test #CSPapp +all: Makefile build-subdirs $(WRAPED_LIB) #$(STATIC_LIB) test #CSPapp Modified: trunk/CSP/CSPSim/Source/Networking/MessageSocketDuplex.cpp =================================================================== --- trunk/CSP/CSPSim/Source/Networking/MessageSocketDuplex.cpp 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/Source/Networking/MessageSocketDuplex.cpp 2004-05-16 03:05:34 UTC (rev 954) @@ -39,25 +39,6 @@ m_receiverPort = port; m_UDPReceiverSocket = new ost::UDPSocket(*m_receiverAddr, port); m_UDPSenderSocket = new ost::UDPSocket(); - - /* - m_receiverSockFd = socket(AF_INET, SOCK_DGRAM, 0); - m_senderSockFd = socket(AF_INET, SOCK_DGRAM, 0); - */ - - /* - memset( (void*)&m_receiverSocketAddress, 0, sizeof (struct sockaddr_in)); - - m_receiverSocketAddress.sin_family = AF_INET; - m_receiverSocketAddress.sin_port = htons( port ); - m_receiverSocketAddress.sin_addr.s_addr = htonl(INADDR_ANY); - - ::bind(m_receiverSockFd, (struct sockaddr *)&m_receiverSocketAddress, sizeof(m_receiverSocketAddress)); - */ - - // create sender end point - - } MessageSocketDuplex::MessageSocketDuplex(ost::InetAddress & addr, Port port) @@ -69,44 +50,22 @@ } -/* -void MessageSocketDuplex::bind(NetworkAddress * address, Port port) +int MessageSocketDuplex::sendto(NetworkMessage * message, ost::InetHostAddress * remoteAddress, Port * remotePort) { - -} -*/ - -int MessageSocketDuplex::sendto(NetworkMessage & message, ost::InetHostAddress * remoteAddress, Port * remotePort) -{ // CSP_LOG(NETWORK, DEBUG, "Sending Network Packet"); m_UDPSenderSocket->setPeer(*remoteAddress, *remotePort); #ifdef _MSC_VER - return m_UDPSenderSocket->send((const char *)message.getBufferPtr(), message.getBufferLen()); + return m_UDPSenderSocket->send((const char *)message, NETWORK_PACKET_SIZE); #else - return m_UDPSenderSocket->send((const void *)message.getBufferPtr(), message.getBufferLen()); + return m_UDPSenderSocket->send((const void *)message, NETWORK_PACKET_SIZE); #endif - /* - - struct sockaddr_in servaddr; - memset((void*)&servaddr, 0, sizeof(sockaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons(*remotePort); - servaddr.sin_addr.s_addr = inet_addr(remoteAddress->getNetworkName().c_str()); - -#ifdef _MSC_VER - return ::sendto(m_senderSockFd, (const char *)message->getBufferPtr(), message->getBufferLen(), 0, (const struct sockaddr *)&servaddr, sizeof(sockaddr)); -#else - return ::sendto(m_senderSockFd, (const void *)message->getBufferPtr(), message->getBufferLen(), 0, (const struct sockaddr *)&servaddr, sizeof(sockaddr)); -#endif - - */ } -int MessageSocketDuplex::recvfrom(NetworkMessage & message, ost::InetHostAddress * remoteAddress, Port * remotePort) +int MessageSocketDuplex::recvfrom(NetworkMessage ** message) { // CSP_LOG(NETWORK, DEBUG, "Receving Network Packet"); @@ -115,13 +74,8 @@ // get addr of next packet Port port; ost::InetHostAddress addr = m_UDPReceiverSocket->getPeer(&port); - - - // TODO may need to validate addr, and port as being from a register node. - if (remotePort) - *remotePort = port; - if (remoteAddress) - *remoteAddress = addr; + printf("MessageSocketDuplex::recvfrom() - port: %d\n", port); + printf("MessageSocketDuplex::recvfrom() - hostname: %s\n", addr.getHostname()); // peek at packet to verify this is a valid CSP packet. and if so get the packet type. @@ -129,30 +83,25 @@ uint16 headerBuffer[6]; int numHeaderBytes = m_UDPReceiverSocket->peek(headerBuffer, headerlen); + // TODO validation of header + simdata::uint8 * buffer = new simdata::uint8[512]; + int maxBufLen = 512; + // get the packet - int numPacketBytes = m_UDPReceiverSocket->receive((void*)message.getBufferPtr(), - message.getBufferLen()); + int numPacketBytes = m_UDPReceiverSocket->receive((void*)buffer, maxBufLen); + *message = (NetworkMessage*)buffer; return numPacketBytes; } return 0; - - - /* - struct sockaddr_in cliaddr; - socklen_t clilen = sizeof(cliaddr); - return ::recvfrom(m_receiverSockFd, (void *)message->getBufferPtr(), message->getBufferLen(), - 0, (struct sockaddr *)&cliaddr, &clilen); - */ - } -int MessageSocketDuplex::sendto(NetworkMessage & message, NetworkNode * node) +int MessageSocketDuplex::sendto(NetworkMessage * message, NetworkNode * node) { // CSP_LOG(NETWORK, DEBUG, "Sending Network Packet"); @@ -163,13 +112,3 @@ } -int MessageSocketDuplex::recvfrom(NetworkMessage & message, NetworkNode * node) -{ -// CSP_LOG(NETWORK, DEBUG, "Receiving Network Packet"); - ost::InetHostAddress address = node->getAddress(); - Port port = node->getPort(); - return recvfrom(message, &address, &port); -// return 0; -} - - Modified: trunk/CSP/CSPSim/Source/Networking/NetworkMessage.cpp =================================================================== --- trunk/CSP/CSPSim/Source/Networking/NetworkMessage.cpp 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/Source/Networking/NetworkMessage.cpp 2004-05-16 03:05:34 UTC (rev 954) @@ -27,8 +27,8 @@ #include "Networking.h" -unsigned short NetworkMessage::magicNumber = 0xFCCF; -unsigned short NetworkMessage::m_HeaderLen = 6; +unsigned short NetworkMessage::m_magicNumber = 0xFCCF; +unsigned short NetworkMessage::m_HeaderLen = 14; /** * NetworkMessage() @@ -40,62 +40,31 @@ * bytes within it to the proper values. Note also once a message object has * been initialized it should be free to be used multiple times. */ -NetworkMessage::NetworkMessage() -{ - m_Buf = NULL; - m_PayloadBuf = NULL; - m_BufferLen = 0; - m_PayloadLen = 0; - m_MessageType = 0; - m_Initialized = false; - -} - /** - * ~NetworkMessage - * - * Deletes a network message including removing the memory allocated for the buffer. - */ -NetworkMessage::~NetworkMessage() -{ - if (m_Initialized) - delete [] m_Buf; -} - -/** * initialize() * * This method initializes a NetworkMessage, Including allocating a buffer to * hold the message header and payload and also setting up the header. */ -bool NetworkMessage::initialize( unsigned short type, unsigned short payloadLen) +bool NetworkMessage::initialize( simdata::uint16 type, simdata::uint16 payloadLen, NetworkNode * orginatorNode ) { // return false if this has already been initialized. - if (m_Initialized) + // the magic number also serves to determine if initialized. + if (m_header.m_magicNumber == NetworkMessage::m_magicNumber) return false; - - m_PayloadLen = payloadLen; - m_MessageType = type; + + m_header.m_magicNumber = NetworkMessage::m_magicNumber; + m_header.m_payloadLen = payloadLen; + m_header.m_messageType = type; + m_header.m_ipaddr = orginatorNode->getAddress().getAddress().s_addr; + m_header.m_port = orginatorNode->getPort(); + m_header.m_id = orginatorNode->getId(); - m_BufferLen = m_HeaderLen + m_PayloadLen; - - m_Buf = new unsigned char[m_BufferLen]; - m_PayloadBuf = m_Buf + m_HeaderLen; - // write the header; - unsigned char * ptrBuf = m_Buf; - memcpy((void*)ptrBuf , (void*)&magicNumber, sizeof(unsigned short)); - ptrBuf += sizeof(unsigned short); - memcpy((void*)ptrBuf , (void*)&m_BufferLen, sizeof(unsigned short)); - ptrBuf += sizeof(unsigned short); - memcpy((void*)ptrBuf , (void*)&m_MessageType , sizeof(unsigned short) ); - ptrBuf += sizeof(unsigned short); - // write zeros to the payload section of the buffer. - memset(m_PayloadBuf, 0x00, m_PayloadLen); - - m_Initialized = true; + memset(m_payloadBuf, 0x00, m_header.m_payloadLen); + return true; } @@ -106,9 +75,9 @@ * Returns the number of bytes as a short that the message * buffer uses including the header and payload. */ -unsigned short NetworkMessage::getBufferLen() +unsigned short NetworkMessage::getPayloadLen() { - return m_BufferLen; + return m_header.m_payloadLen; } /** @@ -117,10 +86,10 @@ * Returns the buffer pointer so functions can copy binary * data into the underlying buffer. */ -void * NetworkMessage::getBufferPtr() -{ - return m_Buf; -} +//void * NetworkMessage::getBufferPtr() +//{ +// return m_Buf; +//} /** * getPayloadPtr() @@ -129,7 +98,7 @@ */ void * NetworkMessage::getPayloadPtr() { - return (void*)m_PayloadBuf; + return (void*)m_payloadBuf; } /** @@ -138,10 +107,7 @@ */ unsigned short NetworkMessage::getType() { - unsigned int type; - memcpy((void*)&type , (void*)(m_Buf + 2), sizeof(unsigned short)); - return type; - + return m_header.m_messageType; } /** @@ -150,12 +116,12 @@ */ bool NetworkMessage::isHeaderValid() { - unsigned short magicNumber = 0xFCCF; - unsigned short number; +// unsigned short magicNumber = 0xFCCF; +// unsigned short number; +// +// memcpy((void*)&number , (void*)&m_Buf, sizeof(unsigned short)); - memcpy((void*)&number , (void*)&m_Buf, sizeof(unsigned short)); - - return (number == magicNumber); + return (m_header.m_magicNumber == NetworkMessage::m_magicNumber); } @@ -163,16 +129,14 @@ * getHeaderLen() * returns the number of bytes as a short that the header occupies. */ -unsigned short NetworkMessage::getHeaderLen() -{ - return m_HeaderLen; -} +//unsigned short NetworkMessage::getHeaderLen() +//{ +// return m_HeaderLen; +//} -/** - * getPayloadLen() - * returns the number of bytes as a short that the payload occupies. - */ -unsigned short NetworkMessage::getPayloadLen() + +Port NetworkMessage::getOriginatorPort() { - return m_PayloadLen; + return m_header.m_port; } + Modified: trunk/CSP/CSPSim/Source/Networking/NetworkMessenger.cpp =================================================================== --- trunk/CSP/CSPSim/Source/Networking/NetworkMessenger.cpp 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/Source/Networking/NetworkMessenger.cpp 2004-05-16 03:05:34 UTC (rev 954) @@ -22,29 +22,73 @@ * @author Scott Flicker (Wolverine) */ +#include <SimData/LogStream.h> +#include "Log.h" #include "Networking.h" +NetworkNode * g_node; + NetworkMessenger::NetworkMessenger() { m_messageSocketDuplex = new MessageSocketDuplex(); + m_orginatorNode = new NetworkNode(); } -NetworkMessenger::NetworkMessenger(Port port) +NetworkMessenger::NetworkMessenger(NetworkNode * orginatorNode) { - m_messageSocketDuplex = new MessageSocketDuplex(port); + m_messageSocketDuplex = new MessageSocketDuplex(orginatorNode->getPort()); + m_orginatorNode = orginatorNode; } void NetworkMessenger::queueMessage(NetworkNode * node, NetworkMessage * message) { + CSP_LOG(APP, DEBUG, "NetworkMessenger::queueMessage()"); m_messageList.push_back(message); + g_node = node; } void NetworkMessenger::sendMessages() { - + CSP_LOG(APP, DEBUG, "NetworkMessenger::sendMessages()"); + std::list<NetworkMessage*>::iterator i = m_messageList.begin(); + std::list<NetworkMessage*>::const_iterator end = m_messageList.end(); + for ( ; i != end ; ++i ) + { + m_messageSocketDuplex->sendto((*i), g_node); + } + } void NetworkMessenger::receiveMessages() { + CSP_LOG(APP, DEBUG, "NetworkMessenger::ReceiveMessage()"); } + +NetworkNode * NetworkMessenger::getOrginatorNode() +{ + return m_orginatorNode; +} + +void NetworkMessenger::setOrginatorNode(NetworkNode * orginatorNode) +{ + m_orginatorNode = orginatorNode; +} + +// don't create NetworkMessage Objects directly. Instead create a fixed length binary +// buffer then cast it to a NetworkMessage pointer. +NetworkMessage * NetworkMessenger::getMessageFromPool(int messageType, int payloadLen) +{ + simdata::uint8 * buffer = new simdata::uint8[NETWORK_PACKET_SIZE]; + NetworkMessage * message = (NetworkMessage*)buffer; + message->initialize( messageType, payloadLen, m_orginatorNode); + return message; +} + +// cast the NetworkMessage pointer back to a binary buffer then free the buffer. +void NetworkMessenger::returnMessageToPool(NetworkMessage * message) +{ + simdata::uint8 * buffer = (simdata::uint8 *)message; + delete buffer; +} + Modified: trunk/CSP/CSPSim/Source/Networking/NetworkNode.cpp =================================================================== --- trunk/CSP/CSPSim/Source/Networking/NetworkNode.cpp 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/Source/Networking/NetworkNode.cpp 2004-05-16 03:05:34 UTC (rev 954) @@ -40,6 +40,13 @@ m_port = port; } +NetworkNode::NetworkNode(int node_id, const char * hostname, Port port) +{ + m_node_id = node_id; + m_addr = ost::InetHostAddress(hostname); + m_port = port; +} + void NetworkNode::setAddress(ost::InetHostAddress addr) { m_addr = addr; @@ -50,7 +57,7 @@ m_port = port; } -void NetworkNode::setId(int node_id) +void NetworkNode::setId(short node_id) { m_node_id = node_id; } @@ -65,7 +72,7 @@ return m_port; } -int NetworkNode::getId() +short NetworkNode::getId() { return m_node_id; } Modified: trunk/CSP/CSPSim/Source/Networking/ObjectUpdateMessage.cpp =================================================================== --- trunk/CSP/CSPSim/Source/Networking/ObjectUpdateMessage.cpp 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/Source/Networking/ObjectUpdateMessage.cpp 2004-05-16 03:05:34 UTC (rev 954) @@ -24,28 +24,28 @@ #include "Networking.h" -ObjectUpdateMessage::ObjectUpdateMessage(simdata::uint16 id, simdata::Vector3 position, simdata::Vector3 velocity) -{ - // reserve space to hold 6 doubles. - double num; - short magicNumber = 0xFCCF; - m_BufferLen = 3*sizeof(short) + sizeof(unsigned int) + 6 * sizeof(double); - m_Buf = new unsigned char [ m_BufferLen ]; - m_MessageType = 2; +//ObjectUpdateMessage::ObjectUpdateMessage(simdata::uint16 id, simdata::Vector3 position, simdata::Vector3 velocity) +//{ +// // reserve space to hold 6 doubles. +// double num; +// short magicNumber = 0xFCCF; +// m_BufferLen = 3*sizeof(short) + sizeof(unsigned int) + 6 * sizeof(double); +// m_Buf = new unsigned char [ m_BufferLen ]; +// m_MessageType = 2; - unsigned char * ptrBuf = m_Buf; - memcpy((void*)ptrBuf, (void*)&magicNumber, sizeof(short)); ptrBuf += sizeof(short); - memcpy((void*)ptrBuf, (void*)&m_BufferLen, sizeof(short)); ptrBuf += sizeof(short); - memcpy((void*)ptrBuf, (void*)&m_MessageType, sizeof(short)); ptrBuf += sizeof(short); - memcpy((void*)ptrBuf, (void*)&id, sizeof(unsigned int)); ptrBuf += sizeof(unsigned int); - num = position.x(); memcpy((void*)ptrBuf, (void*)&num, sizeof(double)); ptrBuf += sizeof(double); - num = position.y(); memcpy((void*)ptrBuf, (void*)&num, sizeof(double)); ptrBuf += sizeof(double); - num = position.z(); memcpy((void*)ptrBuf, (void*)&num, sizeof(double)); ptrBuf += sizeof(double); - num = velocity.z(); memcpy((void*)ptrBuf, (void*)&num, sizeof(double)); ptrBuf += sizeof(double); - num = velocity.y(); memcpy((void*)ptrBuf, (void*)&num, sizeof(double)); ptrBuf += sizeof(double); - num = velocity.z(); memcpy((void*)ptrBuf, (void*)&num, sizeof(double)); +// unsigned char * ptrBuf = m_Buf; +// memcpy((void*)ptrBuf, (void*)&magicNumber, sizeof(short)); ptrBuf += sizeof(short); +// memcpy((void*)ptrBuf, (void*)&m_BufferLen, sizeof(short)); ptrBuf += sizeof(short); +// memcpy((void*)ptrBuf, (void*)&m_MessageType, sizeof(short)); ptrBuf += sizeof(short); +// memcpy((void*)ptrBuf, (void*)&id, sizeof(unsigned int)); ptrBuf += sizeof(unsigned int); +// num = position.x(); memcpy((void*)ptrBuf, (void*)&num, sizeof(double)); ptrBuf += sizeof(double); +// num = position.y(); memcpy((void*)ptrBuf, (void*)&num, sizeof(double)); ptrBuf += sizeof(double); +// num = position.z(); memcpy((void*)ptrBuf, (void*)&num, sizeof(double)); ptrBuf += sizeof(double); +// num = velocity.z(); memcpy((void*)ptrBuf, (void*)&num, sizeof(double)); ptrBuf += sizeof(double); +// num = velocity.y(); memcpy((void*)ptrBuf, (void*)&num, sizeof(double)); ptrBuf += sizeof(double); +// num = velocity.z(); memcpy((void*)ptrBuf, (void*)&num, sizeof(double)); -} +//} Modified: trunk/CSP/CSPSim/Source/ServerNode.cpp =================================================================== --- trunk/CSP/CSPSim/Source/ServerNode.cpp 2004-05-12 21:50:20 UTC (rev 953) +++ trunk/CSP/CSPSim/Source/ServerNode.cpp 2004-05-16 03:05:34 UTC (rev 954) @@ -14,34 +14,32 @@ int ServerNode::run() { printf("Network test client starting up...\n"); - Port clientPort = 20010; - Port serverPort = 20011; - MessageSocketDuplex * socket = new MessageSocketDuplex(serverPort); - NetworkMessage message; - message.initialize(1, 100); - memset((void*)message.getPayloadPtr(), 0, 100); + Port remotePort = 3150; + Port localPort = 3160; + unsigned short messageLen = 512; + NetworkNode * remoteNode; + NetworkNode localNode(1, "localhost", localPort); + + MessageSocketDuplex * socket = new MessageSocketDuplex(localPort); + NetworkMessage * message=NULL; while(1) { - int numreceived = socket->recvfrom(message, NULL, &clientPort); - char * payloadPtr = (char*)message.getPayloadPtr(); - printf("Received Mesage From Client: %s\n", payloadPtr); - memset((void*)message.getPayloadPtr(), 0, 100); - if (numreceived == 0) + int numreceived = socket->recvfrom(&message); + if (numreceived > 0) { -// ::sleep(5); + Port port = message->getOriginatorPort(); + printf("Received Data From Client:\n"); + printf("Client port: %d\n", port); } + else + { +#ifndef WIN32 + ::sleep(1); +#endif + } } return 0; } -#ifdef CSP_STANDALONE -int main(int argc, char * argv[]) -{ - ServerNode node; - return node.run(); -} - -#endif - |