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

问题描述

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

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

所涉及的消息有明确的顺序:
| 客户 | 服务器 | | ------ | ------ | | 连接 | | | 初始通信 (TCP) | |
| STARTTLS、身份验证等 | 切换到 SSL | | 通信 (SSL)| | | 关闭 SSL| | | | 启动新流程 | | | 传输插座 | | | 发送“Ready in new process” (TCP) | | 接收“Ready in new process” (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, 0, buf.Length);

            sslStream.Close();
            sslStream.Dispose();

我希望我能充分解释这个问题。如果我应该更详细地解释一些事情,请告诉我。
提前感谢您的帮助。
最好的问候
乌维

标签: androidsocketssslxamarin.forms

解决方案


推荐阅读