【发布时间】: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