コード例 #1
0
        public void ConnectToLoginServer(string server = null)
        {
            if (!string.IsNullOrEmpty(server))
            {
                Server = server;
            }

            if (string.IsNullOrEmpty(Server))
            {
                throw new ArgumentException("OwnerServer");
            }

            if (Session == null)
            {
                Session = new Session();
            }


            var addr = Dns.GetHostAddresses(Server);

            if (addr.Length == 0)
            {
                _logger.Error("Failed to resolve '{0}' to an ipaddress", Server);
                return;
            }


            _socket       = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            _socketReader = new SocketReader(Session, _socket);
            _socketWriter = new SocketWriter(Session, _socket);

            var ip = addr.First();

            _logger.Trace("resolved {0} to '{1}'", ip, Server);

            var endpoint = new IPEndPoint(ip, 44453);

            _socketReader.MaxMessageSize = 496;
            Session.Command = SessionCommand.Connect;

            _socket.Connect(endpoint);
            _socketReader.Start().WaitOne(Timeout);
            _socketWriter.Start().WaitOne(Timeout);


            var timeout = DateTime.Now.AddMilliseconds(Timeout);

            while (Session.Status != SessionStatus.Connected && Session.Status != SessionStatus.Error)
            {
                if (timeout <= DateTime.Now)
                {
                    throw new TimeoutException("Timeout waiting for server conenction");
                }
                Thread.Sleep(Timeout / 10);
            }
        }
コード例 #2
0
        protected void ParseData(IFFFile.Node node, ITemplateRepository repo, Action <IFFFile.Node, ITemplateRepository> parseDataAction, LogAbstraction.ILogger logger, Action <IFFFile.Node, ITemplateRepository> parseDerveAction = null, bool parseNext = true)
        {
            if (parseDerveAction == null)
            {
                parseDerveAction = ParseDerv;
            }

            var derv = node.FindSubNode("DERV");

            if (derv != null)
            {
                parseDerveAction(node, repo);
            }

            var nextNode = derv != null?derv.FindNextSibling() : node.Children.FirstOrDefault();

            if (nextNode == null)
            {
                _Logger.Trace("unable to locate next node for node {0}", node.Type);
                return;
            }

            var sizeNode = nextNode.FindSubNode("PCNT", true);

            if (sizeNode == null || nextNode.Children == null)
            {
                logger.Trace("Unable to locate PCNT node or its parent for node {0}", node.Type);
                return;
            }

            var nodeList = nextNode.Children.ToList();
            var size     = sizeNode.Data.ReadInt32();

            if (size == 0 || size != nodeList.Count - 1)
            {
                return;
            }

            for (int i = 0; i < size; i++)
            {
                switch (nodeList[i].Type)
                {
                case "PCNT":
                    continue;

                case "XXXX":
                    parseDataAction(nodeList[i], repo);
                    break;

                case "DERV":
                    parseDerveAction(nodeList[i], repo);
                    break;

                default:
                    logger.Warn("Invalid node type {0}", nodeList[i].Type);
                    break;
                }
            }

            nextNode = nextNode.FindNextSibling();

            if (parseNext && nextNode != null)
            {
                ReadNode(nextNode, repo);
            }
        }
コード例 #3
0
ファイル: ObjectGraph.cs プロジェクト: LunAnder/swgemu.client
        protected override void DoWork()
        {
            if (Session == null)
            {
                return;
            }

            while (Session.IncomingMessageQueue.Count > 0)
            {
                Message msg;

                if (!Session.IncomingMessageQueue.TryDequeue(out msg))
                {
                    continue;
                }

                Message transformed;
                IMessageParseFactory factory;
                if (!MessageFactories.TryGetValue(msg.MessageOpCode, out factory) || !factory.TryParse(msg.MessageOpCode, msg, out transformed))
                {
                    if (!FallbackFactory.TryParse(msg.MessageOpCode, msg, out transformed))
                    {
                        long tmpVal;
                        if (long.TryParse(msg.MessageOpCodeEnum.ToString(), out tmpVal))
                        {
                            _msgLogger.Trace(BitConverter.ToString(msg.Data).Replace("-", ""));
                            _msgLogger.Trace("{0}", msg.OpcodeCount);
                            _msgLogger.Trace("{0}", msg.SourcePacketType);
                        }
                        continue;
                    }
                }

                Messages.Add(transformed);


                //Func<Message, Message> createFunc = null;
                //Message transformed = null;
                //if (RegisteredObjects.TryGetValue(msg.MessageOpCode, out createFunc) &&
                //    (transformed = createFunc(msg)) != null)
                //{
                //    Messages.Add(transformed);

                SceneCreateObject obj = transformed as SceneCreateObject;
                if (obj != null)
                {
                    string objToCreate = null;
                    if (_crcMap.TryGetValue((uint)obj.ObjectCRC, out objToCreate))
                    {
                        _creatObjlogger.Debug("create obj {0}", objToCreate);
                    }
                }

                if (msg.MessageOpCodeEnum == MessageOp.CmdStartScene)
                {
                    _logger.Info("Got scene start! Trn: {0}", ((SceneStart)transformed).TerrainMap);
                }
                //}
                //else
                //{
                //    _logger.Warn("Unable to find registered message factory for {0}({1:X})", msg.MessageOpCodeEnum, msg.MessageOpCode);
                //}
            }

            Thread.Sleep(300);
        }