예제 #1
0
파일: EvnCenter.cs 프로젝트: yiend/mnncs
 public EvnCenter(SessCtl sessctl)
 {
     this.sesscer = sessctl;
     sessctl.sess_parse += new SessCtl.SessParseDelegate(sessmgr_sess_parse);
     sessctl.sess_delete += new SessCtl.SessDeleteDelegate(sessmgr_sess_delete);
     sessctl.MakeListen(new IPEndPoint(IPAddress.Parse("0.0.0.0"), 2000));
     sessctl.MakeListen(new IPEndPoint(IPAddress.Parse("0.0.0.0"), 3000));
     sessctl.MakeListen(new IPEndPoint(IPAddress.Parse("0.0.0.0"), 3002));
     sessctl.MakeListen(new IPEndPoint(IPAddress.Parse("0.0.0.0"), 3006));
     sessctl.MakeListen(new IPEndPoint(IPAddress.Parse("0.0.0.0"), 3008));
 }
예제 #2
0
파일: CoreBase.cs 프로젝트: yiend/mnncs
        public CoreBase()
        {
            // init timectl
            timectl = new TimeOutCtl();

            // init sessctl
            sessctl = new SessCtl();
            sessctl.sess_parse += new SessCtl.SessDelegate(SessParse);
            sessctl.sess_create += new SessCtl.SessDelegate(SessCreate);
            sessctl.sess_delete += new SessCtl.SessDelegate(SessDelete);

            // init dispatcher
            dispatcher = new DispatcherBase();
        }
예제 #3
0
파일: Dispatcher.cs 프로젝트: yiend/mnncs
        public Dispatcher(SessCtl sessctl)
            : base()
        {
            pack_queue = new Queue<object[]>();
            this.sessctl = sessctl;
            Thread thread = new Thread(() =>
            {
                while (true) {
                    try {
                        object[] pack = null;
                        lock (pack_queue) {
                            if (pack_queue.Count != 0) // Any() is not thread safe
                                pack = pack_queue.Dequeue();
                        }
                        if (pack == null) {
                            Thread.Sleep(1000);
                            continue;
                        }

                        SockRequest request = pack[0] as SockRequest;
                        SockResponse response = pack[1] as SockResponse;
                        base.Handle(request, ref response);
                        if (response.data != null && response.data.Length != 0) {
                            sessctl.BeginInvoke(new Action(() =>
                            {
                                SockSess result = sessctl.FindSession(SockType.accept, null, request.rep);
                                if (result != null)
                                    sessctl.SendSession(result, response.data);
                            }));
                        }
                    } catch (Exception ex) {
                        log4net.ILog log = log4net.LogManager.GetLogger(typeof(Dispatcher));
                        log.Warn("Exception of handling request to modules.", ex);
                    }
                }
            });
            thread.IsBackground = true;
            thread.Start();
        }
예제 #4
0
        private void init()
        {
            // 初始化变量
            sessctl = new SessCtl();
            sessctl.sess_parse += new SessCtl.SessParseDelegate(sessmgr_sess_parse);
            sessctl.sess_delete += new SessCtl.SessDeleteDelegate(sessmgr_sess_delete);
            moduleTable = new ObservableCollection<ModuleUnit>();
            clientTable = new ObservableCollection<ClientUnit>();
            DataContext = new { ModuleTable = moduleTable, ClientTable = clientTable };
            ep = new IPEndPoint(IPAddress.Parse(ConfigurationManager.AppSettings["ip"]),
                int.Parse(ConfigurationManager.AppSettings["port"]));
            tick = DateTime.Now;

            // 加载 DataHandles 文件夹下的所有模块
            string modulePath = System.AppDomain.CurrentDomain.BaseDirectory + @"\Modules";
            if (Directory.Exists(modulePath)) {
                string[] files = Directory.GetFiles(modulePath);
                // Load dll files one by one
                foreach (var item in files) {
                    string str = item.Substring(item.LastIndexOf("\\") + 1);
                    if (str.Contains("Module") && str.ToLower().EndsWith(".dll"))
                        AtModuleLoad(item);
                }
            }

            // 尝试连接中心站
            foreach (var item in moduleTable)
                item.State = SockState.Opening;

            // 启动socket线程
            Thread thread = new Thread(() =>
            {
                while (true) {
                    perform();
                    sessctl.Perform(1000);
                }
            });
            thread.IsBackground = true;
            thread.Start();
        }