/// <summary> /// Stop accepting clients. /// </summary> public void Stop() { if (!isStarted) { return; } usersHandler.Dispose(); mpListener.Stop(); mpListener = null; }
/// <summary> /// Start listen to clients and process connected clients. /// </summary> public async void Start() { #if DEBUG DBoperations.Register("13", "13"); for (int i = 0; i < 10; i++) { string login = "******" + i.ToString(); DBoperations.Register(login, login); } for (int i = 10; i < 20; i++) { string login = "******" + i.ToString(); DBoperations.Register(login, login); DBoperations.SetFriendship(DBoperations.GetUserId(login), DBoperations.GetUserId("13"), false); } for (int i = 20; i < 30; i++) { string login = "******" + i.ToString(); DBoperations.Register(login, login); DBoperations.SetFriendship(DBoperations.GetUserId("13"), DBoperations.GetUserId(login), false); } for (int i = 30; i < 40; i++) { string login = "******" + i.ToString(); DBoperations.Register(login, login); DBoperations.SetFriendship(DBoperations.GetUserId("13"), DBoperations.GetUserId(login), true); } #endif if (isStarted) { return; } if (certificate == null) { return; } mpListener = new MpListener(port, certificate); mpListener.Start(); isStarted = true; log.Info("Server is now listening."); while (true) { try { MpClient client = await mpListener.AcceptMpClientAsync(); Task t = HandleClient(client); activeTasks.Add(t); // remove completed tasks activeTasks.RemoveAll(x => x.IsCompleted); } catch (ConnectionInterruptedException e) { // connection with client broke // nothing critical, just continue log.Error("Connection with client broke.", e); continue; } catch (SocketException e) { log.Error("Socket exception. Trying to restart listening.", e); mpListener.Stop(); mpListener = null; mpListener = new MpListener(port, certificate); mpListener.Start(); continue; } catch (ObjectDisposedException) { // the way we stop server break; } } // wait for finishing process clients Task.WaitAll(activeTasks.ToArray()); log.Info("Server is now stopped listening."); isStarted = false; }