FCM2VerifiedJoinSimultaneousTest.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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 <cstdio>
  11. #include <cstring>
  12. #include <stdlib.h>
  13. #include "GetTime.h"
  14. #include "RakPeerInterface.h"
  15. #include "MessageIdentifiers.h"
  16. #include "RakNetTypes.h"
  17. #include "RakSleep.h"
  18. #include "FullyConnectedMesh2.h"
  19. #include "ConnectionGraph2.h"
  20. #include <assert.h>
  21. #include "SocketLayer.h"
  22. #include "Kbhit.h"
  23. #include "PacketLogger.h"
  24. #include "Gets.h"
  25. #include "BitStream.h"
  26. using namespace RakNet;
  27. #define NUM_PEERS 4
  28. RakNet::RakPeerInterface *rakPeer[NUM_PEERS];
  29. class FullyConnectedMesh2_UserData : public FullyConnectedMesh2
  30. {
  31. virtual void WriteVJCUserData(RakNet::BitStream *bsOut) {bsOut->Write(RakString("WriteVJCUserData test"));}
  32. virtual void WriteVJSUserData(RakNet::BitStream *bsOut, RakNetGUID userGuid) {bsOut->Write(RakString("WriteVJSUserData test, userGuid=%s", userGuid.ToString()));}
  33. };
  34. int main()
  35. {
  36. FullyConnectedMesh2_UserData fcm2[NUM_PEERS];
  37. for (int i=0; i < NUM_PEERS; i++)
  38. {
  39. rakPeer[i]=RakNet::RakPeerInterface::GetInstance();
  40. rakPeer[i]->AttachPlugin(&fcm2[i]);
  41. fcm2[i].SetAutoparticipateConnections(false);
  42. fcm2[i].SetConnectOnNewRemoteConnection(false, "");
  43. RakNet::SocketDescriptor sd;
  44. sd.port=60000+i;
  45. StartupResult sr = rakPeer[i]->Startup(NUM_PEERS,&sd,1);
  46. RakAssert(sr==RAKNET_STARTED);
  47. rakPeer[i]->SetMaximumIncomingConnections(NUM_PEERS);
  48. rakPeer[i]->SetTimeoutTime(1000,RakNet::UNASSIGNED_SYSTEM_ADDRESS);
  49. printf("%i. Our guid is %s\n", i, rakPeer[i]->GetGuidFromSystemAddress(RakNet::UNASSIGNED_SYSTEM_ADDRESS).ToString());
  50. }
  51. RakSleep(100);
  52. for (int i=1; i < NUM_PEERS; i++)
  53. {
  54. ConnectionAttemptResult car = rakPeer[i]->Connect("127.0.0.1", 60000, 0, 0 );
  55. RakAssert(car==CONNECTION_ATTEMPT_STARTED);
  56. }
  57. RakSleep(100);
  58. for (int i=1; i < NUM_PEERS; i++)
  59. {
  60. fcm2[0].StartVerifiedJoin(rakPeer[i]->GetMyGUID());
  61. }
  62. bool quit=false;
  63. RakNet::Packet *packet;
  64. char ch;
  65. while (!quit)
  66. {
  67. for (int peerIndex=0; peerIndex < NUM_PEERS; peerIndex++)
  68. {
  69. for (packet = rakPeer[peerIndex]->Receive(); packet; rakPeer[peerIndex]->DeallocatePacket(packet), packet = rakPeer[peerIndex]->Receive())
  70. {
  71. switch (packet->data[0])
  72. {
  73. case ID_FCM2_VERIFIED_JOIN_START:
  74. {
  75. printf("%s: Got ID_FCM2_VERIFIED_JOIN_START from %s. address=", rakPeer[peerIndex]->GetMyGUID().ToString(), packet->guid.ToString());
  76. DataStructures::List<SystemAddress> addresses;
  77. DataStructures::List<RakNetGUID> guids;
  78. DataStructures::List<BitStream*> userData;
  79. fcm2[peerIndex].GetVerifiedJoinRequiredProcessingList(packet->guid, addresses, guids, userData);
  80. for (unsigned int i=0; i < guids.Size(); i++)
  81. {
  82. printf("%s:", guids[i].ToString());
  83. ConnectionAttemptResult car = rakPeer[peerIndex]->Connect(addresses[i].ToString(false), addresses[i].GetPort(), 0, 0);
  84. switch (car)
  85. {
  86. case CONNECTION_ATTEMPT_STARTED:
  87. printf("CONNECTION_ATTEMPT_STARTED");
  88. break;
  89. case ALREADY_CONNECTED_TO_ENDPOINT:
  90. printf("ALREADY_CONNECTED_TO_ENDPOINT");
  91. break;
  92. case CONNECTION_ATTEMPT_ALREADY_IN_PROGRESS:
  93. printf("CONNECTION_ATTEMPT_ALREADY_IN_PROGRESS");
  94. break;
  95. default:
  96. printf("Other");
  97. }
  98. printf(" ");
  99. RakString userDataAsStr;
  100. userData[i]->Read(userDataAsStr);
  101. printf(userDataAsStr.C_String());
  102. }
  103. printf("\n");
  104. }
  105. break;
  106. case ID_FCM2_VERIFIED_JOIN_FAILED:
  107. printf("%s: ID_FCM2_VERIFIED_JOIN_FAILED from %s\n", rakPeer[peerIndex]->GetMyGUID().ToString(), packet->guid.ToString());
  108. break;
  109. case ID_FCM2_VERIFIED_JOIN_CAPABLE:
  110. {
  111. RakNet::BitStream bs(packet->data,packet->length,false);
  112. FullyConnectedMesh2::SkipToVJCUserData(&bs);
  113. RakString testStr;
  114. bs.Read(testStr);
  115. printf("%s: ID_FCM2_VERIFIED_JOIN_CAPABLE from %s\n", rakPeer[peerIndex]->GetMyGUID().ToString(), packet->guid.ToString());
  116. printf("STR: %s\n", testStr.C_String());
  117. fcm2[peerIndex].RespondOnVerifiedJoinCapable(packet, true, 0);
  118. }
  119. break;
  120. case ID_FCM2_VERIFIED_JOIN_ACCEPTED:
  121. {
  122. bool thisSystemAccepted;
  123. DataStructures::List<RakNetGUID> systemsAccepted;
  124. RakNet::BitStream additionalData;
  125. fcm2[peerIndex].GetVerifiedJoinAcceptedAdditionalData(packet, &thisSystemAccepted, systemsAccepted, &additionalData);
  126. if (thisSystemAccepted)
  127. {
  128. printf("%s: ID_FCM2_VERIFIED_JOIN_ACCEPTED from %s. systemsAccepted=", rakPeer[peerIndex]->GetMyGUID().ToString(), packet->guid.ToString());
  129. for (unsigned int i=0; i < systemsAccepted.Size(); i++)
  130. printf("%s ", systemsAccepted[i].ToString());
  131. printf("\n");
  132. }
  133. break;
  134. }
  135. case ID_FCM2_VERIFIED_JOIN_REJECTED:
  136. printf("%s: ID_FCM2_VERIFIED_JOIN_REJECTED from %s\n", rakPeer[peerIndex]->GetMyGUID().ToString(), packet->guid.ToString());
  137. rakPeer[peerIndex]->CloseConnection(packet->guid, true);
  138. break;
  139. default:
  140. printf("%s: %s from %s\n", rakPeer[peerIndex]->GetMyGUID().ToString(), PacketLogger::BaseIDTOString(packet->data[0]), packet->guid.ToString());
  141. }
  142. }
  143. }
  144. if (kbhit())
  145. {
  146. ch=getch();
  147. if (ch=='q' || ch=='Q')
  148. {
  149. printf("Quitting.\n");
  150. quit=true;
  151. }
  152. }
  153. RakSleep(30);
  154. }
  155. for (int i=0; i < NUM_PEERS; i++)
  156. {
  157. RakNet::RakPeerInterface::DestroyInstance(rakPeer[i]);
  158. }
  159. return 0;
  160. }
粤ICP备19079148号