ping


ジャンジャン  2012-12-18 02:12:24  No: 43497

こんばんは。
Delphi初心者のジャンジャンと申します。
Windows Server 2008
Windows 7 マシンからなるクラサバ環境で
クライアントがサーバーにログオンしているかを
確認するプログラムを作成したいのですが、
DOSコマンドのpingのように
Delphiでログオン状態が確認できるプログラムは作成できるのでしょうか?


DEKO  2012-12-18 19:51:42  No: 43498

Ping は Indy の TIdIcmpClient で実現できます。
以下に単純な Ping の関数を記述しておきます。

uses
  ..., IdIcmpClient, IdStack;

interface
  
...
function SimplePing(AHost: string; ATimeout: Integer = 3000): Boolean;

implementation

...

function SimplePing(AHost: string; ATimeout: Integer): Boolean;
var
  IcmpClient: TIdIcmpClient;
begin
  result := False;
  IcmpClient := TIdIcmpClient.Create;
  try
    with IcmpClient do
      begin
        Host           := AHost;
        PacketSize     := 32;
        ReceiveTimeout := ATimeout;
        try
          Ping;
          result := True;
        except
          On E: EIdSocketError do
            result := False;
        end;
      end;
  finally
    IcmpClient.Free;
  end;
end;

...ですが、
Ping では、"ネットワークに TCP/IP 接続されているか?"という事しか判りません。

調べたいのは "特定のサーバに接続している PC" でしょうから、
"net session" の結果をリダイレクトして正規表現検索等で抜き出すか、

[net sessionコマンド (ITpro)]
http://itpro.nikkeibp.co.jp/article/COLUMN/20060704/242470/?ST=network

[552_パイプを使用したコマンドラインのリダイレクト (Mr.XRAY)]
http://mrxray.on.coocan.jp/Delphi/plSamples/552_PipeRedirect.htm

NetSessionEnum() API を使って調べる必要があると思います。 

[NetSessionEnum (MSDN)]
http://msdn.microsoft.com/ja-jp/library/cc446950.aspx


deldel  2012-12-19 01:37:48  No: 43499

私はここのコンポーネントを使用しています。
http://www.bvbcode.com/jp/0yck2dum-1656484


ジャンジャン  2012-12-19 07:32:08  No: 43500

DEKOさん、ご回答ありがとうございます
教授いただいた通りコーディングしたら、
Tdldcmpcliant.createのところで
引数足りませんというエラーになりました。
なにが足りないのでしょうか?


ジャンジャン  2012-12-19 07:37:52  No: 43501

deldelさん、ご回答ありがとうございます。
ご指示いただいたサイトを拝見しましたが、
はずかしながら、私の能力では難しすぎて
意味が理解出来ませんでした。
私の挑戦しようとしていることは
難しいでしょうか。


DEKO  2012-12-19 08:32:23  No: 43502

> Tdldcmpcliant.createのところで
> 引数足りませんというエラーになりました。

現行の Indy 10.x ではこれで通るハズですが、
お使いの Delphi は何でしょうか?


ジャンジャン  2012-12-19 18:11:10  No: 43503

おはようございます。
DEKOさん、お返事ありがとうございます。
私の開発環境は以下の通りです。
Windows XP & Delphi7
Windows7 & Delphi2010
***********************
Delphi2010でコンパイルすると
「E2065 forwardまたはextemal宣言されたTfrmTest.SimplePingが見つかりません」というエラーが発生しました。


DEKO  2012-12-19 19:05:16  No: 43504

Delphi7 だと Indy のバージョン違いで、Tdldcmpcliant.Create の引数が違うと怒られる、と。
これについては

[ANSI 版 Delphi (5〜2007) に最新版の Indy10 をインストールする]
http://ht-deko.minim.ne.jp/tech034.html

で解決します。

次。

> Delphi2010でコンパイルすると
> 「E2065 forwardまたはextemal宣言されたTfrmTest.SimplePingが見つかりません」というエラーが発生しました。

エラーメッセージの通りですが、implementation (定義部) にしかコードを書かれていないようですね。
interface (宣言部) の下、implementation (定義部) の上に、

> function SimplePing(AHost: string; ATimeout: Integer = 3000): Boolean;

を記述してください (元ソースでもそうなっていると思います)。

# この掲示板に限らない話ですが、質問の際は Delphi のバージョンとエディション、
# 場合によっては VCL / FMX どちらなのかを面倒臭がらずに記載して下さい。


DEKO  2012-12-19 19:13:49  No: 43505

interface / implementation セクションの理解があやふやな場合には
以下のドキュメントを参照して下さい。

[プログラムとユニット(Delphi)]
http://docwiki.embarcadero.com/RADStudio/XE3/ja/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%A8%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88

# C/C++ で言う "関数のプロトタイプ宣言" です。
# Delphi ではそれを記述する場所 (セクション) が決められています。


DEKO  2012-12-19 19:31:23  No: 43506

> TfrmTest.SimplePingが見つかりません
提示したコードはクラスのメソッドではなく "単なる関数" ですので、
implementation (定義部) に記述する際に、

function TfrmTest.SimplePing(AHost: string; ATimeout: Integer): Boolean;
var
  IcmpClient: TIdIcmpClient;
begin
  ...

のようにクラス名 (TfrmTest.) を付ける必要はありません。


deldel  2012-12-19 20:45:36  No: 43507

上のほうに、
「個別にダウンロードping.pasソースコード」
というのがありますから、ここからping.pasというファイルをダウンロードできます。
あとは普通のコンポーネントと同じようにインストールすれば使用できます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加