【问题标题】:VB6 WinSock TCP client and .NET TCP serverVB6 WinSock TCP 客户端和 .NET TCP 服务器
【发布时间】:2012-01-25 15:41:24
【问题描述】:

传统产品的 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 代码以同步执行此操作并消除对事件触发的盲目信任是否是一个不错的起点?

【问题讨论】:

  • 我一直喜欢在vb6中做winsock。我唯一能想到的就是数据结构。我建议确保您使用的是通用二进制格式或 XML。
  • 到底是什么问题/问题?您可能想查看 Catalyst 中的 TCP/IP COM 对象而不是 MS Winsock 对象,它提供了更多功能。 (取决于你的需要)。另外仅供参考,在网络流上调用 Flush 不会做任何事情。
  • 问题是 VB6 Tcp 客户端只是错过了一半的传入消息。我的 .NET 客户端都没有这样做。
  • DataArrival 处理程序中的伪/示例 VB6 代码还是真正的 VB6 代码? ProcessMessage 是做什么的?
  • @tcarvin 是的,这是复制/粘贴代码。进程消息获取 sBuff 字符串并对其进行解析,并根据消息的内容采取进一步的行动。 ProcessMessage 仅在消息进入后才会被击中。

标签: .net networking vb6 tcp


【解决方案1】:

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

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

【讨论】:

  • 我问的原因是因为当前有一个版本的服务器在运行,而VB6正在使用WinSock进行异步读取。除了事件表面上未能触发
  • 也许您的问题实际上应该问这个问题?没有看到一些源代码,很难确定原因。
  • @Nunya:那么我希望您的 VB6 代码在非 .NET 服务器上同样失败。另一端不应该与 Winsock 的功能有任何关系,它只是一个数据流。
  • @Deanna,不幸的是,我们有一些旧的 VB6 Tcp 服务器可以与客户端完全兼容。
【解决方案2】:

小时候做VB3和VB6开发的时候我们一直用IP*Works!

许可费非常值得大大减少让经典 VB 与网络配合使用的麻烦。

披露:我不为制造商工作或与他们有任何关联。我只是一个满意的产品以前的用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2013-08-20
    • 2012-01-04
    相关资源
    最近更新 更多