The two console applications include one socket server using TTcpServer of bmThreadBlocking mode, and one socket client using TTcpClient of bmBlocking mode. The TTcpClient is intended to connect to the server, send a line, and then disconnect. The TTcpServer is intended to listen to the incoming connections, and echo the line received in its OnAccept event handler.
These two console applications run fine in Windows (XP and 7). However, when I compile it using CrossKylix or Kylix directly, the applications cannot run as expected in Linux (SuSE 10.0 and CentOs 5u7). The server application gets "[1]+ Stopped ./TestSocketServer_1_Console_Native" as soon as one client connects, i.e., within/after TTcpServer's OnAccept event handler. Could you help to comment on this problem? Any help will be appreciated!
The two console applications can be downloaded at http://www.multiupload.com/9HIIG61W93
The source code is also pasted here for your convenience. (The port number, 98765 or 1876 or some other number, does not help.)
TestSocketServer_1_Console_Native
TestSocketServer_1_Console_Native.dpr
program TestSocketServer_1_Console_Native;
{$APPTYPE CONSOLE}
uses
  uServerDataModule in 'uServerDataModule.pas' {ServerDataModule: TServerDataModule},
  SysUtils;
begin
  { TODO -oUser -cConsole Main : Insert code here }
  ServerDataModule := TServerDataModule.Create(nil);
  try
    ServerDataModule.tcpServerCCL.Active := True;
    while True do
    begin
      Sleep(500);
    end;
  finally
    ServerDataModule.Free;
  end;
end.
uServerDataModule.pas
unit uServerDataModule;
interface
uses
  SysUtils, Classes, Sockets;
type
  TServerDataModule = class(TDataModule)
    tcpServerCCL: TTcpServer;
  private
    { Private declarations }
    procedure tcpServerCCLAccept(Sender: TObject; ClientSocket: TCustomIpClient);
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  end;
var
  ServerDataModule: TServerDataModule;
implementation
{$R *.dfm}
{ TServerDataModule }
constructor TServerDataModule.Create(AOwner: TComponent);
begin
  inherited;
  tcpServerCCL.Active := False;
  tcpServerCCL.LocalPort := '98765';
  tcpServerCCL.OnAccept := tcpServerCCLAccept;
end;
procedure TServerDataModule.tcpServerCCLAccept(Sender: TObject; ClientSocket:
    TCustomIpClient);
var
  l_InputStr: string;
begin
  WriteLn('Accepted connection from ' + ClientSocket.LocalHost);
  l_InputStr := ClientSocket.Receiveln();
  Writeln(PChar(l_InputStr));
end;
end.
    
TestSocketClient_1_Console_Native
TestSocketClient_1_Console_Native.dpr
program TestSocketClient_1_Console_Native;
{$APPTYPE CONSOLE}
uses         
  uClientDataModule in 'uClientDataModule.pas' {ClientDataModule: TClientDataModule},
  SysUtils;
begin
  { TODO -oUser -cConsole Main : Insert code here }
  ClientDataModule := TClientDataModule.Create(nil);
  try
    if ClientDataModule.tcpClientCCL.Connect then
    begin
      ClientDataModule.tcpClientCCL.Sendln('hello from client');
    end;
  finally
  end;
end.
uClientDataModule.pas
unit uClientDataModule;
interface
uses
  SysUtils, Classes, Sockets;
type
  TClientDataModule = class(TDataModule)
    tcpClientCCL: TTcpClient;
  private
    { Private declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  end;
var
  ClientDataModule: TClientDataModule;
implementation
{$R *.dfm}
{ TClientDataModule }
constructor TClientDataModule.Create(AOwner: TComponent);
begin
  inherited;
  tcpClientCCL.Active := False;
  tcpClientCCL.RemoteHost := '127.0.0.1';
  tcpClientCCL.RemotePort := '98765';
end;
end.