1

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.
4

0 に答える 0