ReliableOrderedTest.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  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 "RakPeerInterface.h"
  11. #include "GetTime.h"
  12. #include "MessageIdentifiers.h"
  13. #include "BitStream.h"
  14. #include <cstdio>
  15. #include <memory.h>
  16. #include <cstring>
  17. #include <stdlib.h>
  18. #include "Rand.h"
  19. #include "RakNetStatistics.h"
  20. #include "RakSleep.h"
  21. #include "RakMemoryOverride.h"
  22. #include <stdio.h>
  23. #include "Gets.h"
  24. #include "Kbhit.h"
  25. using namespace RakNet;
  26. #ifdef _WIN32
  27. #include "WindowsIncludes.h" // Sleep
  28. #else
  29. #include <unistd.h> // usleep
  30. #endif
  31. FILE *fp;
  32. int memoryUsage=0;
  33. void *LoggedMalloc(size_t size, const char *file, unsigned int line)
  34. {
  35. memoryUsage+=size;
  36. if (fp)
  37. fprintf(fp,"Alloc %s:%i %i bytes %i total\n", file,line,size,memoryUsage);
  38. char *p = (char*) malloc(size+sizeof(size));
  39. memcpy(p,&size,sizeof(size));
  40. return p+sizeof(size);
  41. }
  42. void LoggedFree(void *p, const char *file, unsigned int line)
  43. {
  44. char *realP=(char*)p-sizeof(size_t);
  45. size_t allocatedSize;
  46. memcpy(&allocatedSize,realP,sizeof(size_t));
  47. memoryUsage-=allocatedSize;
  48. if (fp)
  49. fprintf(fp,"Free %s:%i %i bytes %i total\n", file,line,allocatedSize,memoryUsage);
  50. free(realP);
  51. }
  52. void* LoggedRealloc(void *p, size_t size, const char *file, unsigned int line)
  53. {
  54. char *realP=(char*)p-sizeof(size_t);
  55. size_t allocatedSize;
  56. memcpy(&allocatedSize,realP,sizeof(size_t));
  57. memoryUsage-=allocatedSize;
  58. memoryUsage+=size;
  59. p = realloc(realP,size+sizeof(size));
  60. memcpy(p,&size,sizeof(size));
  61. if (fp)
  62. fprintf(fp,"Realloc %s:%i %i to %i bytes %i total\n", file,line,allocatedSize,size,memoryUsage);
  63. return (char*)p+sizeof(size);
  64. }
  65. int main(int argc, char **argv)
  66. {
  67. RakPeerInterface *sender, *receiver;
  68. unsigned int packetNumber[32], receivedPacketNumber;
  69. RakNet::Time receivedTime;
  70. char str[256];
  71. char ip[32];
  72. RakNet::Time sendInterval, nextSend, currentTime, quitTime;
  73. unsigned short remotePort, localPort;
  74. unsigned char streamNumber;
  75. RakNet::BitStream bitStream;
  76. RakNet::Packet *packet;
  77. bool doSend=false;
  78. for (int i=0; i < 32; i++)
  79. packetNumber[i]=0;
  80. printf("This project tests RakNet's reliable ordered sending system.\n");
  81. printf("Difficulty: Beginner\n\n");
  82. printf("Act as (s)ender or (r)eceiver?\n");
  83. Gets(str, sizeof(str));
  84. if (str[0]==0)
  85. return 1;
  86. if (argc==2)
  87. {
  88. fp = fopen(argv[1],"wt");
  89. SetMalloc_Ex(LoggedMalloc);
  90. SetRealloc_Ex(LoggedRealloc);
  91. SetFree_Ex(LoggedFree);
  92. }
  93. else
  94. fp=0;
  95. if (str[0]=='s' || str[0]=='S')
  96. {
  97. sender = RakNet::RakPeerInterface::GetInstance();
  98. receiver = 0;
  99. printf("Enter number of ms to pass between sends: ");
  100. Gets(str, sizeof(str));
  101. if (str[0]==0)
  102. sendInterval=33;
  103. else
  104. sendInterval=atoi(str);
  105. printf("Enter remote IP: ");
  106. Gets(ip, sizeof(ip));
  107. if (ip[0]==0)
  108. strcpy(ip, "127.0.0.1");
  109. // strcpy(ip, "natpunch.jenkinssoftware.com");
  110. printf("Enter remote port: ");
  111. Gets(str, sizeof(str));
  112. if (str[0]==0)
  113. strcpy(str, "60000");
  114. remotePort=atoi(str);
  115. printf("Enter local port: ");
  116. Gets(str, sizeof(str));
  117. if (str[0]==0)
  118. strcpy(str, "0");
  119. localPort=atoi(str);
  120. printf("Connecting...\n");
  121. RakNet::SocketDescriptor socketDescriptor(localPort,0);
  122. sender->Startup(8, &socketDescriptor, 1);
  123. // sender->ApplyNetworkSimulator(.2, 0, 0);
  124. sender->Connect(ip, remotePort, 0, 0);
  125. }
  126. else
  127. {
  128. receiver = RakNet::RakPeerInterface::GetInstance();
  129. // receiver->ApplyNetworkSimulator(.2, 0, 0);
  130. sender=0;
  131. printf("Enter local port: ");
  132. Gets(str, sizeof(str));
  133. if (str[0]==0)
  134. strcpy(str, "60000");
  135. localPort=atoi(str);
  136. printf("Waiting for connections...\n");
  137. RakNet::SocketDescriptor socketDescriptor(localPort,0);
  138. receiver->Startup(8, &socketDescriptor, 1);
  139. receiver->SetMaximumIncomingConnections(8);
  140. }
  141. seedMT(1);
  142. printf("How long to run this test for, in seconds?\n");
  143. Gets(str, sizeof(str));
  144. if (str[0]==0)
  145. strcpy(str, "12000");
  146. currentTime = RakNet::GetTimeMS();
  147. quitTime = atoi(str) * 1000 + currentTime;
  148. nextSend=currentTime;
  149. printf("Test running.\n");
  150. //while (currentTime < quitTime)
  151. while (1)
  152. {
  153. #ifdef _WIN32
  154. if (kbhit())
  155. {
  156. char ch=getch();
  157. if (ch=='q')
  158. break;
  159. else if (ch==' ')
  160. {
  161. RakNetStatistics *rss;
  162. char message[2048];
  163. if (sender)
  164. rss=sender->GetStatistics(sender->GetSystemAddressFromIndex(0));
  165. else
  166. rss=receiver->GetStatistics(receiver->GetSystemAddressFromIndex(0));
  167. StatisticsToString(rss, message, 2);
  168. printf("%s", message);
  169. }
  170. }
  171. #endif
  172. if (sender)
  173. {
  174. uint32_t msgNumber;
  175. packet = sender->Receive();
  176. while (packet)
  177. {
  178. // PARSE TYPES
  179. switch(packet->data[0])
  180. {
  181. case ID_CONNECTION_REQUEST_ACCEPTED:
  182. printf("ID_CONNECTION_REQUEST_ACCEPTED\n");
  183. doSend=true;
  184. nextSend=currentTime;
  185. break;
  186. case ID_NO_FREE_INCOMING_CONNECTIONS:
  187. printf("ID_NO_FREE_INCOMING_CONNECTIONS\n");
  188. break;
  189. case ID_DISCONNECTION_NOTIFICATION:
  190. printf("ID_DISCONNECTION_NOTIFICATION\n");
  191. break;
  192. case ID_CONNECTION_LOST:
  193. printf("ID_CONNECTION_LOST\n");
  194. break;
  195. case ID_CONNECTION_ATTEMPT_FAILED:
  196. printf("Connection attempt failed\n");
  197. break;
  198. case ID_SND_RECEIPT_ACKED:
  199. memcpy(&msgNumber, packet->data+1, 4);
  200. printf("Msg #%i was delivered.\n", msgNumber);
  201. break;
  202. case ID_SND_RECEIPT_LOSS:
  203. memcpy(&msgNumber, packet->data+1, 4);
  204. printf("Msg #%i was probably not delivered.\n", msgNumber);
  205. break;
  206. }
  207. sender->DeallocatePacket(packet);
  208. packet = sender->Receive();
  209. }
  210. char *type="UNDEFINED";
  211. while (doSend && currentTime > nextSend)
  212. {
  213. streamNumber=0;
  214. streamNumber = randomMT() % 4;
  215. // Do the send
  216. for (int i=0; i < 2; i++)
  217. {
  218. bitStream.Reset();
  219. bitStream.Write((unsigned char) (ID_TIMESTAMP));
  220. bitStream.Write(RakNet::GetTime());
  221. bitStream.Write((unsigned char) (ID_USER_PACKET_ENUM+1));
  222. bitStream.Write(packetNumber[streamNumber]);
  223. packetNumber[streamNumber]++;
  224. bitStream.Write(streamNumber);
  225. PacketReliability reliability;
  226. if (0 && (randomMT()%2)==0)
  227. {
  228. type="UNRELIABLE_SEQUENCED";
  229. reliability=UNRELIABLE_SEQUENCED;
  230. }
  231. else
  232. {
  233. type="RELIABLE_ORDERED";
  234. reliability=RELIABLE_ORDERED;
  235. }
  236. int padLength;
  237. padLength = (randomMT() % 25000) + 1;
  238. bitStream.Write(reliability);
  239. bitStream.PadWithZeroToByteLength(padLength);
  240. if (sender->Send(&bitStream, HIGH_PRIORITY, reliability ,streamNumber, RakNet::UNASSIGNED_SYSTEM_ADDRESS, true)==0)
  241. {
  242. packetNumber[streamNumber]--;
  243. }
  244. }
  245. if (sender)
  246. {
  247. // RakNetStatistics *rssSender;
  248. //rssSender=sender->GetStatistics(sender->GetSystemAddressFromIndex(0));
  249. printf("Snd: %i, %s, time %" PRINTF_64_BIT_MODIFIER "u, length %i\n", packetNumber[streamNumber]-1, type, currentTime, bitStream.GetNumberOfBytesUsed());
  250. }
  251. nextSend+=sendInterval;
  252. // Test halting
  253. // if (rand()%20==0)
  254. // nextSend+=1000;
  255. }
  256. }
  257. else
  258. {
  259. packet = receiver->Receive();
  260. while (packet)
  261. {
  262. switch(packet->data[0])
  263. {
  264. case ID_NEW_INCOMING_CONNECTION:
  265. printf("ID_NEW_INCOMING_CONNECTION\n");
  266. break;
  267. case ID_DISCONNECTION_NOTIFICATION:
  268. printf("ID_DISCONNECTION_NOTIFICATION\n");
  269. break;
  270. case ID_CONNECTION_LOST:
  271. printf("ID_CONNECTION_LOST\n");
  272. break;
  273. case ID_TIMESTAMP:
  274. bitStream.Reset();
  275. bitStream.Write((char*)packet->data, packet->length);
  276. bitStream.IgnoreBits(8); // Ignore ID_TIMESTAMP
  277. bitStream.Read(receivedTime);
  278. bitStream.IgnoreBits(8); // Ignore ID_USER_ENUM+1
  279. bitStream.Read(receivedPacketNumber);
  280. bitStream.Read(streamNumber);
  281. PacketReliability reliability;
  282. bitStream.Read(reliability);
  283. char *type="UNDEFINED";
  284. if (reliability==UNRELIABLE_SEQUENCED)
  285. type="UNRELIABLE_SEQUENCED";
  286. else if (reliability==RELIABLE_ORDERED)
  287. type="RELIABLE_ORDERED";
  288. if (receivedPacketNumber>packetNumber[streamNumber])
  289. printf("Skipped %i got %i %s (channel %i).\n",packetNumber[streamNumber], receivedPacketNumber, type, streamNumber);
  290. else if (receivedPacketNumber<packetNumber[streamNumber])
  291. printf("Out of order packet! Expecting %i got %i %s (channel %i).\n",packetNumber[streamNumber], receivedPacketNumber, type, streamNumber);
  292. else
  293. printf("Got %i.%s.CH:%i.Len:%i.\n", packetNumber[streamNumber], type, streamNumber, packet->length);
  294. // printf("Sent=%" PRINTF_64_BIT_MODIFIER "u Received=%" PRINTF_64_BIT_MODIFIER "u Diff=%i.\n", receivedTime, currentTime, (int)(currentTime - receivedTime));
  295. packetNumber[streamNumber]=receivedPacketNumber+1;
  296. break;
  297. }
  298. receiver->DeallocatePacket(packet);
  299. packet = receiver->Receive();
  300. }
  301. }
  302. // DO NOT COMMENT OUT THIS SLEEP!
  303. // This sleep keeps RakNet responsive
  304. #ifdef _WIN32
  305. Sleep(0);
  306. #else
  307. usleep(0);
  308. #endif
  309. currentTime=RakNet::GetTimeMS();
  310. }
  311. if (sender)
  312. RakNet::RakPeerInterface::DestroyInstance(sender);
  313. if (receiver)
  314. RakNet::RakPeerInterface::DestroyInstance(receiver);
  315. if (fp)
  316. fclose(fp);
  317. return 1;
  318. }
粤ICP备19079148号