ReliableOrderedConvertedTest.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. /*
  2. * Copyright (c) 2014, Oculus VR, Inc.
  3. * All rights reserved.
  4. *
  5. * This source code is licensed under the BSD-style license found in the
  6. * LICENSE file in the root directory of this source tree. An additional grant
  7. * of patent rights can be found in the PATENTS file in the same directory.
  8. *
  9. */
  10. #include "ReliableOrderedConvertedTest.h"
  11. FILE *fp;
  12. int memoryUsage=0;
  13. char lastError[512];
  14. void* ReliableOrderedConvertedTest::LoggedMalloc(size_t size, const char *file, unsigned int line)
  15. {
  16. memoryUsage+=(int)size;
  17. if (fp)
  18. fprintf(fp,"Alloc %s:%i %i bytes %i total\n", file,line,size,memoryUsage);
  19. char *p = (char*) malloc(size+sizeof(size));
  20. memcpy(p,&size,sizeof(size));
  21. return p+sizeof(size);
  22. }
  23. void ReliableOrderedConvertedTest::LoggedFree(void *p, const char *file, unsigned int line)
  24. {
  25. char *realP=(char*)p-sizeof(size_t);
  26. size_t allocatedSize;
  27. memcpy(&allocatedSize,realP,sizeof(size_t));
  28. memoryUsage-=(int)allocatedSize;
  29. if (fp)
  30. fprintf(fp,"Free %s:%i %i bytes %i total\n", file,line,allocatedSize,memoryUsage);
  31. free(realP);
  32. }
  33. void* ReliableOrderedConvertedTest::LoggedRealloc(void *p, size_t size, const char *file, unsigned int line)
  34. {
  35. char *realP=(char*)p-sizeof(size_t);
  36. size_t allocatedSize;
  37. memcpy(&allocatedSize,realP,sizeof(size_t));
  38. memoryUsage-=(int)allocatedSize;
  39. memoryUsage+=(int)size;
  40. p = realloc(realP,size+sizeof(size));
  41. memcpy(p,&size,sizeof(size));
  42. if (fp)
  43. fprintf(fp,"Realloc %s:%i %i to %i bytes %i total\n", file,line,allocatedSize,size,memoryUsage);
  44. return (char*)p+sizeof(size);
  45. }
  46. /*
  47. What is being done here is having a server connect to a client.
  48. Packets are sent at 30 millisecond intervals for 12 seconds.
  49. Length and sequence are checked for each packet.
  50. Success conditions:
  51. All packets are correctly recieved in order.
  52. Failure conditions:
  53. All packets are not correctly recieved.
  54. All packets are not in order.
  55. */
  56. int ReliableOrderedConvertedTest::RunTest(DataStructures::List<RakString> params,bool isVerbose,bool noPauses)
  57. {
  58. RakPeerInterface *sender, *receiver;
  59. unsigned int packetNumberSender[32],packetNumberReceiver[32], receivedPacketNumberReceiver, receivedTimeReceiver;
  60. char str[256];
  61. char ip[32];
  62. TimeMS sendInterval, nextSend, currentTime, quitTime;
  63. unsigned short remotePort, localPort;
  64. unsigned char streamNumberSender,streamNumberReceiver;
  65. BitStream bitStream;
  66. Packet *packet;
  67. bool doSend=false;
  68. for (int i=0; i < 32; i++)
  69. {
  70. packetNumberSender[i]=0;
  71. packetNumberReceiver[i]=0;
  72. }
  73. /*
  74. if (argc==2)
  75. {
  76. fp = fopen(argv[1],"wt");
  77. SetMalloc_Ex(LoggedMalloc);
  78. SetRealloc_Ex(LoggedRealloc);
  79. SetFree_Ex(LoggedFree);
  80. }
  81. else
  82. */
  83. fp=0;
  84. destroyList.Clear(false,_FILE_AND_LINE_);
  85. sender =RakPeerInterface::GetInstance();
  86. destroyList.Push( sender ,_FILE_AND_LINE_);
  87. //sender->ApplyNetworkSimulator(.02, 100, 50);
  88. /*
  89. if (str[0]==0)
  90. sendInterval=30;
  91. else
  92. sendInterval=atoi(str);*///possible future params
  93. sendInterval=30;
  94. /*
  95. printf("Enter remote IP: ");
  96. Gets(ip, sizeof(ip));
  97. if (ip[0]==0)*/
  98. strcpy(ip, "127.0.0.1");
  99. /*
  100. printf("Enter remote port: ");
  101. Gets(str, sizeof(str));
  102. if (str[0]==0)*/
  103. strcpy(str, "60000");
  104. remotePort=atoi(str);
  105. /*
  106. printf("Enter local port: ");
  107. Gets(str, sizeof(str));
  108. if (str[0]==0)*/
  109. strcpy(str, "0");
  110. localPort=atoi(str);
  111. if (isVerbose)
  112. printf("Connecting...\n");
  113. sender->Startup(1, &SocketDescriptor(localPort,0), 1);
  114. sender->Connect(ip, remotePort, 0, 0);
  115. receiver =RakPeerInterface::GetInstance();
  116. destroyList.Push( receiver ,_FILE_AND_LINE_);
  117. /*
  118. printf("Enter local port: ");
  119. Gets(str, sizeof(str));
  120. if (str[0]==0)*/
  121. strcpy(str, "60000");
  122. localPort=atoi(str);
  123. if (isVerbose)
  124. printf("Waiting for connections...\n");
  125. receiver->Startup(32, &SocketDescriptor(localPort,0), 1);
  126. receiver->SetMaximumIncomingConnections(32);
  127. // if (sender)
  128. // sender->ApplyNetworkSimulator(128000, 50, 100);
  129. // if (receiver)
  130. // receiver->ApplyNetworkSimulator(128000, 50, 100);
  131. /*printf("How long to run this test for, in seconds?\n");
  132. Gets(str, sizeof(str));
  133. if (str[0]==0)*/
  134. strcpy(str, "12");
  135. currentTime = GetTimeMS();
  136. quitTime = atoi(str) * 1000 + currentTime;
  137. nextSend=currentTime;
  138. while (currentTime < quitTime)
  139. //while (1)
  140. {
  141. packet = sender->Receive();
  142. while (packet)
  143. {
  144. // PARSE TYPES
  145. switch(packet->data[0])
  146. {
  147. case ID_CONNECTION_REQUEST_ACCEPTED:
  148. if (isVerbose)
  149. printf("ID_CONNECTION_REQUEST_ACCEPTED\n");
  150. doSend=true;
  151. nextSend=currentTime;
  152. break;
  153. case ID_NO_FREE_INCOMING_CONNECTIONS:
  154. if (isVerbose)
  155. printf("ID_NO_FREE_INCOMING_CONNECTIONS\n");
  156. break;
  157. case ID_DISCONNECTION_NOTIFICATION:
  158. if (isVerbose)
  159. printf("ID_DISCONNECTION_NOTIFICATION\n");
  160. break;
  161. case ID_CONNECTION_LOST:
  162. if (isVerbose)
  163. printf("ID_CONNECTION_LOST\n");
  164. break;
  165. case ID_CONNECTION_ATTEMPT_FAILED:
  166. if (isVerbose)
  167. printf("Connection attempt failed\n");
  168. break;
  169. }
  170. sender->DeallocatePacket(packet);
  171. packet = sender->Receive();
  172. }
  173. while (doSend && currentTime > nextSend)
  174. {
  175. streamNumberSender=0;
  176. // streamNumber = randomMT() % 32;
  177. // Do the send
  178. bitStream.Reset();
  179. bitStream.Write((unsigned char) (ID_USER_PACKET_ENUM+1));
  180. bitStream.Write(packetNumberSender[streamNumberSender]++);
  181. bitStream.Write(streamNumberSender);
  182. bitStream.Write(currentTime);
  183. char *pad;
  184. int padLength = (randomMT() % 5000) + 1;
  185. pad = new char [padLength];
  186. bitStream.Write(pad, padLength);
  187. delete [] pad;
  188. // Send on a random priority with a random stream
  189. // if (sender->Send(&bitStream, HIGH_PRIORITY, (PacketReliability) (RELIABLE + (randomMT() %2)) ,streamNumber, UNASSIGNED_SYSTEM_ADDRESS, true)==false)
  190. if (sender->Send(&bitStream, HIGH_PRIORITY, RELIABLE_ORDERED ,streamNumberSender, UNASSIGNED_SYSTEM_ADDRESS, true)==false)
  191. packetNumberSender[streamNumberSender]--; // Didn't finish connecting yet?
  192. RakNetStatistics *rssSender;
  193. rssSender=sender->GetStatistics(sender->GetSystemAddressFromIndex(0));
  194. if (isVerbose)
  195. printf("Snd: %i.\n", packetNumberSender[streamNumberSender]);
  196. nextSend+=sendInterval;
  197. // Test halting
  198. // if (rand()%20==0)
  199. // nextSend+=1000;
  200. }
  201. packet = receiver->Receive();
  202. while (packet)
  203. {
  204. switch(packet->data[0])
  205. {
  206. case ID_NEW_INCOMING_CONNECTION:
  207. if (isVerbose)
  208. printf("ID_NEW_INCOMING_CONNECTION\n");
  209. break;
  210. case ID_DISCONNECTION_NOTIFICATION:
  211. if (isVerbose)
  212. printf("ID_DISCONNECTION_NOTIFICATION\n");
  213. break;
  214. case ID_CONNECTION_LOST:
  215. if (isVerbose)
  216. printf("ID_CONNECTION_LOST\n");
  217. break;
  218. case ID_USER_PACKET_ENUM+1:
  219. bitStream.Reset();
  220. bitStream.Write((char*)packet->data, packet->length);
  221. bitStream.IgnoreBits(8); // Ignore ID_USER_PACKET_ENUM+1
  222. bitStream.Read(receivedPacketNumberReceiver);
  223. bitStream.Read(streamNumberReceiver);
  224. bitStream.Read(receivedTimeReceiver);
  225. if (receivedPacketNumberReceiver!=packetNumberReceiver[streamNumberReceiver])
  226. {
  227. //WARNING: If you modify the below code make sure the whole string remains in bounds, sprintf will NOT do it for you.
  228. //The error string is 512 in length
  229. //Note: Removed buffer checking because chance is insignificant, left code if wanted in future. Needs limits.h ISO C standard.
  230. /*
  231. int maxIntWorkingCopy= INT_MAX;
  232. int maxIntCharLen =0;
  233. while (maxIntWorkingCopy>0)
  234. {maxIntCharLen++;
  235. maxIntWorkingCopy/=10;
  236. }
  237. if (strlen(lastError)>maxIntCharLen* 3 +27)//512 should be a good len for now
  238. {*/
  239. sprintf(lastError,"Expecting %i got %i (channel %i).",packetNumberReceiver[streamNumberReceiver], receivedPacketNumberReceiver, streamNumberReceiver);
  240. /*
  241. }
  242. else
  243. {
  244. sprintf(lastError,"Did not get what was expected. More details can be given if the error string buffer size is increased.");
  245. }*/
  246. if (isVerbose)
  247. {
  248. RakNetStatistics *rssSender,*rssReceiver;
  249. char message[2048];
  250. rssSender=sender->GetStatistics(sender->GetSystemAddressFromIndex(0));
  251. rssReceiver=receiver->GetStatistics(receiver->GetSystemAddressFromIndex(0));
  252. StatisticsToString(rssSender, message, 2);
  253. printf("Server stats %s\n", message);
  254. StatisticsToString(rssReceiver, message, 2);
  255. printf("Client stats%s", message);
  256. DebugTools::ShowError(lastError,!noPauses && isVerbose,__LINE__,__FILE__);
  257. }
  258. return 1;
  259. }
  260. else
  261. if (isVerbose)
  262. {
  263. printf("Got %i.Channel %i.Len %i.", packetNumberReceiver[streamNumberReceiver], streamNumberReceiver, packet->length);
  264. printf("Sent=%u Received=%u Diff=%i.\n", receivedTimeReceiver, currentTime, (int)currentTime - (int) receivedTimeReceiver);
  265. }
  266. packetNumberReceiver[streamNumberReceiver]++;
  267. break;
  268. }
  269. receiver->DeallocatePacket(packet);
  270. packet = receiver->Receive();
  271. }
  272. RakSleep(0);
  273. currentTime=GetTimeMS();
  274. }
  275. if (isVerbose)
  276. {
  277. RakNetStatistics *rssSender,*rssReceiver;
  278. char message[2048];
  279. rssSender=sender->GetStatistics(sender->GetSystemAddressFromIndex(0));
  280. rssReceiver=receiver->GetStatistics(receiver->GetSystemAddressFromIndex(0));
  281. StatisticsToString(rssSender, message, 2);
  282. printf("Server stats %s\n", message);
  283. StatisticsToString(rssReceiver, message, 2);
  284. printf("Client stats%s", message);
  285. }
  286. if (fp)
  287. fclose(fp);
  288. return 0;
  289. }
  290. RakString ReliableOrderedConvertedTest::GetTestName()
  291. {
  292. return "ReliableOrderedConvertedTest";
  293. }
  294. RakString ReliableOrderedConvertedTest::ErrorCodeToString(int errorCode)
  295. {
  296. RakString returnString;
  297. switch (errorCode)
  298. {
  299. case 0:
  300. return "No error";
  301. break;
  302. case 1:
  303. returnString= "The very last error for this object was ";
  304. returnString+=lastError;
  305. return returnString;
  306. break;
  307. default:
  308. return "Undefined Error";
  309. }
  310. }
  311. ReliableOrderedConvertedTest::ReliableOrderedConvertedTest(void)
  312. {
  313. }
  314. ReliableOrderedConvertedTest::~ReliableOrderedConvertedTest(void)
  315. {
  316. }
  317. void ReliableOrderedConvertedTest::DestroyPeers()
  318. {
  319. int theSize=destroyList.Size();
  320. for (int i=0; i < theSize; i++)
  321. RakPeerInterface::DestroyInstance(destroyList[i]);
  322. }
粤ICP备19079148号