遗留产品的 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/