internal void SendMessage(RoomMessageDefine id, object msg)
 {
     try {
         if (!m_IsConnected)
         {
             return;
         }
         NetOutgoingMessage om = m_NetClient.CreateMessage();
         byte[]             bt = Serialize.Encode(msg, (int)id);
         IncSendMessageCount((int)id, bt.Length);
         om.Write(bt);
         NetSendResult result = m_NetClient.SendMessage(om, NetDeliveryMethod.ReliableOrdered);
         if (result == NetSendResult.FailedNotConnected)
         {
             m_IsConnected    = false;
             m_CanSendMessage = false;
             LogSystem.Info("SendMessage FailedNotConnected");
         }
         else if (result == NetSendResult.Dropped)
         {
             LogSystem.Error("SendMessage {0} Dropped", msg.ToString());
         }
         m_NetClient.FlushSendQueue();
     } catch (Exception ex) {
         LogSystem.Error("NetworkSystem.SendMessage throw Exception:{0}\n{1}", ex.Message, ex.StackTrace);
     }
 }
Пример #2
0
        private NetSendResult Send(Packet packet)
        {
            // Make sure we have a record if the packet
            if (!sendAttempts.ContainsKey(packet))
            {
                sendAttempts[packet] = 0;
            }

            NetSendResult result = Networkmanager.Send(this, packet);

            if (result == NetSendResult.Sent)
            {
                sendAttempts[packet]++;
            }

            // Send it 20 times
            if (sendAttempts[packet] <= 20)
            {
                return(result);
            }

            int sentCount;

            sendAttempts.TryRemove(packet, out sentCount);
            return(result);
        }
Пример #3
0
        public bool SendToServer <T>(T packet, int capacity, NetDeliveryMethod method, int channel) where T : struct, IClientPacket
        {
            if (client == null)
            {
                return(false);
            }

            NetOutgoingMessage msg = client.CreateMessage(capacity);

            msg.Write((byte)packet.Type);
            packet.Write(msg);

#if DEBUG
            if (msg.LengthBytes > capacity)
            {
                Log.Write(LogType.Warning, "Packet " + typeof(T).Name + " has underestimated capacity (" + msg.LengthBytes + "/" + capacity + ")");
            }
#endif

            NetSendResult result = client.SendMessage(msg, method, channel);

#if DEBUG
            uploadPacketBytesLast += msg.LengthBytes;
#endif
#if NETWORK_DEBUG__
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.Write("Debug: ");
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.WriteLine("Send<" + typeof(T).Name + ">  " + msg.LengthBytes + " bytes");
#endif
            return(result == NetSendResult.Sent || result == NetSendResult.Queued);
        }
Пример #4
0
        public override void SendPassword(string password)
        {
            if (!isActive)
            {
                return;
            }

            if (initializationStep != ConnectionInitialization.Password)
            {
                return;
            }
            NetOutgoingMessage outMsg = netClient.CreateMessage();

            outMsg.Write((byte)PacketHeader.IsConnectionInitializationStep);
            outMsg.Write((byte)ConnectionInitialization.Password);
            byte[] saltedPw = ServerSettings.SaltPassword(NetUtility.ComputeSHAHash(Encoding.UTF8.GetBytes(password)), passwordSalt);
            outMsg.Write((byte)saltedPw.Length);
            outMsg.Write(saltedPw, 0, saltedPw.Length);
            NetSendResult result = netClient.SendMessage(outMsg, NetDeliveryMethod.ReliableUnordered);

            if (result != NetSendResult.Queued && result != NetSendResult.Sent)
            {
                DebugConsole.NewMessage("Failed to send " + initializationStep.ToString() + " message to host: " + result);
            }
        }
        protected override void SendMsgInternal(NetworkConnection conn, DeliveryMethod deliveryMethod, IWriteMessage msg)
        {
            LidgrenConnection lidgrenConn           = conn as LidgrenConnection;
            NetDeliveryMethod lidgrenDeliveryMethod = NetDeliveryMethod.Unreliable;

            switch (deliveryMethod)
            {
            case DeliveryMethod.Unreliable:
                lidgrenDeliveryMethod = NetDeliveryMethod.Unreliable;
                break;

            case DeliveryMethod.Reliable:
                lidgrenDeliveryMethod = NetDeliveryMethod.ReliableUnordered;
                break;

            case DeliveryMethod.ReliableOrdered:
                lidgrenDeliveryMethod = NetDeliveryMethod.ReliableOrdered;
                break;
            }

            NetOutgoingMessage lidgrenMsg = netServer.CreateMessage();

            lidgrenMsg.Write(msg.Buffer, 0, msg.LengthBytes);
            NetSendResult result = netServer.SendMessage(lidgrenMsg, lidgrenConn.NetConnection, lidgrenDeliveryMethod);

            if (result != NetSendResult.Sent && result != NetSendResult.Queued)
            {
                DebugConsole.NewMessage("Failed to send message to " + conn.Name + ": " + result.ToString(), Microsoft.Xna.Framework.Color.Yellow);
            }
        }
