From bfcdb8c4081429600345e11f601c4163dcd7d738 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Mon, 20 Feb 2017 14:43:01 -0800 Subject: [PATCH] add App_PhysicsServerTCP and App_PhysicsServerSharedMemoryBridgeTCP (can be easier tunneled over SSH) --- examples/SharedMemory/premake4.lua | 2 + examples/SharedMemory/tcp/main.cpp | 223 +++++++++++++++++++++++++ examples/SharedMemory/tcp/premake4.lua | 141 ++++++++++++++++ 3 files changed, 366 insertions(+) create mode 100644 examples/SharedMemory/tcp/main.cpp create mode 100644 examples/SharedMemory/tcp/premake4.lua diff --git a/examples/SharedMemory/premake4.lua b/examples/SharedMemory/premake4.lua index 399cf1473..6ab6ad0fe 100644 --- a/examples/SharedMemory/premake4.lua +++ b/examples/SharedMemory/premake4.lua @@ -367,3 +367,5 @@ end include "udp" +include "tcp" + diff --git a/examples/SharedMemory/tcp/main.cpp b/examples/SharedMemory/tcp/main.cpp new file mode 100644 index 000000000..497766f08 --- /dev/null +++ b/examples/SharedMemory/tcp/main.cpp @@ -0,0 +1,223 @@ +#include "PassiveSocket.h" // Include header for active socket object definition + +#include +#include "../../CommonInterfaces/CommonGUIHelperInterface.h" +#include "Bullet3Common/b3CommandLineArgs.h" + +#ifdef NO_SHARED_MEMORY +#include "PhysicsServerCommandProcessor.h" +typedef PhysicsServerCommandProcessor MyCommandProcessor; +#else +#include "SharedMemoryCommandProcessor.h" +typedef SharedMemoryCommandProcessor MyCommandProcessor; +#endif //NO_SHARED_MEMORY + +#include "SharedMemoryCommands.h" +#include "Bullet3Common/b3AlignedObjectArray.h" +#include "PhysicsServerCommandProcessor.h" +#include "../Utils/b3Clock.h" + +#define MAX_PACKET 4096 + +bool gVerboseNetworkMessagesServer = true; + +void MySerializeInt(unsigned int sz, unsigned char* output) +{ + unsigned int tmp = sz; + output[0] = tmp & 255; + tmp = tmp >> 8; + output[1] = tmp & 255; + tmp = tmp >> 8; + output[2] = tmp & 255; + tmp = tmp >> 8; + output[3] = tmp & 255; +} + +int main(int argc, char *argv[]) +{ + + b3CommandLineArgs parseArgs(argc,argv); + b3Clock clock; + double timeOutInSeconds = 10; + + DummyGUIHelper guiHelper; + MyCommandProcessor* sm = new MyCommandProcessor; + sm->setGuiHelper(&guiHelper); + + int port = 6667; + if (parseArgs.GetCmdLineArgument("port",port)) + { + printf("Using TCP port %d\n", port); + } + + gVerboseNetworkMessagesServer = parseArgs.CheckCmdLineFlag("verbose"); + +#ifndef NO_SHARED_MEMORY + int key = 0; + if (parseArgs.GetCmdLineArgument("sharedMemoryKey",key)) + { + sm->setSharedMemoryKey(key); + } +#endif//NO_SHARED_MEMORY + + bool isPhysicsClientConnected = sm->connect(); + bool exitRequested = false; + + if (isPhysicsClientConnected) + { + + CPassiveSocket socket; + CActiveSocket *pClient = NULL; + + //-------------------------------------------------------------------------- + // Initialize our socket object + //-------------------------------------------------------------------------- + socket.Initialize(); + + socket.Listen("localhost", port); + + while (!exitRequested) + { + b3Clock::usleep(0); + + if ((pClient = socket.Accept()) != NULL) + { + int clientPort = socket.GetClientPort(); + printf("connected from %s:%d\n", socket.GetClientAddr(),clientPort); + + //---------------------------------------------------------------------- + // Receive request from the client. + //---------------------------------------------------------------------- + while (1) + { + //printf("try receive\n"); + bool receivedData = false; + + if (pClient->Receive(MAX_PACKET)) + { + char* msg = (char*) pClient->GetData(); + int numBytesRec = pClient->GetBytesReceived(); + if (gVerboseNetworkMessagesServer) + { + printf("received message length [%d]\n",numBytesRec); + } + + receivedData = true; + + if (strncmp(msg,"stop",4)==0) + { + printf("Stop request received\n"); + exitRequested = true; + break; + } + + + SharedMemoryCommand cmd; + + SharedMemoryCommand* cmdPtr = 0; + + //performance test + if (numBytesRec == sizeof(int)) + { + cmdPtr = &cmd; + cmd.m_type = *(int*)pClient->GetData(); + } + + if (numBytesRec == sizeof(SharedMemoryCommand)) + { + cmdPtr = (SharedMemoryCommand*)pClient->GetData(); + } + if (cmdPtr) + { + SharedMemoryStatus serverStatus; + b3AlignedObjectArray buffer; + buffer.resize(SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE); + + bool hasStatus = sm->processCommand(*cmdPtr,serverStatus, &buffer[0], buffer.size()); + + double startTimeSeconds = clock.getTimeInSeconds(); + double curTimeSeconds = clock.getTimeInSeconds(); + + while ((!hasStatus) && ((curTimeSeconds - startTimeSeconds) receiveStatus(serverStatus, &buffer[0], buffer.size()); + curTimeSeconds = clock.getTimeInSeconds(); + } + if (gVerboseNetworkMessagesServer) + { + printf("buffer.size = %d\n", buffer.size()); + printf("serverStatus.m_numDataStreamBytes = %d\n", serverStatus.m_numDataStreamBytes); + } + if (hasStatus) + { + b3AlignedObjectArray packetData; + unsigned char* statBytes = (unsigned char*)&serverStatus; + + if (cmdPtr->m_type == CMD_STEP_FORWARD_SIMULATION) + { + packetData.resize(4 + sizeof(int)); + int sz = packetData.size(); + int curPos = 0; + + MySerializeInt(sz, &packetData[curPos]); + curPos += 4; + for (int i = 0; i < sizeof(int); i++) + { + packetData[i + curPos] = statBytes[i]; + } + curPos += sizeof(int); + + pClient->Send( &packetData[0], packetData.size() ); + + } + else + { + //create packetData with [int packetSizeInBytes, status, streamBytes) + packetData.resize(4 + sizeof(SharedMemoryStatus) + serverStatus.m_numDataStreamBytes); + int sz = packetData.size(); + int curPos = 0; + + MySerializeInt(sz, &packetData[curPos]); + curPos += 4; + for (int i = 0; i < sizeof(SharedMemoryStatus); i++) + { + packetData[i + curPos] = statBytes[i]; + } + curPos += sizeof(SharedMemoryStatus); + + for (int i = 0; i < serverStatus.m_numDataStreamBytes; i++) + { + packetData[i + curPos] = buffer[i]; + } + + pClient->Send( &packetData[0], packetData.size() ); + } + } + } + else + { + printf("received packet with unknown contents\n"); + } + } + if (!receivedData) + { + printf("Didn't receive data.\n"); + break; + } + } + printf("Disconnecting client.\n"); + pClient->Close(); + delete pClient; + + } + } + + socket.Close(); + socket.Shutdown(CSimpleSocket::Both); + } + + delete sm; + + return 0; +} + diff --git a/examples/SharedMemory/tcp/premake4.lua b/examples/SharedMemory/tcp/premake4.lua new file mode 100644 index 000000000..f4e011a9c --- /dev/null +++ b/examples/SharedMemory/tcp/premake4.lua @@ -0,0 +1,141 @@ + +project ("App_PhysicsServerSharedMemoryBridgeTCP") + + language "C++" + + kind "ConsoleApp" + + includedirs {"../../ThirdPartyLibs/clsocket/src","../../../src",".."} + + + if os.is("Windows") then + defines { "WIN32" } + links {"Ws2_32","Winmm"} + end + if os.is("Linux") then + defines {"_LINUX"} + end + if os.is("MacOSX") then + defines {"_DARWIN"} + end + + + links { + "clsocket", + "BulletFileLoader", + "Bullet3Common", + "LinearMath" + } + + files { + "main.cpp", + "../PhysicsClient.cpp", + "../PhysicsClient.h", + "../PhysicsDirect.cpp", + "../PhysicsDirect.h", + "../PhysicsCommandProcessorInterface.h", + "../SharedMemoryCommandProcessor.cpp", + "../SharedMemoryCommandProcessor.h", + "../PhysicsClientC_API.cpp", + "../PhysicsClientC_API.h", + "../Win32SharedMemory.cpp", + "../Win32SharedMemory.h", + "../PosixSharedMemory.cpp", + "../PosixSharedMemory.h", + "../../Utils/b3ResourcePath.cpp", + "../../Utils/b3ResourcePath.h", + "../../Utils/b3Clock.cpp", + "../../Utils/b3Clock.h", + } + + +project "App_PhysicsServerTCP" + +if _OPTIONS["ios"] then + kind "WindowedApp" +else + kind "ConsoleApp" +end + +defines { "NO_SHARED_MEMORY" } + +includedirs {"..","../../../src", "../../ThirdPartyLibs","../../ThirdPartyLibs/clsocket/src"} + +links { + "clsocket","Bullet3Common","BulletInverseDynamicsUtils", "BulletInverseDynamics", "BulletDynamics","BulletCollision", "LinearMath", "BussIK" +} + + + + if os.is("Windows") then + defines { "WIN32" } + links {"Ws2_32","Winmm"} + end + if os.is("Linux") then + defines {"_LINUX"} + end + if os.is("MacOSX") then + defines {"_DARWIN"} + end + +language "C++" + +myfiles = +{ + "../IKTrajectoryHelper.cpp", + "../IKTrajectoryHelper.h", + "../SharedMemoryCommands.h", + "../SharedMemoryPublic.h", + "../PhysicsServerCommandProcessor.cpp", + "../PhysicsServerCommandProcessor.h", + "../TinyRendererVisualShapeConverter.cpp", + "../TinyRendererVisualShapeConverter.h", + "../../TinyRenderer/geometry.cpp", + "../../TinyRenderer/model.cpp", + "../../TinyRenderer/tgaimage.cpp", + "../../TinyRenderer/our_gl.cpp", + "../../TinyRenderer/TinyRenderer.cpp", + "../../OpenGLWindow/SimpleCamera.cpp", + "../../OpenGLWindow/SimpleCamera.h", + "../../Importers/ImportURDFDemo/ConvertRigidBodies2MultiBody.h", + "../../Importers/ImportURDFDemo/MultiBodyCreationInterface.h", + "../../Importers/ImportURDFDemo/MyMultiBodyCreator.cpp", + "../../Importers/ImportURDFDemo/MyMultiBodyCreator.h", + "../../Importers/ImportMJCFDemo/BulletMJCFImporter.cpp", + "../../Importers/ImportMJCFDemo/BulletMJCFImporter.h", + "../../Importers/ImportURDFDemo/BulletUrdfImporter.cpp", + "../../Importers/ImportURDFDemo/BulletUrdfImporter.h", + "../../Importers/ImportURDFDemo/UrdfParser.cpp", + "../../Importers/ImportURDFDemo/urdfStringSplit.cpp", + "../../Importers/ImportURDFDemo/UrdfParser.cpp", + "../../Importers/ImportURDFDemo/UrdfParser.h", + "../../Importers/ImportURDFDemo/URDF2Bullet.cpp", + "../../Importers/ImportURDFDemo/URDF2Bullet.h", + "../../Utils/b3ResourcePath.cpp", + "../../Utils/b3Clock.cpp", + "../../Utils/RobotLoggingUtil.cpp", + "../../Utils/RobotLoggingUtil.h", + "../../../Extras/Serialize/BulletWorldImporter/*", + "../../../Extras/Serialize/BulletFileLoader/*", + "../../Importers/ImportURDFDemo/URDFImporterInterface.h", + "../../Importers/ImportURDFDemo/URDFJointTypes.h", + "../../Importers/ImportObjDemo/Wavefront2GLInstanceGraphicsShape.cpp", + "../../Importers/ImportObjDemo/LoadMeshFromObj.cpp", + "../../Importers/ImportSTLDemo/ImportSTLSetup.h", + "../../Importers/ImportSTLDemo/LoadMeshFromSTL.h", + "../../Importers/ImportColladaDemo/LoadMeshFromCollada.cpp", + "../../Importers/ImportColladaDemo/ColladaGraphicsInstance.h", + "../../ThirdPartyLibs/Wavefront/tiny_obj_loader.cpp", + "../../ThirdPartyLibs/tinyxml/tinystr.cpp", + "../../ThirdPartyLibs/tinyxml/tinyxml.cpp", + "../../ThirdPartyLibs/tinyxml/tinyxmlerror.cpp", + "../../ThirdPartyLibs/tinyxml/tinyxmlparser.cpp", + "../../Importers/ImportMeshUtility/b3ImportMeshUtility.cpp", + "../../ThirdPartyLibs/stb_image/stb_image.cpp", +} + +files { + myfiles, + "main.cpp", +} +