2011-12-21 29 views
3

従来の製品の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コードを切り替えると、イベント発砲の盲目的な信頼を取り除くのがよいでしょうか?

+3

私はいつもvb6でwinsockをやりたがっていました。私が考えることができるのはデータ構造だけです。私はあなたが共通のバイナリ形式か多分XMLを使用していることを確認することを提案します。 –

+0

問題/質問は何ですか? MS Winsockの代わりにCatalystのTCP/IP COMオブジェクトを見たい場合は、より多くの機能を公開します。 (あなたのニーズに応じて)。またFYI、ネットワークストリームでFlushを呼び出すことは何もしません。 – tcarvin

+0

問題は、VB6 Tcpクライアントが受信メッセージの半分を単に失うことです。私の.NETクライアントはそれをしません。 –

答えて

4

TCPはTCPであり、さらに具体的には.NET TcpClientクラスもVB6 WinSockと同じソケットインフラストラクチャ上に構築されています。コミュニケーションはまっすぐに進むはずですが、DustinDavisがコメントしたように、VB6(データ構造やバイナリフォーマットなど)を使用するのは簡単ではないことに注意してください。

EDIT:あなたの更新を考えると、そうでなければ、次のパケット(または現在のパケットの一部のみ)のすべての部分をつかんで終わることができるので、あなたが唯一のVB6クライアントにソケットからbytesTotalのを読んでいることを確認してください。これは、新しいデータが読み込めるときにDataArrivalイベントがトリガされるだけなので、問題です。これは特に交通量の多いシステムで顕著です。

+0

私が尋ねた理由は、現在実行中のサーバーのバージョンがあり、VB6がWinSockを使用して非同期読み取りを行っているためです。その事象が表面的に<75%の発射に失敗したことを除いて。新しい.NET Tcpクライアントが接続されても問題は全くありません。 –

+1

おそらくそれはあなたの質問が実際に尋ねるべきものですか?いくつかのソースコードを見ることなく、原因を特定することは困難です。 –

+0

@Nunya:VB6コードが.NET以外のサーバーでも同じように失敗すると思います。もう一方の端はWinsockの役割に関係してはいけません。ただのデータストリームです。 – Deanna

0

私が若い頃、私たちは常にライセンス料が面倒で巨大な減少は、ネットワーキングと素晴らしいプレーする古典的なVBを取得しても価値があったIP*Works!

を使用するために使用されるVB3とVB6の開発をしなければなりませんでした。

ディスクロージャー:私は製造元のために働いていないか、それらと関連付けていません。私は単に製品の満足しているユーザーです。

関連する問題