0

TTcpServer で XP サービスを獲得する必要があります。

アプリケーションは「ファイル->新規->その他->ServiceApplication」で作成されました

TTcpServer.localport:= 33000

exename.exe /install で登録されたサーバー

netstat -aポート 33000 -リスニング

しかし、このマシンの外からそのポートにアクセスすることはできません。ローカルのみ。

そして、同じパラメーターで標準アプリケーションを作成すると、すべて問題ありません。 TTcpServer 構成

EDIT1 TTcpServe.OnAccept =

procedure TFlexorXL.tcpServerAccept(Sender: TObject;
  ClientSocket: TCustomIpClient);
  var str: string;
begin
 if ClientSocket.Connect then
 begin
    str := ClientSocket.Receiveln;

  ClientSocket.Sendln('test');
               //ClientSocket.Disconnect;
  end;
end;
4

1 に答える 1

2

TCP/IP はサービス内で問題なく機能します (私は常に使用しています)。そのため、TTcpServerコンポーネントを誤用している可能性があります (これは、恐ろしく作成されたコンポーネントであるため可能性があります)。

プロパティが空白の場合TTcpServer.LocalHost、ソケットは利用可能なすべてのローカル IPv4 アドレスにバインドされます。それ以外の場合は、指定した特定の IPv4 アドレスにのみバインドされます (netstat は、サーバーが実際にバインドされている実際の IP を表示します)。これは、クライアントが接続する必要がある IP です。の場合0.0.0.0、サーバーのマシンに属する任意の IP に接続できます。

そうは言っても、実際にクライアントを受け入れるには、次のいずれかを行う必要があります。

  1. TTcpServer.BlockModeプロパティを に設定しますbmThreadBlocking。サーバーは内部ワーカー スレッドを使用して接続を受け入れ、各クライアントは独自のワーカー スレッドで実行されます。TTcpServer.OnAcceptただし、イベント ハンドラーが終了した直後にクライアントが切断されるため、クライアント関連のロジックはすべてイベント内で実行する必要があります。

  2. のその他の値については、タイマーやスレッドなどで自分自身をBlockMode呼び出す必要があります。TTcpServer.Accept()パラメータを持たないのオーバーロードされたバージョンを呼び出す場合Accept()は、クライアント関連のロジックをすべてイベント内で実行する必要がありますTTcpServer.OnAccept。これは、イベント ハンドラが終了した直後にクライアントが切断されるためです。Accept()オブジェクトを返す他のオーバーロードされたバージョンを呼び出すと、TCustomIpClientそのオブジェクトの有効期間を制御し、必要に応じて使用できます。

そうは言っても、これらすべてを実行しても問題が解決しない場合は、実際のTTcpServerセットアップに関する詳細情報を提供したり、実際のTTcpServerコードを表示したりする必要があります。現状では、診断するのに十分な詳細を提供していません。問題。

于 2013-08-14T20:50:36.447 に答える