Пример #6
0
        public void Initialize()
        {
            var serializedUsr = User;

            var peerName = "asteroid";

            Client = new NetClient(new NetPeerConfiguration(peerName)
            {
                EnableUPnP         = true,
                AutoFlushSendQueue = true
            });

            Client.Start();
            Client.Connect(ServerIp, ServerPort);
            NetSendResult res = NetSendResult.FailedNotConnected;

            Messages.Add("Start status");
            //send login
            while (res != NetSendResult.Sent)
            {
                Messages.Add($"Sending.Try Nr:{LoginTries}");
                res = Client.SendMessage
                      (
                    CreateMessage(NetworkCommandConstants.LoginCommand,
                                  serializedUsr),
                    NetDeliveryMethod.Unreliable
                      );

                Messages.Add($"Wait {SecondsToNextLoginTry} seconds...");
                Task.Delay(TimeSpan.FromSeconds(SecondsToNextLoginTry)).Wait();
                LoginTries++;
            }
        }
Пример #7
0
        internal void SendMessage(object msg)
        {
            if (!m_IsConnected)
            {
                return;
            }
            NetOutgoingMessage om = m_NetClient.CreateMessage();

            byte[] bt = Serialize.Encode(msg);
            om.Write(bt);
            NetSendResult result = m_NetClient.SendMessage(om, NetDeliveryMethod.ReliableOrdered);

            if (result == NetSendResult.FailedNotConnected)
            {
                m_IsConnected    = false;
                m_WaitDisconnect = false;
                m_CanSendMessage = false;
                LogSystem.Debug("{0} SendMessage FailedNotConnected {1}", Robot.LobbyNetworkSystem.User, LobbyRobot.Robot.GetDateTime());
            }
            else if (result == NetSendResult.Dropped)
            {
                LogSystem.Error("{0} SendMessage {1} Dropped {2}", Robot.LobbyNetworkSystem.User, msg.ToString(), LobbyRobot.Robot.GetDateTime());
            }
            m_NetClient.FlushSendQueue();
        }
Пример #8
0
        public void SendMsg(string msg)
        {
            NetOutgoingMessage outMsg = this.client.CreateMessage();

            outMsg.Write(msg);
            NetSendResult sendResult = this.client.SendMessage(outMsg, NetDeliveryMethod.ReliableOrdered);
        }
Пример #9
0
        public void SendMessage(object msg)
        {
            try
            {
                if (!m_IsConnected)
                {
                    return;
                }
                NetOutgoingMessage om = m_NetClient.CreateMessage();
                //byte[] bt = ProtoNetSerialize.Encode(msg);
                byte[] bt = new byte[10];
                om.Write(bt);
                NetSendResult result = m_NetClient.SendMessage(om, NetDeliveryMethod.ReliableOrdered);
                if (result == NetSendResult.FailedNotConnected)
                {
                    m_IsConnected    = false;
                    m_CanSendMessage = false;
                }
                else if (result == NetSendResult.Dropped)
                {
                }
                m_NetClient.FlushSendQueue();
            }
#pragma warning disable CS0168 // The variable 'ex' is declared but never used
            catch (Exception ex)
#pragma warning restore CS0168 // The variable 'ex' is declared but never used
            {
            }
        }
