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

3

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

我将参与一个服务器项目,其中需要连接到C# TCP服务器的旧的传统应用程序是用VB6编写的。

当两个端点都是.NET时,由于System.Net.TcpClient,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;
         }
      }

客户端使用与从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代码切换为同步执行并消除对事件触发的盲目信任是否是一个好的起点?


3
我很喜欢在VB6中使用Winsock。我唯一能想到的是数据结构。我建议确保你正在使用常见的二进制格式或者可能是XML。 - Dustin Davis
问题/疑问具体是什么?您可能希望查看 Catalyst 的 TCP/IP COM 对象,而不是 MS Winsock,它公开了更多的功能。(取决于您的需求)。另外,顺便提一下,对网络流调用 Flush 不会产生任何效果。 - tcarvin
问题在于VB6 Tcp客户端会错过一半的传入消息。我的.NET客户端没有这个问题。 - user1110648
这是伪代码/示例VB6代码还是DataArrival处理程序中的真实VB6代码?ProcessMessage函数是做什么用的? - tcarvin
@tcarvin 是的,那是复制/粘贴的代码。Process message 接收字符串 sBuff 并解析它,根据消息采取进一步的行动。ProcessMessage 仅在收到消息后才会执行。 - user1110648
这是一个常见的误解,你正在接收消息。你正在接收一串字节。sBuff可能包含1个字节,它可能包含了组成你消息的50%,通常(如果他们足够小)它可以包含你消息的100%,有时它甚至可以包含超过100%(意味着它可能有下一条消息的某些部分)。在没有看到ProcessMessage中的代码之前,我不能确定你是否存在问题,但你应该确保该方法能够处理所有这些情况。 - tcarvin
2个回答

4
TCP是TCP,更具体地说,即使是.NET TcpClient类也建立在与VB6 WinSock相同的套接字基础设施上。通信应该很直接,但正如DustinDavis所评论的那样,要注意使用VB6的缺点(如数据结构和二进制格式)。
编辑:根据您的更新,请确保在VB6客户端中仅从套接字读取bytesTotal,否则您可能会抓取下一个数据包的部分或全部内容(或仅当前数据包的部分内容)。这是一个问题,因为当有新数据可读取时,DataArrival事件才会触发。这在高流量系统中尤为突出。

我之所以问这个问题,是因为当前有一个版本的服务器正在运行,而VB6正在使用WinSock进行异步读取。除了事件表面上75%的时间失败外,当新的.NET Tcp客户端连接时,根本没有任何问题。 - user1110648
1
也许这才是你问题真正应该问的?没有看到一些源代码,很难确定原因。 - M.Babcock
@Nunya:那么我预计您的VB6代码在非.NET服务器上同样会失败。另一端不应该对Winsock的操作产生任何影响,它只是一串数据流。 - Deanna
@Deanna,不幸的是,我们有一些旧的VB6 Tcp服务器,但它们与客户端完全正常工作。 - user1110648

0

当我年轻时,需要进行VB3和VB6开发时,我们总是使用IP*Works!

许可费用非常值得,因为它极大地减少了使用经典VB与网络协作时的麻烦。

声明:我不是该制造商的员工,也没有任何关联。我只是该产品的满意用户。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接