2 つのコンソール アプリケーションには、bmThreadBlocking モードの TTcpServer を使用する 1 つのソケット サーバーと、bmBlocking モードの TTcpClient を使用する 1 つのソケット クライアントが含まれます。TTcpClient は、サーバーに接続し、回線を送信してから切断することを目的としています。TTcpServer は、着信接続をリッスンし、OnAccept イベント ハンドラで受信した回線をエコーすることを目的としています。
これら 2 つのコンソール アプリケーションは、Windows (XP および 7) で正常に動作します。ただし、CrossKylix または Kylix を直接使用してコンパイルすると、アプリケーションは Linux (SuSE 10.0 および CentOs 5u7) で期待どおりに実行できません。1 つのクライアントが接続するとすぐに、サーバー アプリケーションは "[1]+ Stopped ./TestSocketServer_1_Console_Native" を取得します。つまり、TTcpServer の OnAccept イベント ハンドラー内/後です。この問題についてコメントしていただけませんか?どんな助けでも大歓迎です!
2 つのコンソール アプリケーションは、 http://www.multiupload.com/9HIIG61W93からダウンロードできます。
便宜上、ソース コードもここに貼り付けます。(ポート番号 98765 または 1876 またはその他の番号は役に立ちません。)
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.