System.Net.Mail.SmtpConnection.ConnectAndHandshakeAsyncResult.Handshake C# (CSharp) Method

Handshake() private method

private Handshake ( ) : void
return void
            private void Handshake()
            {
                _connection._responseReader = new SmtpReplyReaderFactory(_connection._networkStream);

                SmtpReplyReader reader = _connection.Reader.GetNextReplyReader();
                IAsyncResult result = reader.BeginReadLine(s_handshakeCallback, this);
                if (!result.CompletedSynchronously)
                {
                    return;
                }

                LineInfo info = reader.EndReadLine(result);

                if (info.StatusCode != SmtpStatusCode.ServiceReady)
                {
                    throw new SmtpException(info.StatusCode, info.Line, true);
                }
                try
                {
                    if (!SendEHello())
                    {
                        return;
                    }
                }
                catch
                {
                    if (!SendHello())
                    {
                        return;
                    }
                }
            }

Usage Example

 private static void ConnectionCreatedCallback(object request, object state)
 {
     SmtpConnection.ConnectAndHandshakeAsyncResult owningObject = (SmtpConnection.ConnectAndHandshakeAsyncResult)request;
     if (state is Exception)
     {
         owningObject.InvokeCallback((Exception)state);
     }
     else
     {
         SmtpPooledStream pooledStream = (SmtpPooledStream)((PooledStream)state);
         try
         {
             while ((pooledStream.creds != null) && (pooledStream.creds != owningObject.connection.credentials))
             {
                 owningObject.connection.connectionPool.PutConnection(pooledStream, pooledStream.Owner, owningObject.connection.Timeout, false);
                 pooledStream = (SmtpPooledStream)owningObject.connection.connectionPool.GetConnection(owningObject, m_ConnectionCreatedCallback, owningObject.connection.Timeout);
                 if (pooledStream == null)
                 {
                     return;
                 }
             }
             if (Logging.On)
             {
                 Logging.Associate(Logging.Web, owningObject.connection, pooledStream);
             }
             pooledStream.Owner = owningObject.connection;
             pooledStream.creds = owningObject.connection.credentials;
             lock (owningObject.connection)
             {
                 if (owningObject.connection.isClosed)
                 {
                     owningObject.connection.connectionPool.PutConnection(pooledStream, pooledStream.Owner, owningObject.connection.Timeout, false);
                     owningObject.InvokeCallback(null);
                     return;
                 }
                 owningObject.connection.pooledStream = pooledStream;
             }
             owningObject.Handshake();
         }
         catch (Exception exception)
         {
             owningObject.InvokeCallback(exception);
         }
     }
 }