0

我正在处理一个大部分代码是 C++ 的项目。从长远来看,这家商店正在迁移到 C#,因此我们尽可能用 C# 编写新代码并通过 COM 向 C++ 公开。

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

从 C# 测试数据发送和接收的速度非常快,我得到了我应该得到的响应。从 C++ 开始,我总是遇到超时错误。调用 Read 的函数中的数据在 C# 测试和 C++ 程序中是相同的。SslStream 中的大部分状态是相同的。就在 write 调用之后和 Read 之前,唯一的区别似乎是几个句柄和似乎是内存地址的东西,但我认为这些并不重要。与此同时,我注意到在一个名为“base”的项目中,然后在一个名为“InnerStream”的项目中,然后在“System.Net.Sockets.NetworkStream”中有一个名为“DataAvailable”的属性。这在 C# 测试中有效,而在 C++ 程序中失败。

我可以提供有关故障排除或代码片段的更多详细信息。我没有在这里包含代码,因为与问题相关的部分仍然是巨大的。我希望对于正在发生的事情有某种神奇的答案,但是几乎可以肯定该错误是深入且非常具体的。我将不胜感激任何提供有关进一步故障排除步骤的见解的东西。

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

如果没有进入 SslStream 缓冲区,对方的消息去了哪里?

我应该在哪里寻找?

4

1 回答 1

0

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

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

从现在开始,当我将原始输出与其他原始输出进行比较时,我将确保我的任何工具都不会对我隐藏差异。

于 2012-12-05T15:49:11.170 回答