Exemplo n.º 1
0
 public void DisConnect()
 {
     m_Socket.CloseConnection(m_SystemAddress, false);
     m_Socket.Shutdown(300);
     RakPeerInterface.DestroyInstance(m_Socket);
     m_SystemAddress = null;
     m_Socket        = null;
     OnDisconnected();
 }
Exemplo n.º 2
0
    public void Close()
    {
        if (server != null)
        {
            server.Shutdown(300);
            RakPeer.DestroyInstance(server);
        }

        server = null;
    }
Exemplo n.º 3
0
 public void Dispose()
 {
     if (_scheduledTransportLoop != null)
     {
         _scheduledTransportLoop.Dispose();
         if (_peer != null)
         {
             if (_peer.IsActive())
             {
                 _peer.Shutdown(1000);
             }
             RakPeerInterface.DestroyInstance(_peer);
         }
         IsRunning = false;
         _logger.Info("transports.raknet", "Stopped raknet server.");
     }
 }
Exemplo n.º 4
0
    public bool Connect(string ip, int port, string pwd)
    {
        m_Socket = RakPeerInterface.GetInstance();
        m_Socket.AllowConnectionResponseIPMigration(false);
        SocketDescriptor socketDescriptor = new SocketDescriptor(0, "0");

        socketDescriptor.socketFamily = 2;
        m_Socket.Startup(8, socketDescriptor, 1);
        m_Socket.SetOccasionalPing(true);
        ConnectionAttemptResult car = m_Socket.Connect(ip, (ushort)port, pwd, pwd.Length);

        if (car == ConnectionAttemptResult.CONNECTION_ATTEMPT_STARTED)
        {
            return(true);
        }
        else
        {
            m_Socket.Shutdown(300);
            RakPeerInterface.DestroyInstance(m_Socket);
            return(false);
        }
    }
