Просмотр исходного кода

p2p and server-client mode mismatch, nat punchtrough sample updated

Arnis Lielturks 7 лет назад
Родитель
Сommit
3742397472
2 измененных файлов с 59 добавлено и 26 удалено
  1. 54 26
      Source/Urho3D/Network/Network.cpp
  2. 5 0
      Source/Urho3D/Network/NetworkEvents.h

+ 54 - 26
Source/Urho3D/Network/Network.cpp

@@ -478,8 +478,8 @@ void Network::DiscoverHosts(unsigned port)
     {
         SLNet::SocketDescriptor socket;
         // Startup local connection with max 1 incoming connection(first param) and 1 socket description (third param)
-        rakPeerClient_->Startup(32, &socket, 1);
-        rakPeerClient_->SetMaximumIncomingConnections(allowedConnectionCount_);
+        rakPeerClient_->Startup(2, &socket, 1);
+        rakPeerClient_->SetMaximumIncomingConnections(2);
     }
     rakPeerClient_->Ping("255.255.255.255", port, false);
 }
@@ -498,10 +498,8 @@ bool Network::Connect(const String& address, unsigned short port, Scene* scene,
     {
         SLNet::SocketDescriptor socket;
         // Startup local connection with max 2 incoming connections(first param) and 1 socket description (third param)
-        rakPeerClient_->Startup(32, &socket, 1);
-        rakPeerClient_->SetMaximumIncomingConnections(allowedConnectionCount_);
-    } else {
-        OnServerDisconnected();
+        rakPeerClient_->Startup(2, &socket, 1);
+        rakPeerClient_->SetMaximumIncomingConnections(2);
     }
 
     //isServer_ = false;
@@ -570,6 +568,11 @@ void Network::Disconnect(int waitMSec)
         serverConnection_->Disconnect(waitMSec);
         serverConnection_.Reset();
     }
+
+    if (rakPeerClient_->IsActive()) {
+        rakPeerClient_->Shutdown(1000);
+    }
+    natPunchthroughClient_->Clear();
 }
 
 bool Network::StartServer(unsigned short port)
@@ -651,18 +654,20 @@ void Network::AttemptNATPunchtrough(const String& guid, Scene* scene, const Vari
         remoteGUID_ = new SLNet::RakNetGUID;
 
     remoteGUID_->FromString(guid.CString());
-    rakPeerClient_->AttachPlugin(natPunchthroughClient_);
+
     if (rakPeerClient_->IsActive()) {
-        natPunchthroughClient_->OpenNAT(*remoteGUID_, *natPunchServerAddress_);
-    }
-    else {
-        SLNet::SocketDescriptor socket;
-        // Startup local connection with max 2 incoming connections(first param) and 1 socket description (third param)
-        rakPeerClient_->Startup(32, &socket, 1);
-        rakPeerClient_->SetMaximumIncomingConnections(allowedConnectionCount_);
+        rakPeerClient_->Shutdown(1000);
     }
+    natPunchthroughClient_->Clear();
+    rakPeerClient_->AttachPlugin(natPunchthroughClient_);
+
+    SLNet::SocketDescriptor socket;
+    // Startup local connection with max 2 incoming connections(first param) and 1 socket description (third param)
+    rakPeerClient_->Startup(2, &socket, 1);
+    rakPeerClient_->SetMaximumIncomingConnections(2);
 
-    rakPeerClient_->Connect(natPunchServerAddress_->ToString(false), natPunchServerAddress_->GetPort(), nullptr, 0);
+    SLNet::ConnectionAttemptResult connectResult = rakPeerClient_->Connect(natPunchServerAddress_->ToString(false), natPunchServerAddress_->GetPort(), nullptr, 0);
+    URHO3D_LOGINFO("AttemptNATPunchtrough status " + String((int) connectResult));
 }
 
 void Network::BroadcastMessage(int msgID, bool reliable, bool inOrder, const VectorBuffer& msg, unsigned contentID)
@@ -882,9 +887,9 @@ void Network::HandleIncomingPacket(SLNet::Packet* packet, bool isServer)
 {
     unsigned char packetID = packet->data[0];
 
-//    if (packetID < ID_USER_PACKET_ENUM) {
-//        URHO3D_LOGERROR(">> " + String((int)packetID) + "  HandleIncomingPacket: " + String(RAKNET_MESSAGEID_STRINGS[packetID]));
-//    }
+    if (packetID < ID_USER_PACKET_ENUM) {
+        URHO3D_LOGERROR(">> " + String((int)packetID) + "  HandleIncomingPacket: " + String(RAKNET_MESSAGEID_STRINGS[packetID]));
+    }
 
     bool packetHandled = false;
 
@@ -930,9 +935,8 @@ void Network::HandleIncomingPacket(SLNet::Packet* packet, bool isServer)
 //
 //                }
 //            }
-        } else {
-            NewConnectionEstablished(packet->guid, packet->systemAddress.ToString(false));
         }
