当作为 COM 对象访问时,SslStream 的响应不同
Posted
技术标签:
【中文标题】当作为 COM 对象访问时,SslStream 的响应不同【英文标题】:SslStream responds differently when accessed as COM object 【发布时间】:2012-12-03 23:11:24 【问题描述】:我正在处理一个大部分代码是 C++ 的项目。从长远来看,这家商店正在迁移到 C#,因此我们尽可能用 C# 编写新代码并通过 COM 向 C++ 公开。
我将 System.Net.Sockets.SslStream 和一些其他功能包装在一个用于发送和接收消息的 COM 对象中。从测试 C# 程序调用此类上的函数时,我能够毫无问题地发送和接收消息。通过 COM 公开的相同调用似乎也可以正常工作,只是在发送后我无法立即接收数据。
从 C# 测试数据的发送和接收速度非常快,我得到了我应该得到的响应。从 C++ 开始,我总是遇到超时错误。调用 Read 的函数中的数据在 C# 测试和 C++ 程序中是相同的。 SslStream 中的大部分状态是相同的。就在 write 调用之后和 Read 之前,唯一的区别似乎是几个句柄和似乎是内存地址的东西,但我认为这些并不重要。与此同时,我注意到在一个名为“base”的项目中,然后在一个名为“InnerStream”的项目中,然后在“System.Net.Sockets.NetworkStream”中有一个名为“DataAvailable”的属性。这在 C# 测试中有效,而在 C++ 程序中失败。除了我所描述的之外,我不知道这些项目之间有任何有意义的区别。
我可以提供有关故障排除或代码 sn-ps 的更多详细信息。我没有在这里包含代码,因为与问题相关的部分仍然是巨大的。我希望对于正在发生的事情有某种神奇的答案,但是几乎可以肯定该错误是深入且非常具体的。我将不胜感激任何提供有关进一步故障排除步骤的见解的东西。
通过 COM 调用 C# 会带来哪些我可能没有考虑到的复杂情况?
如果没有进入 SslStream 缓冲区,对方消息到哪里去了?
我应该去哪里看?
【问题讨论】:
【参考方案1】:我找到了答案,它与 COM、C#、C++ 无关,而是与相关系统之间发送的消息的格式有关。另一个系统使用额外的回车来指示消息的结束。当缺少远程系统时,会停止响应,直到另一个 SSL 会话启动。
在项目的前一点,我在发送到服务器的消息末尾添加了一个额外的换行符。我复制了其中一条消息来生成我的完全 c# 测试。有几次,我还将两个代码库发送的消息放入合并/差异查看器中。我从未注意到这种差异,因为我禁用了空白匹配。
从现在开始,当我将原始输出与其他原始输出进行比较时,我将确保我的任何工具都不会隐藏差异。
【讨论】:
以上是关于当作为 COM 对象访问时,SslStream 的响应不同的主要内容,如果未能解决你的问题,请参考以下文章
SslStream.AuthenticateAsClient() 使用未缓存的 CRL 非常慢
c#SslStream的read()函数如何知道何时返回0?
C# - 执行 SslStream.Read 后如何知道 TcpClient 中剩余多少字节