繁体   English   中英

SslStream.AuthenticateAsClient-发送时无法立即完成非阻塞套接字操作

[英]SslStream.AuthenticateAsClient - A non-blocking socket operation could not be completed immediately on send

我目前正在尝试使用TcpClient连接到FTP服务器。 对于使用FTPS作为协议,我将NetworkStream处理到一个单独的方法,该方法使用该方法创建一个SslStream ,然后调用SslStream.AuthenticateAsClient并引发异常无法在send上立即完成非阻塞套接字操作 实际流由TcpClient.GetStream-方法初始化。 实际上,源代码来自Biko库,您可以在这里找到该部分: https : //biko.codeplex.com/SourceControl/latest#Biko/Starksoft%20Biko/Net/Ftp/FtpBase.cs

private Stream CreateSslStream(Stream stream)
    {
        // create an SSL or TLS stream that will close the client's stream
        SslStream ssl = new SslStream(stream, true, new RemoteCertificateValidationCallback(secureStream_ValidateServerCertificate), null);

        // choose the protocol
        SslProtocols protocol = SslProtocols.None;
        switch (_securityProtocol)
        {
            case FtpSecurityProtocol.Tls1OrSsl3Explicit:
            case FtpSecurityProtocol.Tls1OrSsl3Implicit:
                protocol = SslProtocols.Default;
                break;
            case FtpSecurityProtocol.Ssl2Explicit:
            case FtpSecurityProtocol.Ssl2Implicit:
                protocol = SslProtocols.Ssl2;
                break;
            case FtpSecurityProtocol.Ssl3Explicit:
            case FtpSecurityProtocol.Ssl3Implicit:
                protocol = SslProtocols.Ssl3;
                break;
            case FtpSecurityProtocol.Tls1Explicit:
            case FtpSecurityProtocol.Tls1Implicit:
                protocol = SslProtocols.Tls;
                break;
            default:
                throw new FtpSecureConnectionException(String.Format("unexpected FtpSecurityProtocol type '{0}'", _securityProtocol.ToString()));
        }

        // note: the server name must match the name on the server certificate.
        try
        {
            // authenticate the client
            ssl.AuthenticateAsClient(_host, _clientCertificates, protocol, true);
        }
        catch (AuthenticationException authEx)
        {
            throw new FtpAuthenticationException("Secure FTP session certificate authentication failed.", authEx);
        }

        return ssl;
    }

因此,我的问题是,如何修改源代码,以使不再抛出此异常? 我无法删除身份验证,但错误也应该消失。 是什么导致此错误?

提前致谢。

固定。 我刚刚更新到该库的较新版本。 该问题是由线程问题引起的,该问题由作者通过添加lock -keywords解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM