VB6 WinSock TCP-клиент и .NET TCP-сервер - PullRequest
3 голосов
/ 22 декабря 2011

Клиенты VB6 WinSock Tcp устаревшего продукта просто «пропускают» половину отправленного им сообщения.

Я собираюсь работать над проектом сервера, где для подключения к серверу C # TCP потребуется старое унаследованное приложение, написанное на VB6.

Программирование TCP / клиент-сервер всегда было простым, когда обе конечные точки являются .NET благодаря System.Net.TcpClient. Однако, похоже, что группа VB6 застрянет с управлением WinSock VB6 (это так плохо, как я слышал?).

Есть ли какие-либо предостережения или подсказки, ведущие к этому, чтобы можно было позаботиться о любых минных минах или препятствиях, которые можно было бы избежать?

В текущей реализации есть сервер (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

РЕДАКТИРОВАТЬ: Когда я хочу отладить клиенты Tcp в C #, я использую NetworkStream TcpListener и делаю. Получать синхронно. Ясно, что это перегружает процессор, но он позволяет мне получать каждый байт, идущий по линии, вместо того, чтобы просто полагаться на то, что произойдет событие асинхронного сокета. Будет ли хорошим началом для начала переключение кода VB6 на синхронное выполнение и устранение слепого доверия к запуску события?

Ответы [ 2 ]

4 голосов
/ 22 декабря 2011

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

РЕДАКТИРОВАТЬ: Учитывая ваше обновление, убедитесь, что вытолько читать bytesTotal из сокета в клиенте VB6, потому что в противном случае вы можете получить часть всего следующего пакета (или только часть текущего пакета).Это проблема, потому что событие DataArrival запускается только тогда, когда новые данные доступны для чтения.Это особенно заметно в системах с интенсивным движением.

0 голосов
/ 22 декабря 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...