Клиент VB6 WinSock Tcp Legacy продукта просто «пропускает» половину отправленного им сообщения.VB6 Клиент WinSock TCP и сервер .NET TCP
Я собираюсь работать над проектом сервера, где для подключения к серверу C# TCP потребуется старое устаревшее приложение, написанное на VB6.
TCP-клиент/серверное программирование всегда было легким, когда обе конечные точки были .NET благодаря System.Net.TcpClient. Однако похоже, что группа 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 является NetworkStream, связанный с TcpClient, который был построен из TcpListener.
Клиент получает сообщения следующим образом (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
EDIT: Когда я хочу отладить клиентов Tcp в C# Я использую NetworkStream TcpListener и делать .Receive синхронно. Очевидно, что это запугивает процессор, но я даю мне получить каждый байт, идущий вниз по линии, вместо того, чтобы просто доверять тому, что произойдет событие асинхронного сокета. Переключил бы код VB6 на это синхронно и удалил бы слепое доверие к запуску события - это хорошее место для начала?
Мне всегда нравилось делать winsock в vb6. Единственное, о чем я могу думать, это структуры данных. Я бы предложил убедиться, что вы используете общий двоичный формат или, возможно, XML. –
В чем проблема/вопрос в точности? Вы можете захотеть просмотреть COM-объекты TCP/IP от Catalyst вместо MS Winsock, он предоставляет больше возможностей. (Зависит от ваших потребностей). Также FYI, вызывающий Flush в сетевом потоке, ничего не делает. – tcarvin
Проблема в том, что клиент VB6 Tcp просто пропускает половину входящих сообщений. Ни один из моих клиентов .NET этого не делает. –