示例#1
0
        /// <summary>
        /// Called for every new connection request.
        /// </summary>
        /// <param name="ar">The async result containing the server socket</param>
        public void OnConnectRequest(IAsyncResult ar)
        {
            //Init SOCKET
            Socket serverSocket    = (Socket)ar.AsyncState;
            Socket newClientSocket = serverSocket.EndAccept(ar);
            string welcomeMessage  = "Welcome! The Server is Connected!";

            byte[] byteDateLine = System.Text.Encoding.UTF8.GetBytes(welcomeMessage);
            //show message to client and show the connection infos
            string ip = newClientSocket.RemoteEndPoint.ToString();

            _logger(ip + "::connection established:" + DateTime.Now.ToString("G"));
            newClientSocket.Send(byteDateLine, byteDateLine.Length, 0);
            // Buffer messages from the client
            bool          terminated = false;
            MessageBuffer buffer     = new MessageBuffer((string message) => { HandleMetaMessage(newClientSocket, message, out terminated); });

            // Wait for another new client connection
            serverSocket.BeginAccept(new AsyncCallback(OnConnectRequest), serverSocket);
            // Start receiving messages until communication termination
            try
            {
                while (!terminated)
                {
                    // Read the message
                    int    recv       = newClientSocket.Receive(byteDateLine);
                    string stringdata = Encoding.UTF8.GetString(byteDateLine, 0, recv);
                    // Pass message to buffer
                    buffer.SubmitFragment(stringdata);
                }
            }
            catch (SocketException ex)
            {
                try
                {
                    // Log exception
                    _logger(newClientSocket.RemoteEndPoint.ToString() + "::exception:" + ex.Message + ":" + DateTime.Now.ToString("G"));
                    // Try to remove the client
                    bool foundClient = false; ClientType clientType = ClientType.R; int clientID = 0;
                    if (_botClients.Values.Contains(newClientSocket))
                    {
                        foundClient = true; clientType = ClientType.R; clientID = _botClients.First(kvp => kvp.Value == newClientSocket).Key;
                    }
                    if (_controlClients.Values.Contains(newClientSocket))
                    {
                        foundClient = true; clientType = ClientType.C; clientID = _controlClients.First(kvp => kvp.Value == newClientSocket).Key;
                    }
                    if (_iStationClients.Values.Contains(newClientSocket))
                    {
                        foundClient = true; clientType = ClientType.I; clientID = _iStationClients.First(kvp => kvp.Value == newClientSocket).Key;
                    }
                    if (_oStationClients.Values.Contains(newClientSocket))
                    {
                        foundClient = true; clientType = ClientType.O; clientID = _oStationClients.First(kvp => kvp.Value == newClientSocket).Key;
                    }
                    if (foundClient)
                    {
                        RemoveDeadClient(clientType, clientID, newClientSocket);
                    }
                }
                catch (ObjectDisposedException) { _logger(ip + "::exception:" + ex.Message + ":" + DateTime.Now.ToString("G")); }
            }
        }