问题描述
场景是这样的:
我的应用程序目前包含 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 (将#修改为@)