+
         packetHandled = true;
     }
     else if (packetID == ID_REMOTE_CONNECTION_LOST || packetID == ID_REMOTE_DISCONNECTION_NOTIFICATION)
@@ -947,7 +951,10 @@ void Network::HandleIncomingPacket(SLNet::Packet* packet, bool isServer)
             SendEvent(E_NATMASTERCONNECTIONSUCCEEDED);
             if (!isServer && networkMode_ == SERVER_CLIENT)
             {
-                natPunchthroughClient_->OpenNAT(*remoteGUID_, *natPunchServerAddress_);
+                bool connecting = natPunchthroughClient_->OpenNAT(*remoteGUID_, *natPunchServerAddress_);
+                if (!connecting) {
+                    URHO3D_LOGERROR("Unable to do NAT punchtrough!");
+                }
             }
         }
         packetHandled = true;
@@ -1092,13 +1099,13 @@ void Network::HandleIncomingPacket(SLNet::Packet* packet, bool isServer)
     else if (packetID == ID_READY_EVENT_QUERY)
     {
         ReadyStatusChanged();
-        URHO3D_LOGINFOF("`````````````````````````` Got ID_READY_EVENT_QUERY from %s", packet->guid.ToString());
+        URHO3D_LOGINFOF("Got ID_READY_EVENT_QUERY from %s", packet->guid.ToString());
         packetHandled = true;
     }
     else if (packetID == ID_READY_EVENT_FORCE_ALL_SET)
     {
         ReadyStatusChanged();
-        URHO3D_LOGINFOF("`````````````````````````` Got ID_READY_EVENT_FORCE_ALL_SET from %s", packet->guid.ToString());
+        URHO3D_LOGINFOF("Got ID_READY_EVENT_FORCE_ALL_SET from %s", packet->guid.ToString());
         packetHandled = true;
     }
     else if (packetID == ID_UNCONNECTED_PONG) // Host discovery response
@@ -1124,6 +1131,15 @@ void Network::HandleIncomingPacket(SLNet::Packet* packet, bool isServer)
         }
         packetHandled = true;
     }
+    else if (packetID == ID_FCM2_REQUEST_FCMGUID)
+    {
+        if (networkMode_ == SERVER_CLIENT) {
+            URHO3D_LOGERROR("Network mode mismatch, disconnecting!");
+            OnServerDisconnected();
+            SendEvent(E_NETWORKMODEMISMATCH);
+            packetHandled = true;
+        }
+    }
     else if (packetID == ID_FCM2_NEW_HOST)
     {
         SLNet::BitStream bs(packet->data,packet->length,false);
@@ -1262,8 +1278,7 @@ void Network::HandleIncomingPacket(SLNet::Packet* packet, bool isServer)
         else {
             // we are client in either P2P or server-client mode
             MemoryBuffer buffer(packet->data + dataStart, packet->length - dataStart);
-            bool processed = serverConnection_->ProcessMessage(packetID, buffer);
-            if (!processed)
+            if (serverConnection_ && !serverConnection_->ProcessMessage(packetID, buffer))
             {
                 if (networkMode_ == PEER_TO_PEER) {
                     HandleMessageClient(packet->guid, 0, packetID, (const char *) (packet->data + dataStart), packet->length - dataStart);
@@ -1312,7 +1327,9 @@ void Network::Update(float timeStep)
         while (SLNet::Packet* packet = rakPeerClient_->Receive())
         {
             HandleIncomingPacket(packet, false);
-            rakPeerClient_->DeallocatePacket(packet);
+            if (rakPeerClient_->IsActive()) {
+                rakPeerClient_->DeallocatePacket(packet);
+            }
         }
     }
 }
@@ -1415,6 +1432,11 @@ void Network::OnServerDisconnected()
     if (networkMode_ == PEER_TO_PEER) {
         return;
     }
+
+    if (!serverConnection_) {
+        return;
+    }
+
     // Differentiate between failed connection, and disconnection
     bool failedConnect = serverConnection_ && serverConnection_->IsConnectPending();
     serverConnection_.Reset();
@@ -1429,6 +1451,12 @@ void Network::OnServerDisconnected()
         URHO3D_LOGERROR("Failed to connect to server");
         SendEvent(E_CONNECTFAILED);
     }
+
+//    if (rakPeerClient_->IsActive()) {
+        rakPeerClient_->Shutdown(0);
+//    }
+
+    natPunchthroughClient_->Clear();
 }
 
 void Network::ConfigureNetworkSimulator()

+ 5 - 0
Source/Urho3D/Network/NetworkEvents.h

@@ -175,6 +175,11 @@ URHO3D_EVENT(E_SERVERFULL, ServerFull)
 {
 }
 
+/// Server/Host doesn't allow any new connections
+URHO3D_EVENT(E_NETWORKMODEMISMATCH, NetworkModeMismatch)
+{
+}
+
 /// When host system is elected
 URHO3D_EVENT(E_P2PNEWHOST, P2PNewHost)
 {