コード例 #1
0
        private void HandleNatIntroductionRequest(NetEndPoint senderEndPoint, NetDataReader dr)
        {
            NetEndPoint localEp = dr.GetNetEndPoint();
            string      token   = dr.GetString(MaxTokenLength);

            lock (_requestEvents)
            {
                _requestEvents.Enqueue(new RequestEventData
                {
                    LocalEndPoint  = localEp,
                    RemoteEndPoint = senderEndPoint,
                    Token          = token
                });
            }
        }
コード例 #2
0
        private void HandleNatIntroduction(NetDataReader dr)
        {
            // read intro
            byte        hostByte       = dr.GetByte();
            NetEndPoint remoteInternal = dr.GetNetEndPoint();
            NetEndPoint remoteExternal = dr.GetNetEndPoint();
            string      token          = dr.GetString(MaxTokenLength);

            NetUtils.DebugWrite(ConsoleColor.Cyan, "[NAT] introduction received; we are designated " + (hostByte == HostByte ? "host" : "client"));
            NetDataWriter writer = new NetDataWriter();

            // send internal punch
            writer.Put(hostByte);
            writer.Put(token);
            _netBase.SendRaw(NetPacket.CreateRawPacket(PacketProperty.NatPunchMessage, writer), remoteInternal);
            NetUtils.DebugWrite(ConsoleColor.Cyan, "[NAT] internal punch sent to " + remoteInternal);

            // send external punch
            writer.Reset();
            writer.Put(hostByte);
            writer.Put(token);
            _netBase.SendRaw(NetPacket.CreateRawPacket(PacketProperty.NatPunchMessage, writer), remoteExternal);
            NetUtils.DebugWrite(ConsoleColor.Cyan, "[NAT] external punch sent to " + remoteExternal);
        }
コード例 #3
0
ファイル: SkirmishSlot.cs プロジェクト: lanyizi/OpenSAGE
        public static SkirmishSlot Deserialize(NetDataReader reader)
        {
            var slot = new SkirmishSlot(reader.GetInt())
            {
                State         = (SkirmishSlotState)reader.GetByte(),
                ColorIndex    = reader.GetSByte(),
                FactionIndex  = reader.GetByte(),
                Team          = reader.GetSByte(),
                StartPosition = reader.GetByte(),
            };

            if (slot.State == SkirmishSlotState.Human)
            {
                slot.ClientId   = reader.GetString();
                slot.PlayerName = reader.GetString();
                slot.EndPoint   = reader.GetNetEndPoint();
            }

            return(slot);
        }
コード例 #4
0
        public static SkirmishSlot Deserialize(NetDataReader reader)
        {
            var slot = new SkirmishSlot()
            {
                Index        = reader.GetInt(),
                State        = (SkirmishSlotState)reader.GetByte(),
                PlayerName   = reader.GetString(),
                ColorIndex   = reader.GetByte(),
                FactionIndex = reader.GetByte(),
                Team         = reader.GetByte(),
                Ready        = reader.GetBool()
            };

            if (slot.State == SkirmishSlotState.Human)
            {
                slot.EndPoint  = reader.GetNetEndPoint();
                slot.ProcessId = reader.GetInt();
            }

            return(slot);
        }
コード例 #5
0
        private static object GetObject(this NetDataReader reader, Type type)
        {
            if (type == null)
            {
                return(null);
            }

            if (type.GetInterface("INetSerializable") != null)
            {
                var result = (INetSerializable)Activator.CreateInstance(type);
                result.Deserialize(reader);
                return(result);
            }
            else if (type.GetInterface("ISyncObject") != null)
            {
                return(reader.GetByte());
            }
            else if (type.IsEnum)
            {
                return(Enum.Parse(type, type.GetEnumName(reader.GetObject(type.GetEnumUnderlyingType()))));
            }
            else if (type == typeof(bool))
            {
                return(reader.GetBool());
            }
            else if (type == typeof(byte))
            {
                return(reader.GetByte());
            }
            else if (type == typeof(sbyte))
            {
                return(reader.GetSByte());
            }
            else if (type == typeof(char))
            {
                return(reader.GetChar());
            }
            else if (type == typeof(short))
            {
                return(reader.GetShort());
            }
            else if (type == typeof(ushort))
            {
                return(reader.GetUShort());
            }
            else if (type == typeof(int))
            {
                return(reader.GetInt());
            }
            else if (type == typeof(uint))
            {
                return(reader.GetUInt());
            }
            else if (type == typeof(long))
            {
                return(reader.GetLong());
            }
            else if (type == typeof(ulong))
            {
                return(reader.GetULong());
            }
            else if (type == typeof(float))
            {
                return(reader.GetFloat());
            }
            else if (type == typeof(double))
            {
                return(reader.GetBool());
            }
            else if (type == typeof(string))
            {
                return(reader.GetDouble());
            }
            else if (type == typeof(IPEndPoint))
            {
                return(reader.GetNetEndPoint());
            }
            else
            {
                throw new Exception("Unable to deserialize object of type " + type);
            }
        }
コード例 #6
0
        private void HandleNatIntroduction(NetDataReader dr)
        {
            // read intro
            byte       hostByte         = dr.GetByte();
            IPEndPoint remoteInternal   = dr.GetNetEndPoint();
            IPEndPoint remoteExternal   = dr.GetNetEndPoint();
            string     token            = dr.GetString(MaxTokenLength);
            IPEndPoint internetExternal = dr.GetNetEndPoint();

            NetDebug.Write(NetLogLevel.Trace, "[NAT] introduction received; we are designated " + (hostByte == HostByte ? "host" : "client"));
            NetDataWriter writer = new NetDataWriter();

            // send internal punch
            writer.Put((byte)PacketProperty.NatPunchMessage);
            writer.Put(hostByte);
            writer.Put(token);
            SocketError errorCode = 0;

            _socket.SendTo(writer.Data, 0, writer.Length, remoteInternal, ref errorCode);
            NetDebug.Write(NetLogLevel.Trace, "[NAT] internal punch sent to " + remoteInternal);

            // send external punch
            writer.Reset();
            writer.Put((byte)PacketProperty.NatPunchMessage);
            writer.Put(hostByte);
            writer.Put(token);
            if (hostByte == HostByte)
            {
                _socket.Ttl = NetConstants.NatPunchHostSocketTTL;
                _socket.SendTo(writer.Data, 0, writer.Length, remoteExternal, ref errorCode);
                _socket.Ttl = NetConstants.SocketTTL;
            }
            else
            {
                _socket.SendTo(writer.Data, 0, writer.Length, remoteExternal, ref errorCode);
            }
            NetDebug.Write(NetLogLevel.Trace, "[NAT] external punch sent to " + remoteExternal);

            // send internet punch if different
            if (!internetExternal.Address.Equals(remoteExternal.Address))
            {
                // update internet port to remote
                internetExternal.Port = remoteExternal.Port;

                writer.Reset();
                writer.Put((byte)PacketProperty.NatPunchMessage);
                writer.Put(hostByte);
                writer.Put(token);
                if (hostByte == HostByte)
                {
                    _socket.Ttl = NetConstants.NatPunchHostSocketTTL;
                    _socket.SendTo(writer.Data, 0, writer.Length, internetExternal, ref errorCode);
                    _socket.Ttl = NetConstants.SocketTTL;
                }
                else
                {
                    _socket.SendTo(writer.Data, 0, writer.Length, internetExternal, ref errorCode);
                }
                NetDebug.Write(NetLogLevel.Trace, "[NAT] internet punch sent to " + internetExternal);
            }
        }