예제 #1
0
        } // StopListening

        //
        // end of IChannelReceiver implementation
        //

        // Thread for listening
        void Listen()
        {
            InternalRemotingServices.RemotingTrace("Waiting to Accept a Connection on Port: " + _portName);

            //
            // Wait for an incoming client connection
            //
            IntPtr handle = IntPtr.Zero;

            bool connected = false;
            CommonSecurityDescriptor descriptor = _securityDescriptor;

            // Connect with exlusive flag the first time
            try{
                // If the descriptor is not explicitly set through code use the _authorizedGroup config
                if (descriptor == null && _authorizedGroup != null)
                {
                    NTAccount ntAccount = new NTAccount(_authorizedGroup);
                    descriptor = IpcPort.CreateSecurityDescriptor((SecurityIdentifier)ntAccount.Translate(typeof(SecurityIdentifier)));
                }

                _port = IpcPort.Create(_portName, descriptor, _bExclusiveAddressUse);
            }
            catch (Exception e) {
                _startListeningException = e;
            }
            finally {
                _bListening = (_startListeningException == null);
                _waitForStartListening.Set(); // allow main thread to continue now that we have tried to start the socket
            }

            if (_port != null)
            {
                connected = _port.WaitForConnect();
            }

            while (_bListening)
            {
                InternalRemotingServices.RemotingTrace("IpcChannel::Listen");

                // For DevDiv#220882, we need to create new IpcPort before handling the current message
                // to avoid race condition in case the message is handled and finished before
                // the new IpcPort is created.  The client will intermittently fail with Port not found.
                IpcPort port = IpcPort.Create(_portName, descriptor, false);

                if (connected)
                {
                    // Initialize the server handler and perform an async read
                    IpcServerHandler serverHandler = new IpcServerHandler(_port, CoreChannel.RequestQueue, new PipeStream(_port));
                    serverHandler.DataArrivedCallback = new WaitCallback(_transportSink.ServiceRequest);
                    serverHandler.BeginReadMessage();
                }
                _port     = port;
                connected = _port.WaitForConnect();
            }
        }
        } // StopListening
 
        // 
        // end of IChannelReceiver implementation
        // 

        // Thread for listening
        void Listen()
        { 
            bool bOkToListen = true;
 
 
            InternalRemotingServices.RemotingTrace( "Waiting to Accept a Connection on Port: " + _portName);
 
            //
            // Wait for an incoming client connection
            //
            IntPtr handle = IntPtr.Zero; 

            bool connected = false; 
            CommonSecurityDescriptor descriptor = _securityDescriptor; 

            // Connect with exlusive flag the first time 
            if (bOkToListen)
            {
                try{
                    // If the descriptor is not explicitly set through code use the _authorizedGroup config 
                    if (descriptor == null && _authorizedGroup != null)
                    { 
                        NTAccount ntAccount = new NTAccount(_authorizedGroup); 
                        descriptor = IpcPort.CreateSecurityDescriptor((SecurityIdentifier)ntAccount.Translate(typeof(SecurityIdentifier)));
                    } 

                    _port = IpcPort.Create(_portName, descriptor, _bExclusiveAddressUse);
                }
                catch (Exception e) { 
                    _startListeningException = e;
                } 
                finally { 
                    _waitForStartListening.Set(); // allow main thread to continue now that we have tried to start the socket
                } 
                if (_port != null){
                    connected = _port.WaitForConnect();
                    bOkToListen = _bListening;
                } 
            }
 
            while (bOkToListen && _startListeningException == null) 
            {
                InternalRemotingServices.RemotingTrace("IpcChannel::Listen"); 

                // For DevDiv#220882, we need to create new IpcPort before handling the current message
                // to avoid race condition in case the message is handled and finished before
                // the new IpcPort is created.  The client will intermittently fail with Port not found. 
                IpcPort port = IpcPort.Create(_portName, descriptor, false);
 
                if (connected) 
                {
                    // Initialize the server handler and perform an async read 
                    IpcServerHandler serverHandler = new IpcServerHandler(_port, CoreChannel.RequestQueue, new PipeStream(_port));
                    serverHandler.DataArrivedCallback = new WaitCallback(_transportSink.ServiceRequest);
                    serverHandler.BeginReadMessage();
                } 
                _port = port;
                connected = _port.WaitForConnect(); 
                bOkToListen = _bListening; 
            }
       }