SslStream作为COM对象访问时响应不同

SslStream responds differently when accessed as COM object

本文关键字:响应 访问 作为 COM 对象 SslStream      更新时间:2023-10-16

我正在与一个项目合作,该项目的大部分代码是C++。从长远来看,商店正在迁移到C#,因此我们尽可能在C#中制作新代码,并通过COM.向C++公开

我在一个COM对象中封装了一个System.Net.Sockts.SslStream和一些其他功能,该对象用于发送和接收消息。当从测试C#程序调用这个类上的函数时,我能够毫无问题地发送和接收消息。通过COM公开的相同调用似乎也能正常工作,只是我无法在发送后立即接收数据。

从C#测试数据发送和接收非常快,我得到了我应该得到的响应。从C++,我总是得到超时错误。调用Read的函数中的数据在C#测试和C++程序中是相同的。SslStream中的大部分状态都是相同的。就在写调用之后和读调用之前,唯一的区别似乎是,几个句柄和什么似乎是内存地址,但我认为这些并不重要。与此同时,我注意到,在一个名为"base"的项中,然后在一个称为"InnerStream"的项内,然后在"System.Net.Sockets.NetworkStream"内,有一个名"DataAvailable"的属性。这在C#测试中是正确的,在C++程序中是错误的。除了我所描述的之外,我不知道这些项目之间有任何有意义的区别。

我可以提供有关疑难解答或代码片段的更多详细信息。我没有在这里包含代码,因为仅仅是与问题相关的部分仍然是巨大的。我希望有一个神奇的答案来回答正在发生的事情,然而这个错误几乎可以肯定是深度和非常具体的。如果能提供有关进一步故障排除步骤的见解,我将不胜感激。

通过COM调用C#会带来哪些我可能没有考虑到的复杂情况?

如果没有进入SslStream缓冲区,其他方面的消息会去哪里?

我应该去哪里找?

我已经找到了答案,它与COM、C#、C++无关,而是与相关系统之间发送的消息的格式有关。另一个系统使用额外的回车来指示消息的结束。当丢失时,远程系统只需停止响应,直到启动另一个SSL会话。

在项目的前一点上,我在发送到服务器的消息末尾添加了一个额外的换行符。我已经复制了其中一条消息来生成我的完全c#测试。有几次,我还将从两个代码库发送的消息放入合并/差异查看器中。我从来没有注意到这种差异,因为我禁用了空白匹配。

从现在起,当我将原始输出与其他原始输出进行比较时,我将确保我的工具不会向我隐藏差异