我正在使用一个项目,其中大部分代码是C ++。从长远来看,该商店正在迁移到C#,因此我们在可能的情况下使用C#创建新代码并通过COM公开C ++。
我在一个COM对象中包装了一个System.Net.Sockets.SslStream和一些其他功能,用于发送然后接收消息。从测试C#程序调用此类的函数时,我能够毫无问题地发送和接收消息。通过COM公开的相同调用似乎也可以正常工作,除了我发送后无法立即接收数据。
从C#测试数据发送和接收非常快,我得到了应该的响应。从C ++我总是得到超时错误。调用Read的函数中的数据在C#测试和C ++程序中是相同的。 SslStream中的大部分状态都是相同的。在写入调用之后和Read之前,只有几个差异似乎是,几个句柄和看起来像是内存的东西,但我认为这些并不重要。同时我注意到在名为'base'的项目中,然后在名为'InnerStream'的项目内,然后在'System.Net.Sockets.NetworkStream'内有一个名为'DataAvailable'的属性。这在C#测试中是正确的,它在C ++程序中工作,在C ++程序中失败。我不知道这些项目与我所描述的之间有任何有意义的区别。
我可以提供有关故障排除或代码段的更多详细信息。我没有在这里包含代码,因为与问题相关的部分仍然是巨大的。我希望对于发生的事情有一些神奇的答案,但是错误几乎肯定是深度和非常具体的。我希望能够提供有关进一步故障排除步骤的信息。
调用C#虽然COM强加了我可能没有考虑过哪种并发症?
如果没有进入SslStream缓冲区,那么另一方消息会去哪里?
我应该在哪里看?
答案 0 :(得分:0)
我发现了答案,它与COM,C#,C ++无关,而是与所涉及系统之间发送的消息格式有关。另一个系统使用额外的回车符来指示消息的结束。当缺少远程系统时,只需停止响应,直到启动另一个SSL会话。
在项目的前一点,我在发送到服务器的消息末尾包括一个额外的换行符。我复制了其中一条消息以产生我的完全c#测试。有几次我还从两个代码库中发送消息并将它们放入合并/差异查看器中。我从未注意到这种差异,因为我禁用了空格匹配。
从现在开始,当我将原始输出与其他原始输出进行比较时,我将确保我的所有工具都不会隐藏与我的差异。