PhysicsClientTCP.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. #include "PhysicsClientTCP.h"
  2. #include "ActiveSocket.h"
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "../Utils/b3Clock.h"
  6. #include "PhysicsClient.h"
  7. //#include "LinearMath/btVector3.h"
  8. #include "SharedMemoryCommands.h"
  9. #include <string>
  10. #include "Bullet3Common/b3Logging.h"
  11. #include "Bullet3Common/b3AlignedObjectArray.h"
  12. unsigned int b3DeserializeInt2(const unsigned char* input)
  13. {
  14. unsigned int tmp = (input[3] << 24) + (input[2] << 16) + (input[1] << 8) + input[0];
  15. return tmp;
  16. }
  17. bool gVerboseNetworkMessagesClient2 = false;
  18. struct TcpNetworkedInternalData
  19. {
  20. /*
  21. ENetHost* m_client;
  22. ENetAddress m_address;
  23. ENetPeer* m_peer;
  24. ENetEvent m_event;
  25. */
  26. CActiveSocket m_tcpSocket;
  27. bool m_isConnected;
  28. TcpNetworkedInternalData* m_tcpInternalData;
  29. SharedMemoryCommand m_clientCmd;
  30. bool m_hasCommand;
  31. SharedMemoryStatus m_lastStatus;
  32. b3AlignedObjectArray<char> m_stream;
  33. std::string m_hostName;
  34. int m_port;
  35. b3AlignedObjectArray<unsigned char> m_tempBuffer;
  36. double m_timeOutInSeconds;
  37. TcpNetworkedInternalData()
  38. : m_isConnected(false),
  39. m_hasCommand(false),
  40. m_timeOutInSeconds(60)
  41. {
  42. }
  43. bool connectTCP()
  44. {
  45. if (m_isConnected)
  46. return true;
  47. m_tcpSocket.Initialize();
  48. m_isConnected = m_tcpSocket.Open(m_hostName.c_str(), m_port);
  49. if (m_isConnected)
  50. {
  51. m_tcpSocket.SetSendTimeout(m_timeOutInSeconds, 0);
  52. m_tcpSocket.SetReceiveTimeout(m_timeOutInSeconds, 0);
  53. int key = SHARED_MEMORY_MAGIC_NUMBER;
  54. m_tcpSocket.Send((uint8*)&key, 4);
  55. }
  56. return m_isConnected;
  57. }
  58. bool checkData()
  59. {
  60. bool hasStatus = false;
  61. //int serviceResult = enet_host_service(m_client, &m_event, 0);
  62. int maxLen = 4 + sizeof(SharedMemoryStatus) + SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE;
  63. int rBytes = m_tcpSocket.Receive(maxLen);
  64. if (rBytes <= 0)
  65. return false;
  66. //append to tmp buffer
  67. //recBytes
  68. unsigned char* d2 = (unsigned char*)m_tcpSocket.GetData();
  69. int curSize = m_tempBuffer.size();
  70. m_tempBuffer.resize(curSize + rBytes);
  71. for (int i = 0; i < rBytes; i++)
  72. {
  73. m_tempBuffer[curSize + i] = d2[i];
  74. }
  75. int packetSizeInBytes = -1;
  76. if (m_tempBuffer.size() >= 4)
  77. {
  78. packetSizeInBytes = b3DeserializeInt2(&m_tempBuffer[0]);
  79. }
  80. if (m_tempBuffer.size() == packetSizeInBytes)
  81. {
  82. unsigned char* data = &m_tempBuffer[0];
  83. if (gVerboseNetworkMessagesClient2)
  84. {
  85. printf("A packet of length %d bytes received\n", m_tempBuffer.size());
  86. }
  87. hasStatus = true;
  88. SharedMemoryStatus* statPtr = (SharedMemoryStatus*)&data[4];
  89. if (statPtr->m_type == CMD_STEP_FORWARD_SIMULATION_COMPLETED)
  90. {
  91. SharedMemoryStatus dummy;
  92. dummy.m_type = CMD_STEP_FORWARD_SIMULATION_COMPLETED;
  93. m_lastStatus = dummy;
  94. m_stream.resize(0);
  95. }
  96. else
  97. {
  98. m_lastStatus = *statPtr;
  99. int streamOffsetInBytes = 4 + sizeof(SharedMemoryStatus);
  100. int numStreamBytes = packetSizeInBytes - streamOffsetInBytes;
  101. m_stream.resize(numStreamBytes);
  102. for (int i = 0; i < numStreamBytes; i++)
  103. {
  104. m_stream[i] = data[i + streamOffsetInBytes];
  105. }
  106. }
  107. m_tempBuffer.clear();
  108. }
  109. return hasStatus;
  110. }
  111. };
  112. TcpNetworkedPhysicsProcessor::TcpNetworkedPhysicsProcessor(const char* hostName, int port)
  113. {
  114. m_data = new TcpNetworkedInternalData;
  115. if (hostName)
  116. {
  117. m_data->m_hostName = hostName;
  118. }
  119. m_data->m_port = port;
  120. }
  121. TcpNetworkedPhysicsProcessor::~TcpNetworkedPhysicsProcessor()
  122. {
  123. disconnect();
  124. delete m_data;
  125. }
  126. bool TcpNetworkedPhysicsProcessor::processCommand(const struct SharedMemoryCommand& clientCmd, struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes)
  127. {
  128. if (gVerboseNetworkMessagesClient2)
  129. {
  130. printf("PhysicsClientTCP::processCommand\n");
  131. }
  132. {
  133. int sz = 0;
  134. unsigned char* data = 0;
  135. m_data->m_tempBuffer.clear();
  136. if (clientCmd.m_type == CMD_STEP_FORWARD_SIMULATION)
  137. {
  138. sz = sizeof(int);
  139. data = (unsigned char*)&clientCmd.m_type;
  140. }
  141. else
  142. {
  143. if (clientCmd.m_type == CMD_REQUEST_VR_EVENTS_DATA)
  144. {
  145. sz = 3 * sizeof(int) + sizeof(smUint64_t) + 16;
  146. data = (unsigned char*)&clientCmd;
  147. }
  148. else
  149. {
  150. sz = sizeof(SharedMemoryCommand);
  151. data = (unsigned char*)&clientCmd;
  152. }
  153. }
  154. m_data->m_tcpSocket.Send((const uint8*)data, sz);
  155. }
  156. return false;
  157. }
  158. bool TcpNetworkedPhysicsProcessor::receiveStatus(struct SharedMemoryStatus& serverStatusOut, char* bufferServerToClient, int bufferSizeInBytes)
  159. {
  160. bool hasStatus = m_data->checkData();
  161. if (hasStatus)
  162. {
  163. if (gVerboseNetworkMessagesClient2)
  164. {
  165. printf("TcpNetworkedPhysicsProcessor::receiveStatus\n");
  166. }
  167. serverStatusOut = m_data->m_lastStatus;
  168. int numStreamBytes = m_data->m_stream.size();
  169. if (numStreamBytes < bufferSizeInBytes)
  170. {
  171. for (int i = 0; i < numStreamBytes; i++)
  172. {
  173. bufferServerToClient[i] = m_data->m_stream[i];
  174. }
  175. }
  176. else
  177. {
  178. printf("Error: steam buffer overflow\n");
  179. }
  180. }
  181. return hasStatus;
  182. }
  183. void TcpNetworkedPhysicsProcessor::renderScene(int renderFlags)
  184. {
  185. }
  186. void TcpNetworkedPhysicsProcessor::physicsDebugDraw(int debugDrawFlags)
  187. {
  188. }
  189. void TcpNetworkedPhysicsProcessor::setGuiHelper(struct GUIHelperInterface* guiHelper)
  190. {
  191. }
  192. bool TcpNetworkedPhysicsProcessor::isConnected() const
  193. {
  194. return m_data->m_isConnected;
  195. }
  196. bool TcpNetworkedPhysicsProcessor::connect()
  197. {
  198. bool isConnected = m_data->connectTCP();
  199. return isConnected;
  200. }
  201. void TcpNetworkedPhysicsProcessor::disconnect()
  202. {
  203. const char msg[16] = "disconnect";
  204. m_data->m_tcpSocket.Send((const uint8*)msg, 10);
  205. m_data->m_tcpSocket.Close();
  206. m_data->m_isConnected = false;
  207. }
  208. void TcpNetworkedPhysicsProcessor::setTimeOut(double timeOutInSeconds)
  209. {
  210. m_data->m_timeOutInSeconds = timeOutInSeconds;
  211. }