.net - VB6 WinSock TCP 客户端和 .NET TCP 服务器

标签 .net networking vb6 tcp

遗留产品的 VB6 WinSock Tcp 客户端只会“错过”发送给它们的一半消息。

我将从事一个服务器项目,其中需要用 VB6 编写的旧遗留应用程序连接到 C# TCP 服务器。

由于 System.Net.TcpClient,当两个端点都是 .NET 时,TCP 客户端/服务器编程一直很容易。然而,看起来 VB6 组将被 VB6 WinSock 控件卡住(这是否像我听说的那样糟糕?)。

是否有任何注意事项或提示可以解决任何可避免的地雷或障碍?

当前的实现有一个服务器(c#.net)以下列方式发送消息:

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;
         }
      }

其中 clientStream 是与从 TcpListener 构建的 TcpClient 关联的 NetworkStream。

客户端接收消息的方式如下(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。很明显,这会占用处理器,但它让我得到每一个字节,而不必只相信异步套接字事件会触发。切换 VB6 代码以同步执行此操作并消除对事件触发的盲目信任是否是一个好的开始?

最佳答案

TCP 是 TCP,更具体地说,甚至 .NET TcpClient 类都构建在与 VB6 WinSock 相同的套接字基础结构上。沟通应该是直截了当的,但正如 DustinDavis 评论的那样,要注意使用 VB6 的缺点(例如数据结构和二进制格式)。

编辑:根据您的更新,确保您只从 VB6 客户端的套接字中读取 bytesTotal,否则您最终可能会获取下一个数据包的一部分(或当前数据包的一部分)包)。这是一个问题,因为 DataArrival 事件仅在新数据可供读取时触发。这在高流量系统中尤为突出。

关于.net - VB6 WinSock TCP 客户端和 .NET TCP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8596407/

相关文章:

c# - 无法从 WinRT 连接到远程服务器

c# - 为什么网络数据包分析器无法通过 Web 客户端捕获 Http Post 请求

java - Java 中的客户端服务器通信 - 使用哪种方法?

google-analytics - 是否有任何针对 VB6 的桌面应用程序使用跟踪系统?

c# - c#中的垃圾收集误解

c# - 控制台应用程序打印 "Fail:"

c# - 使用 ServiceStack.Text 解析 JSON 时出现问题

file - 在 VB6 的默认程序中打开文件

vb6 - VB6 应用程序执行不一致。某些用户成功,其他用户出现运行时错误 481 Invalid Picture

c# - 如何捕获这种类型的异常?