Проблемы с обновлением TidTCPServer - PullRequest
0 голосов
/ 23 июня 2009

Мне недавно потребовалось обновить старый проект Delphi 6 до Delphi 2007. Это серверное приложение, использующее компонент Indy TidTCPServer. Я следовал всем примерам обновления до Indy 10.

Приложение взаимодействует со старым приложением VB6 (для которого у нас нет кода) через TCP / IP. У меня трудное время, потому что событие Execute в компоненте Indy срабатывает, как только приложение VB6 подключается, но оно не записывает никаких данных. Это приводит к зависанию приложения в ожидании отправки приложением данных, которые никогда не поступают.

Исходный код выглядел так:


data := AContext.Connection.IOHandler.ReadLn;
if data <> '' then
  begin
    // do some stuff
  end;

Я пробовал несколько примеров кода из примеров Indy, а также здесь, на StackOverlow. Пример:

AContext.Connection.IOHandler.CheckForDataOnSource(10);
if not AContext.Connection.IOHandler.InputBufferIsEmpty then
  begin
    data := AContext.Connection.IOHandler.ReadLn();
    if data <> '' then
      begin
        // do some stuff
      end;
  end;

Как ни странно, оригинальный код работает безупречно, когда я ударил его клиентом .NET. Это только кажется, проблема из приложения VB6.

Ответы [ 3 ]

1 голос
/ 23 июня 2009

Похоже, пришло время запустить WireShark и посмотреть, что на самом деле отправляется / принимается. Это может дать вам подсказку, которая вам нужна.

У меня была проблема, из-за которой у меня возникли проблемы при обновлении с Indy 9 до Indy 10 с C ++ Builder2009. У метода TIdTcpClient "Connect" в Indy 9 есть объявление, примерно такое:

void Connect(int ConnectTimeout);

В Indy10 «ConnectTimeout» теперь является свойством, а метод Connect теперь имеет объявление, похожее на это:

void Connect(String HostName);

Итак, мой старый код с «Connect (5000);» нормально скомпилирован (так как есть операторы автоматического преобразования из Int в String) теперь пытался подключиться к хосту с именем "5000" ....

1 голос
/ 24 июня 2009

Проблема решена. Следующий код работает ...


AContext.Connection.IOHandler.CheckForDataOnSource(10);
  if not AContext.Connection.IOHandler.InputBufferIsEmpty then
    begin
      data := AContext.Connection.IOHandler.InputBuffer.Extract;

После тщательной проверки потока (как предложено @Roddy) я смог определить, что приложение VB6 не отправляет CRLF по соединениям, что заставляет AContext.Connection.IOHandler.ReadLn; блокировать ожидание CRLF, который так и не пришел .

Спасибо @Darian и @Roddy за помощь в поиске ответа.

1 голос
/ 23 июня 2009

Я считаю, что Indy 9 поставляется с Delphi 6, а Indy 10 - с Delphi 2007, поэтому проблема заключается в различиях между Indy 9 и Indy 10. К сожалению, Indy 10 не всегда имела обратную совместимость.

Вот краткий обзор некоторых из этих изменений Изменения иерархии объектов в Indy 10

Интересно, что вы говорите, что сетевой клиент нормально подключается ... предположительно, немодифицированная версия вашего сервера просто перекомпилирована с Delphi 2007? Если это так, то, похоже, у вас уже установлена ​​Indy 10 для сборки системы Delphi 6 ...

...