従来の製品のVB6 WinSock Tcpクライアントは、送信されたメッセージの半分を単に「ミス」します。VB6 WinSock TCPクライアントと.NET TCPサーバー
VB6で書かれた古いレガシーアプリケーションがC#TCPサーバーに接続するのに必要なサーバープロジェクトに取り組んでいます。
System.Net.TcpClientのおかげで、両方のエンドポイントが.NETの場合、TCPクライアント/サーバープログラミングは常に簡単でした。しかし、VB6グループがVB6のWinSockコントロール(これは私が聞いたように悪いですか?)で止まっているようです。
これにつながる警告またはヒントがありますので、避けることのできる地雷または障害を処理することができますか? clientStreamはTcpListenerから構築されたれるtcpClientに関連付けられたNetworkStreamである
private bool SendToStream(NetworkStream clientStream, string message)
{
try
{
message = Crypto.Encrypt(message);
message = message + "\r\n";
byte[] buffer = System.Text.Encoding.ASCII.GetBytes(message.ToCharArray());
if (clientStream != null)
{
StreamWriter blah = new StreamWriter("lastsent_a.txt");
blah.WriteLine("[some clientStream]" + Environment.NewLine + Environment.NewLine + message + Environment.NewLine + Environment.NewLine + Crypto.Decrypt(message));
blah.Close();
clientStream.Write(buffer, 0, buffer.Length);
clientStream.Flush();
return true;
}
return false;
}
catch (Exception e)
{
ProcessDebugLog("ERROR - SendToStream: " + e.Message.ToString());
return false;
}
}
:
現在の実装では、次のようにメッセージを送信し、サーバー(C#.NETを)持っています。
クライアントは、以下の方法(VB6のWinSockスタイル)でメッセージを受信:
Private Sub wskConnect_DataArrival(ByVal bytesTotal As Long)
Dim sBuff As String
wskConnect.GetData sBuff, vbString '-- Retrieve sent value
ProcessMessage sBuff '-- Process the value
End Sub
は編集:私はC#でのTCPクライアントをデバッグしたいときに、私はTcpListenerのNetworkStreamを使用して同期.Receiveを行います。明らかに、これはプロセッサを貪欲にしますが、非同期ソケットイベントが発生すると確信するのではなく、すべてのバイトが1行になるようにします。これを同期して実行するためにVB6コードを切り替えると、イベント発砲の盲目的な信頼を取り除くのがよいでしょうか?
私はいつもvb6でwinsockをやりたがっていました。私が考えることができるのはデータ構造だけです。私はあなたが共通のバイナリ形式か多分XMLを使用していることを確認することを提案します。 –
問題/質問は何ですか? MS Winsockの代わりにCatalystのTCP/IP COMオブジェクトを見たい場合は、より多くの機能を公開します。 (あなたのニーズに応じて)。またFYI、ネットワークストリームでFlushを呼び出すことは何もしません。 – tcarvin
問題は、VB6 Tcpクライアントが受信メッセージの半分を単に失うことです。私の.NETクライアントはそれをしません。 –