Пример #10
0
        public bool ResSend(NetConnection connection, Int16 ret, String ret_message, String to_id)
        {
            if (peer == null || connection == null)
            {
                return(false);
            }
            if (peer.ConnectionsCount < 1 ||
                connection.Status != NetConnectionStatus.Connected)
            {
                return(false);
            }
            NetOutgoingMessage om = peer.CreateMessage();

            om.Write((UInt32)203);
            om.Write(ret);
            om.Write(ret_message);
            om.Write(to_id);
            NetSendResult result = peer.SendMessage(om, connection,
                                                    NetDeliveryMethod.ReliableOrdered);

            if (result == NetSendResult.FailedNotConnected ||
                result == NetSendResult.Dropped)
            {
                return(false);
            }

            peer.FlushSendQueue();
            return(true);
        }
Пример #11
0
        private void HandleStatusChanged(NetIncomingMessage inc)
        {
            if (netServer == null)
            {
                return;
            }

            DebugConsole.NewMessage(inc.SenderConnection.Status.ToString());

            switch (inc.SenderConnection.Status)
            {
            case NetConnectionStatus.Connected:
                NetOutgoingMessage outMsg = netServer.CreateMessage();
                outMsg.Write(OwnerSteamID);
                outMsg.Write((byte)(PacketHeader.IsConnectionInitializationStep | PacketHeader.IsServerMessage));
                NetSendResult result = netServer.SendMessage(outMsg, netConnection, NetDeliveryMethod.ReliableUnordered);
                if (result != NetSendResult.Sent && result != NetSendResult.Queued)
                {
                    DebugConsole.NewMessage("Failed to send connection confirmation message to owner: " + result.ToString(), Microsoft.Xna.Framework.Color.Yellow);
                }
                break;

            case NetConnectionStatus.Disconnected:
                DebugConsole.NewMessage("Owner disconnected: closing the server...");
                GameServer.Log("Owner disconnected: closing the server...", ServerLog.MessageType.ServerMessage);
                Close(DisconnectReason.ServerShutdown.ToString() + "/ Owner disconnected");
                break;
            }
        }
Пример #12
0
        /// <summary>
        /// Send a message to a list of connections
        /// </summary>
        /// <param name="msg">The message to send</param>
        /// <param name="recipients">The list of recipients to send to</param>
        /// <param name="method">How to deliver the message</param>
        /// <param name="sequenceChannel">Sequence channel within the delivery method</param>
        /// <param name="except">Connection where message should not be sent, optional</param>
        public void SendMessage(NetOutgoingMessage msg, List <NetConnection> recipients, NetDeliveryMethod method, int sequenceChannel, NetConnection except = null)
        {
            if (msg == null)
            {
                throw new ArgumentNullException("msg");
            }
            if (recipients == null)
            {
                throw new ArgumentNullException("recipients");
            }
            if (recipients.Count < 1)
            {
                throw new NetException("recipients must contain at least one item");
            }
            if (method == NetDeliveryMethod.Unreliable || method == NetDeliveryMethod.ReliableUnordered)
            {
                NetException.Assert(sequenceChannel == 0, "Delivery method " + method + " cannot use sequence channels other than 0!");
            }
            if (msg.m_isSent)
            {
                throw new NetException("This message has already been sent! Use NetPeer.SendMessage() to send to multiple recipients efficiently");
            }

            int mtu = GetMTU(recipients);

            msg.m_isSent = true;

            int len = msg.GetEncodedSize();

            if (len <= mtu)
            {
                Interlocked.Add(ref msg.m_recyclingCount, except != null ? recipients.Count - 1 : recipients.Count);
                foreach (NetConnection conn in recipients)
                {
                    if (except != null && conn.RemoteUniqueIdentifier == except.RemoteUniqueIdentifier)
                    {
                        continue;
                    }

                    if (conn == null)
                    {
                        Interlocked.Decrement(ref msg.m_recyclingCount);
                        continue;
                    }
                    NetSendResult res = conn.EnqueueMessage(msg, method, sequenceChannel);
                    if (res != NetSendResult.Queued && res != NetSendResult.Sent)
                    {
                        Interlocked.Decrement(ref msg.m_recyclingCount);
                    }
                }
            }
            else
            {
                // message must be fragmented!
                SendFragmentedMessage(msg, recipients, method, sequenceChannel, except);
            }

            return;
        }
