Пример #1
0
        /// <summary>
        /// Accepts incoming connection.
        /// </summary>
        /// <param name="acceptConnectionInformationAsObject">Information about the connection being accepted.</param>
        public void AcceptConnection(object acceptConnectionInformationAsObject)
        {
            AcceptConnectionInformation acceptConnectionInformation = (AcceptConnectionInformation)acceptConnectionInformationAsObject;

            try
            {
                this.SharedMemoryConnectionManager.Connection_AcceptConnection(acceptConnectionInformation.ShareName, acceptConnectionInformation.ProtocolVersion);
            }
            catch (Exception ex)
            {
                this.ITransportContext.BinaryLogWriter.WriteEvent(LogCategory.Connection, "SMAcceptConnectionClosure.AcceptConnection",
                                                                  LogMessageType.ConnectionAccepting, ex, null, null, null,
                                                                  GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name,
                                                                  null, null, -1, 0, 0, 0, null, null, null, null,
                                                                  "The connection to {0} has been refused due to the exception.", acceptConnectionInformation.ShareName);

                this.SharedMemoryConnectionManager.ITransportContext.IGenuineEventProvider.Fire(new GenuineEventArgs(GenuineEventType.GeneralListenerFailure, ex, null, acceptConnectionInformation.ShareName));
            }
        }