Exemplo n.º 5
0
    /**
     * Wait for an incoming punchthrough from a client. Once a hole is punched
     * RakNet is shut down so that the NetworkManager can create a new UNet Server
     * listening on the port that the puncthrough arrived on.
     */
    IEnumerator waitForIncomingNATPunchThroughOnServer(Action <int> onHolePunched)
    {
        ushort natListenPort = 0;

        while (true)
        {
            yield return(new WaitForEndOfFrame());

            // Check for incoming packet
            Packet packet = rakPeer.Receive();

            // No packet, maybe next time
            if (packet == null)
            {
                continue;
            }

            // Got a packet, see what it is
            RakNet.DefaultMessageIDTypes messageType = (DefaultMessageIDTypes)packet.data[0];
            switch (messageType)
            {
            case DefaultMessageIDTypes.ID_NAT_PUNCHTHROUGH_SUCCEEDED:
                bool weAreTheSender = packet.data[1] == 1;
                if (!weAreTheSender)
                {
                    // Someone successfully punched through to us
                    // natListenPort is the port that the server should listen on
                    natListenPort = rakPeer.GetInternalID().GetPort();
                    // Now we're waiting for the client to try and connect to us
                    Debug.Log("Received punch through from " + rakPeer.GetMyGUID() + " " + packet.systemAddress.ToString());
                }
                break;

            case DefaultMessageIDTypes.ID_NEW_INCOMING_CONNECTION:
                // Cool we've got a connection. The client now knows which port to connect from / to
                Debug.Log("Received incoming RakNet connection.");
                // Close the connection to the client
                rakPeer.CloseConnection(packet.guid, true);
                // And also to the Facilitator
                rakPeer.CloseConnection(facilitatorSystemAddress, true);
                break;

            case DefaultMessageIDTypes.ID_DISCONNECTION_NOTIFICATION:
                // Once the Facilitator has disconnected we shut down raknet
                // so that UNet can listen on the port that RakNet is currently listening on
                // At this point the hole is succesfully punched
                // RakNet is then reconnected to the facilitator on a new random port.
                if (packet.systemAddress == facilitatorSystemAddress)
                {
                    rakPeer.Shutdown(0);

                    // Hole is punched, UNet can start listening
                    onHolePunched(natListenPort);

                    // Reconnect to Facilitator for next punchthrough
                    StartCoroutine(connectToNATFacilitator());

                    yield break;     // Totally done
                }
                break;

            default:
                Debug.Log(((DefaultMessageIDTypes)packet.data[0]).ToString());
                break;
            }
        }
    }
    IEnumerator waitForResponseFromServerTest(RakNetGUID hostGUID)
    {
        ushort natListenPort = 0, natConnectPort = 0;

        while (true)
        {
            Packet packet = rakPeerTest.Receive();
            if (packet != null)
            {
                DefaultMessageIDTypes messageType = (DefaultMessageIDTypes)packet.data[0];

                switch (messageType)
                {
                case DefaultMessageIDTypes.ID_NAT_PUNCHTHROUGH_SUCCEEDED:
                    // A hole has been punched but we're not done yet. We need to actually connect (via RakNet)
                    // to the server so that we can get the port to connect from
                    // natConnectPort is the external port of the server to connect to
                    natConnectPort = packet.systemAddress.GetPort();
                    rakPeerTest.Connect(packet.systemAddress.ToString(false), natConnectPort, "", 0);
                    Debug.Log("Hole punched!" + packet.systemAddress.GetPort());
                    break;

                case DefaultMessageIDTypes.ID_CONNECTION_REQUEST_ACCEPTED:
                    // Ok, we connected, we can now use GetExternalID to get the port to connect from.
                    natListenPort = rakPeerTest.GetExternalID(packet.systemAddress).GetPort();
                    Debug.Log("Connected");
                    // Now we wait for the server to disconnect us so that we know it is ready for the UNet connection
                    break;

                case DefaultMessageIDTypes.ID_DISCONNECTION_NOTIFICATION:
                    // Server has disconnected us. We are ready to connect via UNet

                    // Shut down RakNet
                    rakPeerTest.Shutdown(0);
                    connectedToFacTest = false;
                    // Hole is punched!
                    onHolePunchedTest(natListenPort, natConnectPort);

                    //ConnectFacTest (); //reconnect for server
                    //StartCoroutine(connectToNATFacilitator());

                    yield break;                     // Totally done

                case DefaultMessageIDTypes.ID_NAT_CONNECTION_TO_TARGET_LOST:
                {
                    Debug.Log("target connection lost");                              //when two players conecting at same time
                    TryRepunch(hostGUID, packet.systemAddress);
                    yield break;
                }

                case DefaultMessageIDTypes.ID_NAT_TARGET_UNRESPONSIVE:
                {
                    Debug.Log("unresponsive");                             //when three players conecting at same time
                    TryRepunch(hostGUID, packet.systemAddress);
                    yield break;
                }

                case DefaultMessageIDTypes.ID_NAT_PUNCHTHROUGH_FAILED:
                {
                    Debug.Log("fail");                              //when two players conecting at same time
                    TryRepunch(hostGUID, packet.systemAddress);
                    yield break;
                }

                case DefaultMessageIDTypes.ID_NAT_TARGET_NOT_CONNECTED:
                {
                    Debug.Log("target not connected");                             //when two players conecting at same time
                    TryRepunch(hostGUID, packet.systemAddress);
                    yield break;
                }

                case DefaultMessageIDTypes.ID_NO_FREE_INCOMING_CONNECTIONS:
                {
                    Debug.Log("no free incoming connections");                             //when three players conecting at same time
                    TryRepunch(hostGUID, packet.systemAddress);
                    yield break;
                }

                default:
                    Debug.Log("RakNet Client received unexpected message type: " + ((DefaultMessageIDTypes)packet.data[0]).ToString());
                    yield break;
                }
            }
            yield return(new WaitForEndOfFrame());
        }
    }
Exemplo n.º 7
0
 public void CloseConnection()
 {
     client.CloseConnection(client.GetSystemAddressFromIndex(0), false);
     client.Shutdown(300);
 }
