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); } }
/* 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); }
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)); }
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; } } }
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); } } }
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); } }