Пример #13
0
        private void SendTo(NetConnection conn, NetDeliveryMethod channel, byte[] data, int len, int channelSequence)
        {
            NetOutgoingMessage msg = this._lidgrenPeer.CreateMessage(data.Length);

            Buffer.BlockCopy(data, 0, msg.Data, 0, len);
            msg.LengthBytes = len;
            NetSendResult result = this._lidgrenPeer.SendMessage(msg, conn, channel, channelSequence);
        }
Пример #14
0
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            Application.Quit();
        }

        NetIncomingMessage message;

        while ((message = peer.ReadMessage()) != null)
        {
            switch (message.MessageType)
            {
            case NetIncomingMessageType.Data:
                break;

            case NetIncomingMessageType.StatusChanged:
                NetConnectionStatus status = (NetConnectionStatus)message.ReadByte();
                Debug.Log("status " + status);
                switch (status)
                {
                case NetConnectionStatus.Connected:
                    Vector3    spawnPosition = Vector3.zero;
                    Quaternion spawnRotation = Quaternion.identity;

                    MyNetwork.SpawnPlayer(spawnPosition, spawnRotation);
                    NetOutgoingMessage newMessage = peer.CreateMessage();
                    newMessage.Write((byte)NetDataType.SPAWN_PLAYER);
                    newMessage.Write(spawnPosition);
                    newMessage.Write(spawnRotation);

                    NetSendResult result = peer.SendMessage(newMessage, message.SenderConnection, NetDeliveryMethod.ReliableUnordered);
                    Debug.Log("sent: " + result);
                    break;
                }
                break;

            case NetIncomingMessageType.WarningMessage:
                Debug.LogWarning(message.ReadString());
                break;

            case NetIncomingMessageType.DebugMessage:
                Debug.Log(message.ReadString());
                break;

            case NetIncomingMessageType.ConnectionApproval:
            {
                // TODO: Store connections
                message.SenderConnection.Approve();
                break;
            }

            default:
                print("unhandled message with type: " + message.MessageType);
                break;
            }
        }
    }
Пример #15
0
        /// <summary>
        /// Send a message to a list of connections.
        /// </summary>
        /// <param name="message">The message to send</param>
        /// <param name="recipients">The list of recipients to send to</param>
        /// <param name="method">How to deliver the message</param>
        /// <param name="sequenceChannel">Sequence channel within the delivery method</param>
        public NetSendResult SendMessage(
            NetOutgoingMessage message,
            IEnumerable <NetConnection?> recipients,
            NetDeliveryMethod method,
            int sequenceChannel)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            if (recipients == null)
            {
                throw new ArgumentNullException(nameof(recipients));
            }

            NetConstants.AssertValidDeliveryChannel(
                method, sequenceChannel, nameof(method), nameof(sequenceChannel));

            message.AssertNotSent(nameof(message));
            message._isSent = true;

            int mtu = GetMTU(recipients, out int recipientCount);

            if (recipientCount == 0)
            {
                Recycle(message);
                return(NetSendResult.NoRecipients);
            }

            int length = message.GetEncodedSize();

            if (length <= mtu)
            {
                Interlocked.Add(ref message._recyclingCount, recipientCount);

                var retval = NetSendResult.Sent;
                foreach (NetConnection?conn in recipients.AsListEnumerator())
                {
                    if (conn == null)
                    {
                        continue;
                    }

                    NetSendResult result = conn.EnqueueMessage(message, method, sequenceChannel).Result;
                    if (result > retval)
                    {
                        retval = result; // return "worst" result
                    }
                }
                return(retval);
            }
            else
            {
                // message must be fragmented!
                return(SendFragmentedMessage(message, recipients, method, sequenceChannel));
            }
        }
Пример #16
0
        public void Send(NetClient nc)
        {
            var message = nc.CreateMessage();

            message.Write("This is a test");

            NetSendResult sr = nc.SendMessage(message, NetDeliveryMethod.ReliableOrdered);

            Console.WriteLine(sr.ToString());
            Console.ReadKey();
        }