Exemplo n.º 8
0
        static void Main(string[] args)
        {
            RakNetStatistics rss    = new RakNetStatistics();
            RakPeerInterface client = RakPeerInterface.GetInstance();
            Packet           p      = new Packet();
            byte             packetIdentifier;
            bool             isServer = false;

            SystemAddress ClientID = RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS;

            string ip, serverPort, clientPort;

            Console.WriteLine("This is a sample implementation of a text based chat client");
            Console.WriteLine("Connect to the project 'Chat Example Server'");

            Console.WriteLine("Enter the client port to listen on");
            clientPort = Console.ReadLine();
            if (clientPort.Length == 0)
            {
                clientPort = "0";
            }

            Console.WriteLine("Enter the IP to connect to");
            ip = Console.ReadLine();
            if (ip.Length == 0)
            {
                ip = "127.0.0.1";
            }

            Console.WriteLine("Enter the port to connect to");
            serverPort = Console.ReadLine();
            if (serverPort.Length == 0)
            {
                serverPort = "1234";
            }

            SocketDescriptor socketDescriptor = new SocketDescriptor(Convert.ToUInt16(clientPort), "0");

            socketDescriptor.socketFamily = AF_INET;

            client.Startup(8, socketDescriptor, 1);
            client.SetOccasionalPing(true);

            ConnectionAttemptResult car = client.Connect(ip, Convert.ToUInt16(serverPort), "Rumpelstiltskin", "Rumpelstiltskin".Length);

            if (car != RakNet.ConnectionAttemptResult.CONNECTION_ATTEMPT_STARTED)
            {
                throw new Exception();
            }

            Console.WriteLine("My IP Addresses:");
            for (uint i = 0; i < client.GetNumberOfAddresses(); i++)
            {
                Console.WriteLine(client.GetLocalIP(i).ToString());
            }
            Console.WriteLine("My GUID is " + client.GetGuidFromSystemAddress(RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS).ToString());
            Console.WriteLine("'quit' to quit. 'stat' to show stats. 'ping' to ping.\n'disconnect' to disconnect. 'connect' to reconnnect. Type to talk.");
            string message;

            while (true)
            {
                System.Threading.Thread.Sleep(30);

                //Entire networking is threaded
                if (Console.KeyAvailable)
                {
                    message = Console.ReadLine();
                    if (message == "quit")
                    {
                        Console.WriteLine("Quitting");
                        break;
                    }

                    if (message == "stat")
                    {
                        string message2 = "";
                        rss = client.GetStatistics(client.GetSystemAddressFromIndex(0));
                        RakNet.RakNet.StatisticsToString(rss, out message2, 2);
                        Console.WriteLine(message2);
                        continue;
                    }

                    if (message == "disconnect")
                    {
                        Console.WriteLine("Enter index to disconnect: ");
                        string str = Console.ReadLine();
                        if (str == "")
                        {
                            str = "0";
                        }
                        uint index = Convert.ToUInt32(str, 16);
                        client.CloseConnection(client.GetSystemAddressFromIndex(index), false);
                        Console.WriteLine("Disconnecting");
                        continue;
                    }

                    if (message == "shutdown")
                    {
                        client.Shutdown(100);
                        Console.WriteLine("Disconnecting");
                        continue;
                    }

                    if (message == "ping")
                    {
                        if (client.GetSystemAddressFromIndex(0) != RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS)
                        {
                            client.Ping(client.GetSystemAddressFromIndex(0));
                        }
                        continue;
                    }
                    if (message == "connect")
                    {
                        Console.WriteLine("Enter the IP to connect to");
                        ip = Console.ReadLine();
                        if (ip.Length == 0)
                        {
                            ip = "127.0.0.1";
                        }

                        Console.WriteLine("Enter the port to connect to");
                        serverPort = Console.ReadLine();
                        if (serverPort.Length == 0)
                        {
                            serverPort = "1234";
                        }

                        ConnectionAttemptResult car2 = client.Connect(ip, Convert.ToUInt16(serverPort), "Rumpelstiltskin", "Rumpelstiltskin".Length);

                        continue;
                    }
                    if (message == "getlastping")
                    {
                        if (client.GetSystemAddressFromIndex(0) != RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS)
                        {
                            Console.WriteLine(client.GetLastPing(client.GetSystemAddressFromIndex(0)));
                        }

                        continue;
                    }

                    if (message.Length > 0)
                    {
                        client.Send(message, message.Length + 1, PacketPriority.HIGH_PRIORITY, PacketReliability.RELIABLE_ORDERED, (char)0, RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS, true);
                    }
                }

                for (p = client.Receive(); p != null; client.DeallocatePacket(p), p = client.Receive())
                {
                    packetIdentifier = GetPacketIdentifier(p);
                    switch ((DefaultMessageIDTypes)packetIdentifier)
                    {
                    case DefaultMessageIDTypes.ID_DISCONNECTION_NOTIFICATION:
                        Console.WriteLine("ID_DISCONNECTION_NOTIFICATION");
                        break;

                    case DefaultMessageIDTypes.ID_ALREADY_CONNECTED:
                        Console.WriteLine("ID_ALREADY_CONNECTED with guid " + p.guid);
                        break;

                    case DefaultMessageIDTypes.ID_INCOMPATIBLE_PROTOCOL_VERSION:
                        Console.WriteLine("ID_INCOMPATIBLE_PROTOCOL_VERSION ");
                        break;

                    case DefaultMessageIDTypes.ID_REMOTE_DISCONNECTION_NOTIFICATION:
                        Console.WriteLine("ID_REMOTE_DISCONNECTION_NOTIFICATION ");
                        break;

                    case DefaultMessageIDTypes.ID_REMOTE_CONNECTION_LOST:     // Server telling the clients of another client disconnecting forcefully.  You can manually broadcast this in a peer to peer enviroment if you want.
                        Console.WriteLine("ID_REMOTE_CONNECTION_LOST");
                        break;

                    case DefaultMessageIDTypes.ID_CONNECTION_BANNED:     // Banned from this server
                        Console.WriteLine("We are banned from this server.\n");
                        break;

                    case DefaultMessageIDTypes.ID_CONNECTION_ATTEMPT_FAILED:
                        Console.WriteLine("Connection attempt failed ");
                        break;

                    case DefaultMessageIDTypes.ID_NO_FREE_INCOMING_CONNECTIONS:
                        Console.WriteLine("Server is full ");
                        break;

                    case DefaultMessageIDTypes.ID_INVALID_PASSWORD:
                        Console.WriteLine("ID_INVALID_PASSWORD\n");
                        break;

                    case DefaultMessageIDTypes.ID_CONNECTION_LOST:
                        // Couldn't deliver a reliable packet - i.e. the other system was abnormally
                        // terminated
                        Console.WriteLine("ID_CONNECTION_LOST\n");
                        break;

                    case DefaultMessageIDTypes.ID_CONNECTION_REQUEST_ACCEPTED:
                        // This tells the client they have connected
                        Console.WriteLine("ID_CONNECTION_REQUEST_ACCEPTED to %s " + p.systemAddress.ToString() + "with GUID " + p.guid.ToString());
                        Console.WriteLine("My external address is:" + client.GetExternalID(p.systemAddress).ToString());
                        break;

                    case DefaultMessageIDTypes.ID_CONNECTED_PING:
                    case DefaultMessageIDTypes.ID_UNCONNECTED_PING:
                        Console.WriteLine("Ping from " + p.systemAddress.ToString(true));
                        break;

                    default:
                        Console.WriteLine(System.Text.Encoding.UTF8.GetString(p.data));
                        break;
                    }
                }
            }
            client.Shutdown(300);
            RakNet.RakPeerInterface.DestroyInstance(client);
            Console.Read();
        }