Пример #2
0
        /// <summary>
        /// Accepts incoming connections.
        /// </summary>
        public void AcceptConnections()
        {
            BinaryLogWriter       binaryLogWriter = this.ITransportContext.BinaryLogWriter;
            byte                  protocolVersion;
            GenuineConnectionType genuineConnectionType;

            try
            {
                IParameterProvider parameters = this.ITransportContext.IParameterProvider;

                string mutexName = GenuineSharedMemoryChannel.ConstructSharedObjectName(
                    "MUTEX" + this.ShareName, parameters);
                string clientConnected = GenuineSharedMemoryChannel.ConstructSharedObjectName(
                    "CC" + this.ShareName, parameters);
                string clientAccepted = GenuineSharedMemoryChannel.ConstructSharedObjectName(
                    "CA" + this.ShareName, parameters);

                this._mutex = WindowsAPI.CreateMutex(mutexName);

                this._clientConnectedEvent = NamedEvent.CreateNamedEvent(clientConnected, false, false);
                this._clientAcceptedEvent  = NamedEvent.CreateNamedEvent(clientAccepted, false, true);
                WaitHandle[] handles = new WaitHandle[2] {
                    this._clientConnectedEvent.ManualResetEvent, this.StopListening
                };

                for ( ; ;)
                {
                    try
                    {
                        // listen
                        WaitHandle.WaitAny(handles);

                        // if shutting down
                        if (this.StopListening.WaitOne(0, false))
                        {
                            return;
                        }

                        // set timeout
                        int timeout = GenuineUtility.GetTimeout((TimeSpan)this.ITransportContext.IParameterProvider[GenuineParameter.ConnectTimeout]);

                        // client is connecting
                        using (Stream headerStream = this.SharedMemoryConnection.LowLevel_ReadSync(timeout))
                        {
                            BinaryReader binaryReader = new BinaryReader(headerStream);
                            string       connectionId;
                            MessageCoder.DeserializeConnectionHeader(binaryReader, out protocolVersion, out genuineConnectionType, out connectionId);
                            string shareName = binaryReader.ReadString();
                            this._clientAcceptedEvent.ManualResetEvent.Set();

                            // LOG:
                            if (binaryLogWriter != null && binaryLogWriter[LogCategory.AcceptingConnection] > 0)
                            {
                                binaryLogWriter.WriteEvent(LogCategory.AcceptingConnection, "SMAcceptConnectionClosure.AcceptConnections",
                                                           LogMessageType.ConnectionAccepting, null, null, null, null,
                                                           GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name,
                                                           null, null, -1, 0, 0, 0, null, null, null, null,
                                                           "An inbound Shared Memory connection is being accepted.");
                            }

                            AcceptConnectionInformation acceptConnectionInformation = new AcceptConnectionInformation();
                            acceptConnectionInformation.ShareName       = shareName;
                            acceptConnectionInformation.ProtocolVersion = protocolVersion;
                            GenuineThreadPool.QueueUserWorkItem(new WaitCallback(this.AcceptConnection), acceptConnectionInformation, true);
                        }
                    }
                    catch (Exception ex)
                    {
                        // LOG:
                        if (binaryLogWriter != null && binaryLogWriter[LogCategory.AcceptingConnection] > 0)
                        {
                            binaryLogWriter.WriteEvent(LogCategory.AcceptingConnection, "SMAcceptConnectionClosure.AcceptConnections",
                                                       LogMessageType.ConnectionAccepting, ex, null, null, null,
                                                       GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name,
                                                       null, null, -1, 0, 0, 0, null, null, null, null,
                                                       "Can't accept a connection.");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // LOG:
                if (binaryLogWriter != null && binaryLogWriter[LogCategory.AcceptingConnection] > 0)
                {
                    binaryLogWriter.WriteEvent(LogCategory.AcceptingConnection, "SMAcceptConnectionClosure.AcceptConnections",
                                               LogMessageType.CriticalError, ex, null, null, null,
                                               GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name,
                                               null, null, -1, 0, 0, 0, null, null, null, null,
                                               "Critical listener failure. No connections will be accepted.");
                }

                this.SharedMemoryConnectionManager.ITransportContext.IGenuineEventProvider.Fire(new GenuineEventArgs(GenuineEventType.GeneralListenerFailure, ex, null, this.ShareName));
            }
            finally
            {
                this.SharedMemoryConnection.ReleaseUnmanagedResources();
                if (this._mutex != null)
                {
                    this._mutex.Close();
                }
            }
        }
        /// <summary>
        /// Accepts incoming connections.
        /// </summary>
        public void AcceptConnections()
        {
            BinaryLogWriter binaryLogWriter = this.ITransportContext.BinaryLogWriter;
            byte protocolVersion;
            GenuineConnectionType genuineConnectionType;

            try
            {
                IParameterProvider parameters = this.ITransportContext.IParameterProvider;

                string mutexName = GenuineSharedMemoryChannel.ConstructSharedObjectName(
                    "MUTEX" + this.ShareName, parameters);
                string clientConnected = GenuineSharedMemoryChannel.ConstructSharedObjectName(
                    "CC" + this.ShareName, parameters);
                string clientAccepted = GenuineSharedMemoryChannel.ConstructSharedObjectName(
                    "CA" + this.ShareName, parameters);

                this._mutex = WindowsAPI.CreateMutex(mutexName);

                this._clientConnectedEvent = NamedEvent.CreateNamedEvent(clientConnected, false, false);
                this._clientAcceptedEvent = NamedEvent.CreateNamedEvent(clientAccepted, false, true);
                WaitHandle[] handles = new WaitHandle[2] { this._clientConnectedEvent.ManualResetEvent, this.StopListening };

                for ( ; ; )
                {
                    try
                    {
                        // listen
                        WaitHandle.WaitAny(handles);

                        // if shutting down
                        if (this.StopListening.WaitOne(0, false))
                            return ;

                        // set timeout
                        int timeout = GenuineUtility.GetTimeout((TimeSpan) this.ITransportContext.IParameterProvider[GenuineParameter.ConnectTimeout]);

                        // client is connecting
                        using (Stream headerStream = this.SharedMemoryConnection.LowLevel_ReadSync(timeout))
                        {
                            BinaryReader binaryReader = new BinaryReader(headerStream);
                            string connectionId;
                            MessageCoder.DeserializeConnectionHeader(binaryReader, out protocolVersion, out genuineConnectionType, out connectionId);
                            string shareName = binaryReader.ReadString();
                            this._clientAcceptedEvent.ManualResetEvent.Set();

                            // LOG:
                            if ( binaryLogWriter != null && binaryLogWriter[LogCategory.AcceptingConnection] > 0 )
                            {
                                binaryLogWriter.WriteEvent(LogCategory.AcceptingConnection, "SMAcceptConnectionClosure.AcceptConnections",
                                    LogMessageType.ConnectionAccepting, null, null, null, null,
                                    GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name,
                                    null, null, -1, 0, 0, 0, null, null, null, null,
                                    "An inbound Shared Memory connection is being accepted.");
                            }

                            AcceptConnectionInformation acceptConnectionInformation = new AcceptConnectionInformation();
                            acceptConnectionInformation.ShareName = shareName;
                            acceptConnectionInformation.ProtocolVersion = protocolVersion;
                            GenuineThreadPool.QueueUserWorkItem(new WaitCallback(this.AcceptConnection), acceptConnectionInformation, true);
                        }
                    }
                    catch(Exception ex)
                    {
                        // LOG:
                        if ( binaryLogWriter != null && binaryLogWriter[LogCategory.AcceptingConnection] > 0 )
                        {
                            binaryLogWriter.WriteEvent(LogCategory.AcceptingConnection, "SMAcceptConnectionClosure.AcceptConnections",
                                LogMessageType.ConnectionAccepting, ex, null, null, null,
                                GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name,
                                null, null, -1, 0, 0, 0, null, null, null, null,
                                "Can't accept a connection.");
                        }
                    }
                }
            }
            catch(Exception ex)
            {
                // LOG:
                if ( binaryLogWriter != null && binaryLogWriter[LogCategory.AcceptingConnection] > 0 )
                {
                    binaryLogWriter.WriteEvent(LogCategory.AcceptingConnection, "SMAcceptConnectionClosure.AcceptConnections",
                        LogMessageType.CriticalError, ex, null, null, null,
                        GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name,
                        null, null, -1, 0, 0, 0, null, null, null, null,
                        "Critical listener failure. No connections will be accepted.");
                }

                this.SharedMemoryConnectionManager.ITransportContext.IGenuineEventProvider.Fire(new GenuineEventArgs(GenuineEventType.GeneralListenerFailure, ex, null, this.ShareName));
            }
            finally
            {
                this.SharedMemoryConnection.ReleaseUnmanagedResources();
                if (this._mutex != null)
                    this._mutex.Close();
            }
        }