Opc.Ua.Bindings.TcpServerChannel.Reconnect C# (CSharp) Method

Reconnect() public method

Handles a reconnect request.
public Reconnect ( TcpMessageSocket socket, uint requestId, uint sequenceNumber, X509Certificate2 clientCertificate, TcpChannelToken token, OpenSecureChannelRequest request ) : void
socket TcpMessageSocket
requestId uint
sequenceNumber uint
clientCertificate System.Security.Cryptography.X509Certificates.X509Certificate2
token TcpChannelToken
request OpenSecureChannelRequest
return void
        public void Reconnect(
            TcpMessageSocket         socket, 
            uint                     requestId,
            uint                     sequenceNumber,
            X509Certificate2         clientCertificate, 
            TcpChannelToken          token,
            OpenSecureChannelRequest request)
        {      
            if (socket == null) throw new ArgumentNullException("socket");
            
            lock (DataLock)
            {
                // make sure the same client certificate is being used.     
                CompareCertificates(ClientCertificate, clientCertificate, false);

                // check for replay attacks.
                if (!VerifySequenceNumber(sequenceNumber, "Reconnect"))
                {
                    throw new ServiceResultException(StatusCodes.BadSequenceNumberInvalid);
                }

                try
                {        
                    // replace the socket.
                    Socket = socket;
                    Utils.Trace("TCPSERVERCHANNEL SOCKET RECONNECTED: {0:X8}, ChannelId={1}", Socket.Handle, ChannelId);
                    Socket.ChangeSink(this);

                    // need to assign a new token id.
                    token.TokenId = GetNewTokenId();

                    // put channel back in open state.
                    ActivateToken(token);
                    State = TcpChannelState.Open;

                    // no need to cleanup.
                    if (m_cleanupTimer != null)
                    {
                        m_cleanupTimer.Dispose();
                        m_cleanupTimer = null;
                    }

                    // send response.
                    SendOpenSecureChannelResponse(requestId, token, request);

                    // send any queue responses.
                    ThreadPool.QueueUserWorkItem(new WaitCallback(OnChannelReconnected), m_queuedResponses);
                    m_queuedResponses = new SortedDictionary<uint,IServiceResponse>();
                }
                catch (Exception e)
                {
                    SendServiceFault(token, requestId, ServiceResult.Create(e, StatusCodes.BadTcpInternalError, "Unexpected error processing request."));
                }
            }
        }
      

Usage Example

コード例 #1
0
        /// <summary>
        /// Binds a new socket to an existing channel.
        /// </summary>
        internal bool ReconnectToExistingChannel(
            TcpMessageSocket socket,
            uint requestId,
            uint sequenceNumber,
            uint channelId,
            X509Certificate2 clientCertificate,
            TcpChannelToken token,
            OpenSecureChannelRequest request)
        {
            TcpServerChannel channel = null;

            lock (m_lock)
            {
                if (!m_channels.TryGetValue(channelId, out channel))
                {
                    throw ServiceResultException.Create(StatusCodes.BadTcpSecureChannelUnknown, "Could not find secure channel referenced in the OpenSecureChannel request.");
                }
            }

            channel.Reconnect(socket, requestId, sequenceNumber, clientCertificate, token, request);
            return(true);
        }