android - 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();
我希望我能充分解释这个问题。如果我应该更详细地解释一些事情,请告诉我。
提前感谢您的帮助。
最好的问候
乌维
解决方案
推荐阅读
- asp.net-core - 如何正确生成不随路由参数变化的剃须刀页面的链接
- java - Guice 中的包装绑定
- gradle - 如何在 Android.mk 中使用 Artifactory 库
- javascript - 为什么在函数内部创建 Extendscript 对象时无效?
- regex - 如何使用正则表达式去除数字后的所有文本并将数字包含在列中
- python - Django 依赖/链式下拉/组合列表
- javascript - 如何检查图像是否加载到 React 的骨架功能工作流程中
- flutter - dart 中字符串方法的奇怪行为
- javascript - 通话结束后可以自动打开 PWA 应用吗
- react-native - React Native iOS:打包程序在物理设备上的加载速度比在模拟器上慢得多