Пример #1
0
        public override void AddToken(IPEndPoint endPoint, uint token,
                                      TokenFlags tokenFlags)
        {
            if (token == TokenHelper.TokenNone)
            {
                return;
            }

            for (var i = 0; i < ConnlessPacketList.Count; i++)
            {
                var info = ConnlessPacketList[i];
                if (info.EndPoint.Compare(endPoint, true))
                {
                    info.SendCallback?.Invoke(info.TrackID, info.CallbackContext);
                    NetworkHelper.SendPacketConnless(Client,
                                                     info.EndPoint, token, TokenManager.GenerateToken(info.EndPoint),
                                                     info.Data, info.DataSize);

                    ConnlessPacketList.RemoveAt(i--);
                }
            }

            if (!tokenFlags.HasFlag(TokenFlags.ResponseOnly))
            {
                TokenCache.Add(new AddressInfo()
                {
                    EndPoint = endPoint,
                    Token    = token,
                    Expiry   = Time.Get() + Time.Freq() * TokenHelper.TokenCacheAddressExpiry
                });
            }
        }
Пример #2
0
        public override void SendPacketConnless(IPEndPoint endPoint, byte[] data,
                                                int dataSize, SendCallbackData callbackData = null)
        {
            var token = GetToken(endPoint);

            if (token != TokenHelper.TokenNone)
            {
                NetworkHelper.SendPacketConnless(Client, endPoint, token,
                                                 TokenManager.GenerateToken(endPoint), data, dataSize);
            }
            else
            {
                FetchToken(endPoint);

                var now  = Time.Get();
                var info = new ConnlessPacketInfo(dataSize)
                {
                    EndPoint         = endPoint,
                    Expiry           = now + Time.Freq() * TokenHelper.TokenCachePacketExpiry,
                    LastTokenRequest = now,
                };

                if (callbackData != null)
                {
                    info.SendCallback    = callbackData.Callback;
                    info.CallbackContext = callbackData.Context;

                    callbackData.TrackID = info.TrackID;
                }
                else
                {
                    info.SendCallback    = null;
                    info.CallbackContext = null;
                }

                Buffer.BlockCopy(data, 0, info.Data, 0, dataSize);
                ConnlessPacketList.Add(info);
            }
        }
Пример #3
0
 public override void FetchToken(IPEndPoint endPoint)
 {
     NetworkHelper.SendConnectionMsgWithToken(Client, endPoint,
                                              TokenHelper.TokenNone, 0, ConnectionMessages.Token,
                                              TokenManager.GenerateToken(endPoint), true);
 }
Пример #4
0
        public override void Send(Chunk packet, uint token      = TokenHelper.TokenNone,
                                  SendCallbackData callbackData = null)
        {
            if (packet.Flags.HasFlag(SendFlags.Connless))
            {
                if (packet.DataSize > NetworkHelper.MaxPayload)
                {
                    Debug.Warning("network", $"packet payload too big, length={packet.DataSize}");
                    return;
                }

                if (packet.ClientId == -1 && Connection.EndPoint != null &&
                    packet.EndPoint.Compare(Connection.EndPoint, true))
                {
                    packet.ClientId = 0;
                }

                if (token != TokenHelper.TokenNone)
                {
                    NetworkHelper.SendPacketConnless(UdpClient, packet.EndPoint,
                                                     token, TokenManager.GenerateToken(packet.EndPoint),
                                                     packet.Data, packet.DataSize);
                }
                else
                {
                    if (packet.ClientId == -1)
                    {
                        TokenCache.SendPacketConnless(packet.EndPoint,
                                                      packet.Data, packet.DataSize, callbackData);
                    }
                    else
                    {
                        Debug.Assert(packet.ClientId == 0, "errornous client id");
                        Connection.SendPacketConnless(packet.Data, packet.DataSize);
                    }
                }
            }
            else
            {
                if (packet.DataSize + NetworkHelper.MaxChunkHeaderSize >= NetworkHelper.MaxPayload)
                {
                    Debug.Warning("network", $"chunk payload too big, length={packet.DataSize} dropping chunk");
                    return;
                }

                Debug.Assert(packet.ClientId == 0, "errornous client id");

                var flags = ChunkFlags.None;
                if (packet.Flags.HasFlag(SendFlags.Vital))
                {
                    flags = ChunkFlags.Vital;
                }

                Connection.QueueChunk(flags, packet.Data, packet.DataSize);

                if (packet.Flags.HasFlag(SendFlags.Flush))
                {
                    Connection.Flush();
                }
            }
        }
Пример #5
0
        public override bool Send(Chunk packet, uint token = TokenHelper.TokenNone)
        {
            if (packet.Flags.HasFlag(SendFlags.Connless))
            {
                if (packet.DataSize >= NetworkHelper.MaxPayload)
                {
                    Debug.Warning("netserver", $"packet payload too big ({packet.DataSize}). dropping packet");
                    return(false);
                }

                if (packet.ClientId == -1)
                {
                    for (var i = 0; i < Connections.Count; i++)
                    {
                        if (Connections[i].State != ConnectionState.Offline &&
                            Connections[i].EndPoint != null &&
                            Connections[i].EndPoint.Compare(packet.EndPoint, comparePorts: true))
                        {
                            packet.ClientId = i;
                            break;
                        }
                    }
                }

                if (token != TokenHelper.TokenNone)
                {
                    NetworkHelper.SendPacketConnless(UdpClient, packet.EndPoint, token,
                                                     TokenManager.GenerateToken(packet.EndPoint), packet.Data, packet.DataSize);
                }
                else
                {
                    if (packet.ClientId == -1)
                    {
                        TokenCache.SendPacketConnless(packet.EndPoint, packet.Data, packet.DataSize);
                    }
                    else
                    {
                        Debug.Assert(packet.ClientId >= 0 &&
                                     packet.ClientId < Connections.Count, "errornous client id");
                        Connections[packet.ClientId].SendPacketConnless(packet.Data, packet.DataSize);
                    }
                }
            }
            else
            {
                if (packet.DataSize + NetworkHelper.MaxChunkHeaderSize >= NetworkHelper.MaxPayload)
                {
                    Debug.Warning("netserver", $"packet payload too big ({packet.DataSize}). dropping packet");
                    return(false);
                }

                Debug.Assert(packet.ClientId >= 0 &&
                             packet.ClientId < Connections.Count, "errornous client id");

                var flags = packet.Flags.HasFlag(SendFlags.Vital)
                    ? ChunkFlags.Vital
                    : ChunkFlags.None;

                if (Connections[packet.ClientId].QueueChunk(flags, packet.Data, packet.DataSize))
                {
                    if (packet.Flags.HasFlag(SendFlags.Flush))
                    {
                        Connections[packet.ClientId].Flush();
                    }
                }
                else
                {
                    Drop(packet.ClientId, "Error sending data");
                }
            }

            return(true);
        }