2011-12-21 2 views
3

Клиент 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 на это синхронно и удалил бы слепое доверие к запуску события - это хорошее место для начала?

+3

Мне всегда нравилось делать winsock в vb6. Единственное, о чем я могу думать, это структуры данных. Я бы предложил убедиться, что вы используете общий двоичный формат или, возможно, XML. –

+0

В чем проблема/вопрос в точности? Вы можете захотеть просмотреть COM-объекты TCP/IP от Catalyst вместо MS Winsock, он предоставляет больше возможностей. (Зависит от ваших потребностей). Также FYI, вызывающий Flush в сетевом потоке, ничего не делает. – tcarvin

+0

Проблема в том, что клиент VB6 Tcp просто пропускает половину входящих сообщений. Ни один из моих клиентов .NET этого не делает. –

ответ

4

TCP - это TCP, а более конкретно, класс .NET TcpClient построен в той же инфраструктуре сокетов, что и VB6 WinSock. Сообщение должно быть прямолинейным, но, как прокомментировал DustinDavis, остерегайтесь коротких приемов использования VB6 (таких как структуры данных и двоичное форматирование).

EDIT: Учитывая ваше обновление, убедитесь, что вы только для чтения BYTESTOTAL из гнезда в клиенте VB6, потому что в противном случае вы можете в конечном итоге захвата часть всего следующего пакета (или только часть текущего пакета). Это проблема, потому что событие DataArrival запускается только тогда, когда доступны новые данные для чтения. Это особенно заметно в системах с высокой пропускной способностью.

+0

Причина, по которой я спросил, заключается в том, что в настоящее время версия сервера работает, а VB6 использует WinSock для асинхронного чтения. За исключением случаев, когда событие якобы не срабатывает <% 75 времени. Когда новые клиенты .NET Tcp соединяются, проблем нет. –

+1

Возможно, это то, о чем должен задать ваш вопрос? Не видя какого-либо исходного кода, будет сложно определить причину. –

+0

@Nunya: Тогда я ожидаю, что ваш код VB6 будет работать неравномерно на серверах, отличных от .NET. Другой конец не должен иметь никакого отношения к тому, что делает Winsock, это всего лишь поток данных. – Deanna

0

Когда я был моложе, и должен был сделать VB3 и VB6 развития мы всегда использовать IP*Works!

Лицензионный сбор хорошо стоит огромного сокращения хлопот получать классический VB, чтобы играть хорошо с сетью.

Раскрытие информации: Я не работаю для производителя или не связан с ними. Я просто довольный предыдущий пользователь продукта.