Пример #17
0
        public void SendMsg(string msg, NetConnection clientConnection)
        {
            NetOutgoingMessage outMsg = this.server.CreateMessage();

            outMsg.Write(msg);

            if (clientConnection != null)
            {
                NetSendResult sendResult = this.server.SendMessage(outMsg, clientConnection, NetDeliveryMethod.ReliableOrdered);
            }
        }
Пример #18
0
        public override void Send(IWriteMessage msg, NetworkConnection conn, DeliveryMethod deliveryMethod)
        {
            if (netServer == null)
            {
                return;
            }

            if (!(conn is SteamP2PConnection steamp2pConn))
            {
                return;
            }
            if (!connectedClients.Contains(steamp2pConn) && conn != OwnerConnection)
            {
                DebugConsole.ThrowError("Tried to send message to unauthenticated connection: " + steamp2pConn.SteamID.ToString());
                return;
            }

            NetDeliveryMethod lidgrenDeliveryMethod = NetDeliveryMethod.Unreliable;

            switch (deliveryMethod)
            {
            case DeliveryMethod.Unreliable:
                lidgrenDeliveryMethod = NetDeliveryMethod.Unreliable;
                break;

            case DeliveryMethod.Reliable:
                lidgrenDeliveryMethod = NetDeliveryMethod.ReliableUnordered;
                break;

            case DeliveryMethod.ReliableOrdered:
                lidgrenDeliveryMethod = NetDeliveryMethod.ReliableOrdered;
                break;
            }
#if DEBUG
            netPeerConfiguration.SimulatedDuplicatesChance = GameMain.Server.SimulatedDuplicatesChance;
            netPeerConfiguration.SimulatedMinimumLatency   = GameMain.Server.SimulatedMinimumLatency;
            netPeerConfiguration.SimulatedRandomLatency    = GameMain.Server.SimulatedRandomLatency;
            netPeerConfiguration.SimulatedLoss             = GameMain.Server.SimulatedLoss;
#endif
            NetOutgoingMessage lidgrenMsg = netServer.CreateMessage();
            byte[]             msgData    = new byte[msg.LengthBytes];
            msg.PrepareForSending(ref msgData, out bool isCompressed, out int length);
            lidgrenMsg.Write(conn.SteamID);
            lidgrenMsg.Write((byte)((isCompressed ? PacketHeader.IsCompressed : PacketHeader.None) | PacketHeader.IsServerMessage));
            lidgrenMsg.Write((UInt16)length);
            lidgrenMsg.Write(msgData, 0, length);

            NetSendResult result = netServer.SendMessage(lidgrenMsg, netConnection, lidgrenDeliveryMethod);
            if (result != NetSendResult.Sent && result != NetSendResult.Queued)
            {
                DebugConsole.NewMessage("Failed to send message to " + conn.Name + ": " + result.ToString(), Microsoft.Xna.Framework.Color.Yellow);
            }
        }
        public void TryLogin(string peerName, string serverIp, int port, string username, string password, int trySecondsInterval = 1)
        {
            if (Feeding)
            {
                return;
            }
            Client = new NetClient(new NetPeerConfiguration(peerName)
            {
                EnableUPnP         = true,
                AutoFlushSendQueue = true
            });
            Client.Start();
            Client.Connect(serverIp, port);
            NetSendResult res      = NetSendResult.FailedNotConnected;
            var           userData = new UserData()
            {
                Username = username, Password = password
            };
            //var serializedUsr = JsonConvert.SerializeObject(userData);

            //send login
            int loginTries      = 1;
            int secondsLoginTry = trySecondsInterval;

            while (res != NetSendResult.Sent)
            {
                Console.WriteLine($"Sending.Try Nr:{loginTries}");
                res = Client.SendMessage
                      (
                    CreateMessage(NetworkCommandConstants.LoginCommand,
                                  userData),
                    NetDeliveryMethod.Unreliable
                      );

                Console.WriteLine($"Wait {secondsLoginTry} seconds...");
                Task.Delay(TimeSpan.FromSeconds(secondsLoginTry)).Wait();
                loginTries++;
            }


            Thread feedThread = new Thread(() => {
                while (true)
                {
                    Feed();
                }
            })
            {
                IsBackground = true
            };

            feedThread.Start();
        }
