add App_PhysicsServerTCP and App_PhysicsServerSharedMemoryBridgeTCP
(can be easier tunneled over SSH)
This commit is contained in:
@@ -367,3 +367,5 @@ end
|
|||||||
|
|
||||||
|
|
||||||
include "udp"
|
include "udp"
|
||||||
|
include "tcp"
|
||||||
|
|
||||||
|
|||||||
223
examples/SharedMemory/tcp/main.cpp
Normal file
223
examples/SharedMemory/tcp/main.cpp
Normal file
@@ -0,0 +1,223 @@
|
|||||||
|
#include "PassiveSocket.h" // Include header for active socket object definition
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#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<char> 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) <timeOutInSeconds))
|
||||||
|
{
|
||||||
|
hasStatus = sm->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<unsigned char> 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;
|
||||||
|
}
|
||||||
|
|
||||||
141
examples/SharedMemory/tcp/premake4.lua
Normal file
141
examples/SharedMemory/tcp/premake4.lua
Normal file
@@ -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",
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user