0

コードの大部分が 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# テストでは true であり、失敗する C++ プログラムでは false です。

トラブルシューティングやコードのスニペットについて、さらに詳しい情報を提供できます。問題に関連する部分だけでも膨大な量になるため、ここにはコードを含めませんでした。何が起こっているのかについて何らかの魔法の答えがあることを願っていますが、エラーはほぼ確実に詳細で非常に具体的です. さらなるトラブルシューティング手順についての洞察を提供するものであれば何でもいただければ幸いです。

COM を介して C# を呼び出すと、考慮していない可能性がある複雑な問題は何ですか?

SslStreamバッファに入っていない場合、反対側のメッセージはどこに行きましたか?

どこを見ればいいですか?

4

1 に答える 1

0

私はその答えを発見しました.COM、C#、C++とは関係がなく、関係するシステム間で送信されるメッセージのフォーマットに関係しています. もう一方のシステムは、追加の改行を使用してメッセージの終わりを示します。リモート システムが見つからない場合、別の SSL セッションが開始されるまで、単に応答を停止します。

プロジェクトの前の時点で、サーバーに送信されるメッセージの最後に余分な改行を含めていました。これらのメッセージの 1 つをコピーして、完全な C# テストを生成しました。何度か、両方のコードベースから送信されたメッセージを取得し、それらをマージ/差分ビューアーに入れました。空白の一致を無効にしていたため、この違いに気づきませんでした。

今後、生の出力を他の生の出力と比較するとき、どのツールも違いを隠していないことを確認します。

于 2012-12-05T15:49:11.170 に答える