Пример #20
0
        protected override void SendMsgInternal(DeliveryMethod deliveryMethod, IWriteMessage msg)
        {
            NetOutgoingMessage lidgrenMsg = netClient.CreateMessage();

            lidgrenMsg.Write(msg.Buffer, 0, msg.LengthBytes);

            NetSendResult result = netClient.SendMessage(lidgrenMsg, NetDeliveryMethod.ReliableUnordered);

            if (result != NetSendResult.Queued && result != NetSendResult.Sent)
            {
                DebugConsole.NewMessage("Failed to send message to host: " + result + "\n" + Environment.StackTrace);
            }
        }
Пример #21
0
        /// <summary>
        /// Send a message to a list of connections
        /// </summary>
        /// <param name="msg">The message to send</param>
        /// <param name="recipients">The list of recipients to send to</param>
        /// <param name="method">How to deliver the message</param>
        /// <param name="sequenceChannel">Sequence channel within the delivery method</param>
        public void SendMessage(NetOutgoingMessage msg, IList <NetConnection> recipients, NetDeliveryMethod method, int sequenceChannel)
        {
            if (msg == null)
            {
                throw new ArgumentNullException("msg");
            }
            if (recipients == null)
            {
                throw new ArgumentNullException("recipients");
            }
            if (method == NetDeliveryMethod.Unreliable || method == NetDeliveryMethod.ReliableUnordered)
            {
                NetException.Assert(sequenceChannel == 0, "Delivery method " + method + " cannot use sequence channels other than 0!");
            }
            if (msg.m_isSent)
            {
                throw new NetException("This message has already been sent! Use NetPeer.SendMessage() to send to multiple recipients efficiently");
            }

            int mtu = GetMTU(recipients);

            msg.m_isSent = true;

            int len = msg.LengthBytes;

            if (len <= m_configuration.MaximumTransmissionUnit)
            {
                Interlocked.Add(ref msg.m_recyclingCount, recipients.Count);
                foreach (NetConnection conn in recipients)
                {
                    if (conn == null)
                    {
                        Interlocked.Decrement(ref msg.m_recyclingCount);
                        continue;
                    }
                    NetSendResult res = conn.EnqueueMessage(msg, method, sequenceChannel);
                    if (res == NetSendResult.Dropped)
                    {
                        LogDebug(msg + " dropped immediately due to full queues");
                        Interlocked.Decrement(ref msg.m_recyclingCount);
                    }
                }
            }
            else
            {
                // message must be fragmented!
                SendFragmentedMessage(msg, recipients, method, sequenceChannel);
            }

            return;
        }
Пример #22
0
        public void FlushQueue()
        {
            // Try to send all packets
            foreach (Packet packet in sendAttempts.Keys)
            {
                NetSendResult result = Send(packet);

                // Exit if we can't send a packet
                if (result != NetSendResult.Sent)
                {
                    break;
                }
            }
        }
Пример #23
0
        public override void Send(IWriteMessage msg, NetworkConnection conn, DeliveryMethod deliveryMethod)
        {
            if (netServer == null)
            {
                return;
            }

            if (!(conn is LidgrenConnection lidgrenConn))
            {
                return;
            }
            if (!connectedClients.Contains(lidgrenConn))
            {
                DebugConsole.ThrowError("Tried to send message to unauthenticated connection: " + lidgrenConn.IPString);
                return;
            }

            NetDeliveryMethod lidgrenDeliveryMethod = NetDeliveryMethod.Unreliable;

            switch (deliveryMethod)
            {
            case DeliveryMethod.Unreliable:
                lidgrenDeliveryMethod = NetDeliveryMethod.Unreliable;
                break;

            case DeliveryMethod.Reliable:
                lidgrenDeliveryMethod = NetDeliveryMethod.ReliableUnordered;
                break;

            case DeliveryMethod.ReliableOrdered:
                lidgrenDeliveryMethod = NetDeliveryMethod.ReliableOrdered;
                break;
            }

            NetOutgoingMessage lidgrenMsg = netServer.CreateMessage();

            byte[] msgData = new byte[msg.LengthBytes];
            msg.PrepareForSending(ref msgData, out bool isCompressed, out int length);
            lidgrenMsg.Write((byte)(isCompressed ? PacketHeader.IsCompressed : PacketHeader.None));
            lidgrenMsg.Write((UInt16)length);
            lidgrenMsg.Write(msgData, 0, length);

            NetSendResult result = netServer.SendMessage(lidgrenMsg, lidgrenConn.NetConnection, lidgrenDeliveryMethod);

            if (result != NetSendResult.Sent && result != NetSendResult.Queued)
            {
                DebugConsole.NewMessage("Failed to send message to " + conn.Name + ": " + result.ToString(), Microsoft.Xna.Framework.Color.Yellow);
            }
        }
