У меня есть проблема, которая ведет меня вверх по стене . Я пытаюсь перенести серверную часть клиент-серверного приложения Indy 10 в Windows на Linux, чтобы сэкономить средства. Приложение изначально разрабатывалось с использованием Delphi 2010. С тех пор я перенес его на Lazarus / FreePascal, и оно отлично работает на Windows. Учитывая, что Lazarus / FreePascal является мультиплатформенным и бесплатным, он является идеальным кандидатом на работу.
Я перепробовал все возможное, чтобы серверное приложение работало в Linux без успеха. Сервер просто не связывается с подключенными клиентами. Вообще ничего!
Затем я решил вернуться на круги своя. Я попытался получить очень простой пример для работы на Linux. Соответствующие части исходного кода, как показано ниже
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
s: string;
i: Integer;
begin
with AContext.Connection.IOHandler do
try
WriteLn('Type an integer and Enter');
s := ReadLn;
try
i := StrToInt(s);
WriteLn(s + ' squared is ' + IntToStr(i*i));
except
WriteLn(s + ' is not an integer');
end;
finally
Free;
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
var
Binding: TIdSocketHandle;
begin
{$IFDEF UNIX}
Binding := IdTCPServer1.Bindings.Add;
//Binding.IPVersion := Id_IPv4; <----- Gives compilation error Error: Identifier not found "Id_IPv4"
{$ENDIF}
Binding.IP := '127.0.0.1';
Binding.Port := 6501;
IdTCPServer1.Active := True;
end;
end.
Это файл проекта программы squares.lpr
program squares;
{$mode objfpc}{$H+}
// The following line is is necessary for Linux thread support
{$IFDEF UNIX}{$DEFINE UseCThreads}{$ENDIF}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, uSquares
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Когда я пытаюсь подключиться к серверу из терминала, используя telnet, я получаю следующий ответ
telnet 127.0.0.1 6501
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
7
Connection closed by foreign host.
Как видите, telnet подключается к серверу. Но первый ответ сервера после подключения клиента «Введите целое число и Enter» не отображается. Кроме того, когда я отправляю число на сервер, например, «7» для квадрата, telnet говорит «Соединение закрыто внешним хостом». Таким образом, клиент telnet также не получает ответы сервера вообще. Я использую версию Indy SVN, поэтому речь не идет о старой версии Indy.
Так что даже этот базовый пример не работает в Linux! Я не знаю, как решить эту проблему, поэтому мне очень нужна ваша помощь. Кроме того, если у вас есть материал, который я могу прочитать о программировании сокетов в Linux с использованием Pascal, я буду очень признателен.
Я использую Lazarus 0.9.31 / FPC 2.4.4 и Indy 10.5.8 на Linux Mint.
JDaniel