微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android 上的 Xamarin Forms:关闭 SSL-Stream 然后在底层 TCP 套接字上通信时遇到问题

如何解决Android 上的 Xamarin Forms:关闭 SSL-Stream 然后在底层 TCP 套接字上通信时遇到问题

场景是这样的:
我的应用程序目前包含 2 个平台:
Windows 桌面上的 Xamarin.Forms.WPF(使用 .NET 5)和 Android 上的 Xamarin Forms (10)。
网络组件位于 .Net Standard 2.1 程序集中。

该应用程序与服务器进程通信,该进程需要将打开的 TCP 连接转发到新创建的进程。这对于 TCP 套接字本身没有问题,但对于伴随的 SSL-Stream 则不可能。
因此,我们必须关闭 SSL Stream,将套接字传输到新进程并创建一个新的 SSL-Stream。

一个明确的消息顺序:
|客户 |服务器 | | ------ | ------ | |连接 | | |初始通信 (TCP) | |
| STARTTLS、身份验证等 |切换到 SSL | |通信 (SSL)| | |关闭 SSL| | | |开始新进程 | | |转接插座| | |发送“准备好新进程”(TCP) | |接收“准备好新进程”(TCP) | | | STARTTLS、身份验证等 | |切换到 SSL | |通信 (SSL)| |

该场景适用于 Windows 桌面,但不适用于 Android,我希望有人能够提供帮助。
下面是启用 SSL 通信的代码

        sslStream = new SslStream(tcpClient.GetStream(),true,new RemoteCertificateValidationCallback(ValidateServerCertificate),null);
        // The server name must match the name on the server certificate.
        try
        {
            await sslStream.AuthenticateAsClientAsync(serverName);
        }
        catch (Exception ex)
        {
            tcpClient.Close();
            throw;
        }

这用于关闭 SSL-Stream:

            await sslStream.ShutdownAsync();


            // I discovered that I have to issue a read on Windows Desktop after the Shutdown
            // Otherwise I would get encrypted data in my next Read on the TCP socket
            // This doesn’t work on Android. Regardless of the following Read I always get encrypted 
            // data in my next Read on the TCP socket

            var buf = new byte[128];
            var bytesRead = await sslStream.ReadAsync(buf,buf.Length);

            sslStream.Close();
            sslStream.dispose();

我希望我能充分解释这个问题。如果我需要解释更详细的内容,请告诉我。
在此先感谢您的帮助。
最好的问候
乌维

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。