Пример #24
0
        public static bool Send <T>(T packet, int capacity, NetConnection recipient, NetDeliveryMethod method, int channel) where T : struct, IServerPacket
        {
            NetOutgoingMessage msg = server.CreateMessage(capacity);

            msg.Write((byte)packet.Type);
            packet.Write(msg);
            NetSendResult result = server.Send(msg, recipient, method, channel);

#if DEBUG__
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.Write("Debug: ");
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.WriteLine("Send<" + typeof(T).Name + ">  " + msg.LengthBytes + " bytes");
#endif
            return(result == NetSendResult.Sent || result == NetSendResult.Queued);
        }
Пример #25
0
 internal void SendPeerMessage(RoomPeer peer, RoomMessageDefine id, object msg)
 {
     try {
         NetOutgoingMessage om = m_NetServer.CreateMessage();
         om.Write(Serialize.Encode(msg, (int)id));
         if (null != peer.GetConnection())
         {
             NetSendResult res = m_NetServer.SendMessage(om, peer.GetConnection(), NetDeliveryMethod.ReliableOrdered, 0);
             if (res == NetSendResult.Dropped)
             {
                 LogSys.Log(LOG_TYPE.ERROR, "SendPeerMessage {0} failed:dropped, User:{1}({2})", msg.ToString(), peer.Guid, peer.GetKey());
             }
         }
     } catch (Exception ex) {
         LogSys.Log(LOG_TYPE.ERROR, "Exception {0}\n{1}", ex.Message, ex.StackTrace);
     }
 }
Пример #26
0
        public override void Send(IWriteMessage msg, DeliveryMethod deliveryMethod)
        {
            if (!isActive)
            {
                return;
            }

            NetDeliveryMethod lidgrenDeliveryMethod = NetDeliveryMethod.Unreliable;

            switch (deliveryMethod)
            {
            case DeliveryMethod.Unreliable:
                lidgrenDeliveryMethod = NetDeliveryMethod.Unreliable;
                break;

            case DeliveryMethod.Reliable:
                lidgrenDeliveryMethod = NetDeliveryMethod.ReliableUnordered;
                break;

            case DeliveryMethod.ReliableOrdered:
                lidgrenDeliveryMethod = NetDeliveryMethod.ReliableOrdered;
                break;
            }

            NetOutgoingMessage lidgrenMsg = netClient.CreateMessage();

            byte[] msgData = new byte[msg.LengthBytes];
            msg.PrepareForSending(ref msgData, out bool isCompressed, out int length);
            lidgrenMsg.Write(selfSteamID);
            lidgrenMsg.Write((byte)(isCompressed ? PacketHeader.IsCompressed : PacketHeader.None));
            lidgrenMsg.Write((UInt16)length);
            lidgrenMsg.Write(msgData, 0, length);

#if DEBUG
            netPeerConfiguration.SimulatedDuplicatesChance = GameMain.Client.SimulatedDuplicatesChance;
            netPeerConfiguration.SimulatedMinimumLatency   = GameMain.Client.SimulatedMinimumLatency;
            netPeerConfiguration.SimulatedRandomLatency    = GameMain.Client.SimulatedRandomLatency;
            netPeerConfiguration.SimulatedLoss             = GameMain.Client.SimulatedLoss;
#endif
            NetSendResult result = netClient.SendMessage(lidgrenMsg, lidgrenDeliveryMethod);
            if (result != NetSendResult.Queued && result != NetSendResult.Sent)
            {
                DebugConsole.NewMessage("Failed to send own message to host: " + result);
            }
        }
        public void Send(Message msg)
        {
            NetOutgoingMessage packet = _connection.Peer.CreateMessage();

            lock (_globalLock)
            {
                _stream.Position = 0;
                msg.Serialize(_writer);

                int numBytes = (int)_stream.Position;
                packet.Write(numBytes);
                packet.Write(_buffer, 0, numBytes);
                NetSendResult result = _connection.SendMessage(packet, Convert(msg.Reliability), 0);

                if (result == NetSendResult.FailedNotConnected)
                {
                    throw new Exception("NetSendResult.FailedNotConnected");
                }
            }
        }