Exemplo n.º 9
0
        static void Main(string[] args)
        {
            RakNetStatistics rss    = new RakNetStatistics();
            RakPeerInterface server = RakPeerInterface.GetInstance();

            server.SetIncomingPassword("Rumpelstiltskin", "Rumpelstiltskin".Length);
            server.SetTimeoutTime(30000, RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS);

            Packet p = new Packet();

            RakNet.SystemAddress clientID = RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS;
            byte packetIdentifier;
            bool isServer = true;

            string serverPort;

            Console.WriteLine("Enter the client port to listen on");
            serverPort = Console.ReadLine();
            if (serverPort.Length == 0)
            {
                serverPort = "1234";
            }

            Console.WriteLine("Starting server");
            RakNet.SocketDescriptor socketDescriptors = new SocketDescriptor(Convert.ToUInt16(serverPort), "0");
            socketDescriptors.port         = Convert.ToUInt16(serverPort);
            socketDescriptors.socketFamily = AF_INET;


            StartupResult sar = server.Startup(4, socketDescriptors, 1);

            if (sar != StartupResult.RAKNET_STARTED)
            {
                Console.WriteLine("Error starting server");
            }

            server.SetMaximumIncomingConnections(4);
            System.Threading.Thread.Sleep(1000);
            server.SetOccasionalPing(true);
            server.SetUnreliableTimeout(1000);


            for (int i = 0; i < server.GetNumberOfAddresses(); i++)
            {
                SystemAddress sa = server.GetInternalID(RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS, i);
                Console.WriteLine((i + 1).ToString() + ". " + sa.ToString() + "(LAN = " + sa.IsLANAddress() + ")");
            }
            Console.WriteLine("My GUID is " + server.GetGuidFromSystemAddress(RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS).ToString());
            Console.WriteLine("'quit' to quit. 'stat' to show stats. 'ping' to ping.\n'pingip' to ping an ip address\n'ban' to ban an IP from connecting.\n'kick to kick the first connected player.\nType to talk.");
            string message;

            while (true)
            {
                System.Threading.Thread.Sleep(30);
                if (Console.KeyAvailable)
                {
                    message = Console.ReadLine();

                    if (message == "quit")
                    {
                        Console.WriteLine("Quitting");
                        break;
                    }

                    if (message == "kick")
                    {
                        server.CloseConnection(clientID, true, 0);
                        continue;
                    }

                    if (message == "stat")
                    {
                        rss = server.GetStatistics(server.GetSystemAddressFromIndex(0));
                        RakNet.RakNet.StatisticsToString(rss, out message, 2);
                        Console.WriteLine(message);
                        continue;
                    }
                    if (message == "ping")
                    {
                        server.Ping(clientID);
                        continue;
                    }
                    if (message == "list")
                    {
                        SystemAddress[] systems = new SystemAddress[10];
                        ushort          numCons = 10;
                        server.GetConnectionList(out systems, ref numCons);
                        for (int i = 0; i < numCons; i++)
                        {
                            Console.WriteLine((i + 1).ToString() + ". " + systems[i].ToString(true));
                        }
                        continue;
                    }

                    if (message == "ban")
                    {
                        Console.WriteLine("'Enter IP to ban.  You can use * as a wildcard");
                        message = Console.ReadLine();
                        server.AddToBanList(message);
                        Console.WriteLine("IP " + message + " added to ban list.");
                        continue;
                    }

                    string message2;
                    message2 = "Server: " + message;
                    server.Send(message2, message2.Length + 1, PacketPriority.HIGH_PRIORITY, PacketReliability.RELIABLE_ORDERED, (char)0, RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS, true);
                }

                for (p = server.Receive(); p != null; server.DeallocatePacket(p), p = server.Receive())
                {
                    packetIdentifier = GetPacketIdentifier(p);
                    switch ((DefaultMessageIDTypes)packetIdentifier)
                    {
                    case DefaultMessageIDTypes.ID_DISCONNECTION_NOTIFICATION:
                        Console.WriteLine("ID_DISCONNECTION_NOTIFICATION from " + p.systemAddress.ToString(true));
                        break;

                    case DefaultMessageIDTypes.ID_NEW_INCOMING_CONNECTION:
                        Console.WriteLine("ID_NEW_INCOMING_CONNECTION from " + p.systemAddress.ToString(true) + "with GUID " + p.guid.ToString());
                        clientID = p.systemAddress;
                        Console.WriteLine("Remote internal IDs: ");
                        for (int index = 0; index < MAXIMUM_NUMBER_OF_INTERNAL_IDS; index++)
                        {
                            SystemAddress internalId = server.GetInternalID(p.systemAddress, index);
                            if (internalId != RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS)
                            {
                                Console.WriteLine((index + 1).ToString() + ". " + internalId.ToString(true));
                            }
                        }
                        break;

                    case DefaultMessageIDTypes.ID_INCOMPATIBLE_PROTOCOL_VERSION:
                        Console.WriteLine("ID_INCOMPATIBLE_PROTOCOL_VERSION");
                        break;

                    case DefaultMessageIDTypes.ID_CONNECTED_PING:
                    case DefaultMessageIDTypes.ID_UNCONNECTED_PING:
                        Console.WriteLine("Ping from " + p.systemAddress.ToString(true));
                        break;

                    case DefaultMessageIDTypes.ID_CONNECTION_LOST:
                        Console.WriteLine("ID_CONNECTION_LOST from " + p.systemAddress.ToString(true));
                        break;

                    default:
                        Console.WriteLine(System.Text.Encoding.UTF8.GetString(p.data));
                        message = System.Text.Encoding.UTF8.GetString(p.data);
                        server.Send(message, message.Length + 1, PacketPriority.HIGH_PRIORITY, PacketReliability.RELIABLE_ORDERED, (char)0, RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS, true);
                        break;
                    }
                }
            }
            server.Shutdown(300);
            RakNet.RakPeerInterface.DestroyInstance(server);
            Console.Read();
        }