예제 #1
0
        public void Send(GalaxyID peer, byte[] data)
        {
            if (!connections.ContainsKey(peer.ToUint64()))
            {
                return;
            }
            if (data.Length <= 1100)
            {
                byte[] packet2 = new byte[data.Length + 4];
                data.CopyTo(packet2, 4);
                GalaxyInstance.Networking().SendP2PPacket(peer, packet2, (uint)packet2.Length, P2PSendType.P2P_SEND_RELIABLE);
                return;
            }
            int chunkSize     = 1096;
            int messageOffset = 0;

            byte[] packet = new byte[1100];
            packet[0] = 1;
            while (messageOffset < data.Length)
            {
                int thisChunkSize = chunkSize;
                if (messageOffset + chunkSize >= data.Length)
                {
                    packet[0]     = 0;
                    thisChunkSize = data.Length - messageOffset;
                }
                Buffer.BlockCopy(data, messageOffset, packet, 4, thisChunkSize);
                messageOffset += thisChunkSize;
                GalaxyInstance.Networking().SendP2PPacket(peer, packet, (uint)(thisChunkSize + 4), P2PSendType.P2P_SEND_RELIABLE);
            }
        }
예제 #2
0
    /* Sends a byte array packet to a user or lobby specified by GalaxyID
     * Note: we use a P2P connection in our game */
    public void SendP2PPacket(GalaxyID galaxyID, byte[] data, P2PSendType sendType = P2PSendType.P2P_SEND_RELIABLE, byte channel = 0)
    {
        uint dataSize = (uint)data.Length;

        try
        {
            GalaxyInstance.Networking().SendP2PPacket(galaxyID, data, dataSize, sendType, channel);
        }
        catch (GalaxyInstance.Error e)
        {
            Debug.LogError("Couldn't send packet for reason: " + e);
        }
    }
    /* Gets ping of a user or lobby 'galaxyID'
     * Note: To get a ping of a lobby or its member you first have to either
     * join it or request said lobby data */
    public int GetPingWith(GalaxyID galaxyID)
    {
        int ping = -1;

        try
        {
            ping = GalaxyInstance.Networking().GetPingWith(galaxyID);
        }
        catch (GalaxyInstance.Error e)
        {
            Debug.Log(e);
        }
        return(ping);
    }
예제 #4
0
        public long GetPingWith(GalaxyID peer)
        {
            long time = 0L;

            lastMessageTime.TryGetValue(peer.ToUint64(), out time);
            if (time == 0L)
            {
                return(0L);
            }
            if (getTimeNow() - time > 30000)
            {
                return(long.MaxValue);
            }
            return(GalaxyInstance.Networking().GetPingWith(peer));
        }
예제 #5
0
        public override void OnP2PPacketAvailable(uint msgSize, byte channel)
        {
            packetReceived = new byte[msgSize];
            if (GalaxyInstance.Networking().PeekP2PPacket(packetReceived, msgSize, ref msgSize, ref senderID, channel))
            {
                switch (channel)
                {
                case (byte)0:
                    GalaxyManager.Instance.Networking.ReadPacketWithBallPositions(packetReceived);
                    break;

                case (byte)1:
                    GalaxyManager.Instance.Networking.ReadPacketWithPlayerShot(packetReceived);
                    break;
                }
            }
        }
예제 #6
0
        public void Heartbeat(IEnumerable <GalaxyID> peers)
        {
            long timeNow = getTimeNow();

            if (heartbeatTimer <= timeNow)
            {
                heartbeatTimer = timeNow + 15000;
                byte[] heartbeatPacket = new byte[1]
                {
                    255
                };
                foreach (GalaxyID peer in peers)
                {
                    GalaxyInstance.Networking().SendP2PPacket(peer, heartbeatPacket, (uint)heartbeatPacket.Length, P2PSendType.P2P_SEND_RELIABLE);
                }
            }
        }
예제 #7
0
        public void Receive(Action <GalaxyID> onConnection, Action <GalaxyID, Stream> onMessage, Action <GalaxyID> onDisconnect, Action <string> onError)
        {
            long timeNow = getTimeNow();

            if (lobby == null)
            {
                if (lobbyOwner == selfId && recreateTimer > 0 && recreateTimer <= timeNow)
                {
                    recreateTimer = 0L;
                    tryCreateLobby();
                }
                return;
            }
            string lobbyVersion = GalaxyInstance.Matchmaking().GetLobbyData(lobby, "protocolVersion");

            if (lobbyVersion != "" && lobbyVersion != protocolVersion)
            {
                onError("Strings\\UI:CoopMenu_FailedProtocolVersion");
                Close();
                return;
            }
            foreach (GalaxyID lobbyMember in LobbyMembers())
            {
                if (!connections.ContainsKey(lobbyMember.ToUint64()) && !ghosts.Contains(lobbyMember.ToUint64()))
                {
                    connections.Add(lobbyMember.ToUint64(), lobbyMember);
                    onConnection(lobbyMember);
                }
            }
            ghosts.IntersectWith(from peer in LobbyMembers()
                                 select peer.ToUint64());
            byte[]   buffer     = new byte[1300];
            uint     packetSize = 1300u;
            GalaxyID sender     = new GalaxyID();

            while (GalaxyInstance.Networking().ReadP2PPacket(buffer, (uint)buffer.Length, ref packetSize, ref sender))
            {
                lastMessageTime[sender.ToUint64()] = timeNow;
                if (!connections.ContainsKey(sender.ToUint64()) || buffer[0] == byte.MaxValue)
                {
                    continue;
                }
                bool         incomplete   = buffer[0] == 1;
                MemoryStream messageData2 = new MemoryStream();
                messageData2.Write(buffer, 4, (int)(packetSize - 4));
                if (incompletePackets.ContainsKey(sender.ToUint64()))
                {
                    messageData2.Position = 0L;
                    messageData2.CopyTo(incompletePackets[sender.ToUint64()]);
                    if (!incomplete)
                    {
                        messageData2 = incompletePackets[sender.ToUint64()];
                        incompletePackets.Remove(sender.ToUint64());
                        messageData2.Position = 0L;
                        onMessage(sender, messageData2);
                    }
                }
                else if (incomplete)
                {
                    messageData2.Position = messageData2.Length;
                    incompletePackets[sender.ToUint64()] = messageData2;
                }
                else
                {
                    messageData2.Position = 0L;
                    onMessage(sender, messageData2);
                }
            }
            List <GalaxyID> disconnectedPeers = new List <GalaxyID>();

            foreach (GalaxyID peer3 in connections.Values)
            {
                if (!lobbyContains(peer3) || ghosts.Contains(peer3.ToUint64()))
                {
                    disconnectedPeers.Add(peer3);
                }
            }
            foreach (GalaxyID peer2 in disconnectedPeers)
            {
                onDisconnect(peer2);
                close(peer2);
            }
        }