Пример #28
0
        /// <summary>
        /// This translates <see cref="NetSendResult"/> to GladNet <see cref="SendResult"/>
        /// Information related to this translation can be found here https://code.google.com/p/lidgren-network-gen3/wiki/Basics
        /// </summary>
        /// <param name="result">The value to be used for translation.</param>
        /// <exception cref="ArgumentException">Throws an exception if the <see cref="NetSendResult"/> is undefined.</exception>
        /// <returns>The equivalent <see cref="SendResult"/> for the given <see cref="NetSendResult"/> value.</returns>
        public static SendResult ToGladNet(this NetSendResult result)
        {
            switch (result)
            {
            case NetSendResult.FailedNotConnected:
                return(SendResult.FailedNotConnected);

            case NetSendResult.Sent:
                return(SendResult.Sent);

            case NetSendResult.Queued:
                return(SendResult.Queued);

            case NetSendResult.Dropped:
                return(SendResult.Invalid);

            default:
                throw new InvalidOperationException($"Failed to map {nameof(NetSendResult)} value: {result} to GladnEt {nameof(SendResult)}.");
            }
        }
Пример #29
0
        public static void SendStringToUniqueID(Scene scene, string message, long UniqueID, MessageType type)
        {
            MessageTemplate temp = new MessageTemplate(message, type);

            NetOutgoingMessage mvmntMessage = ServerNetworkSceneComponent.GetNetServer().CreateMessage(Newtonsoft.Json.JsonConvert.SerializeObject(temp));
            var connections = ServerNetworkSceneComponent.GetNetServer().Connections;

            NetConnection reciever = connections.Find(c => c.RemoteUniqueIdentifier.Equals(UniqueID));

            if (reciever != null)
            {
                NetSendResult result = reciever.SendMessage(mvmntMessage, NetDeliveryMethod.ReliableUnordered, 1);
                int           size;
                int           free;
                reciever.GetSendQueueInfo(NetDeliveryMethod.ReliableUnordered, 1, out size, out free);
                if (free < -size)
                {
                    DisconnectConnection(reciever, scene);
                }
            }
        }
Пример #30
0
        private void OnAuthChange(ulong steamID, ulong ownerID, ClientAuthStatus status)
        {
            RemotePeer remotePeer = remotePeers.Find(p => p.SteamID == steamID);

            DebugConsole.Log(steamID + " validation: " + status + ", " + (remotePeer != null));

            if (remotePeer == null)
            {
                return;
            }

            if (remotePeer.Authenticated)
            {
                if (status != ClientAuthStatus.OK)
                {
                    DisconnectPeer(remotePeer, DisconnectReason.SteamAuthenticationFailed.ToString() + "/ Steam authentication status changed: " + status.ToString());
                }
                return;
            }

            if (status == ClientAuthStatus.OK)
            {
                remotePeer.Authenticated  = true;
                remotePeer.Authenticating = false;
                foreach (var msg in remotePeer.UnauthedMessages)
                {
                    NetSendResult result = netClient.SendMessage(msg.Second, msg.First);
                    if (result != NetSendResult.Queued && result != NetSendResult.Sent)
                    {
                        DebugConsole.NewMessage("Failed to send unauthed message to host: " + result);
                    }
                }
                remotePeer.UnauthedMessages.Clear();
            }
            else
            {
                DisconnectPeer(remotePeer, DisconnectReason.SteamAuthenticationFailed.ToString() + "/ Steam authentication failed: " + status.ToString());
                return;
            }
        }