ping を実行してコンピューターが稼働しているかどうかを確認する小さなコードがあります。以前は 40 台のコンピューターを備えた部屋があり、自分のプログラムを使ってリモートでチェックしたいと思っています。
そのため、indyを使用して少しping関数を書きました
function TMainForm.Ping(const AHost : string) : Boolean;
var
MyIdIcmpClient : TIdIcmpClient;
begin
Result := True;
MyIdIcmpClient := TIdIcmpClient.Create(nil);
MyIdIcmpClient.ReceiveTimeout := 200;
MyIdIcmpClient.Host := AHost;
try
MyIdIcmpClient.Ping;
Application.ProcessMessages;
except
Result := False;
MyIdIcmpClient.Free;
Exit;
end;
if MyIdIcmpClient.ReplyStatus.ReplyStatusType <> rsEcho Then result := False;
MyIdIcmpClient.Free;
end;
だから私はそれを自宅のwifiネットワークで開発しましたが、すべてうまくいきます。
仕事に戻ってテストしたところ、次のエラーが表示されました
Socket Errod # 10040 Message too long
職場では固定 IP を使用しており、すべてのコンピューターと私は同じサブネット内にあります。
私は固定IPから切断し、もちろん同じサブネットではなくDHCPであるwifiに接続しようとしましたが、うまく機能しています。
このエラーとその解決方法をインターネットで検索しようとしましたが、多くの情報が見つかりませんでした。
もちろん、デフォルトのバッファ サイズをより大きな値に変更しようとしましたが、何も変更されず、同じサブネット内の固定 IP でエラーが発生します。
さらに、これが解決策を見つけるのに役立つかどうかはわかりませんが、私のコードは例外を扱いますが、その場合、タイムアウトが 200 ミリ秒に設定されているのに対し、エラーが発生するまでに約 3 ~ 4 秒かかります。そして、各pingでそれほど長く待つことはできません.
ちなみに、私はdelphi 2010を使用していますが、それはindy 10だと思います。XE2でもテストしましたが、同じエラーです。
何か案が
- - - 編集 - - -
この質問に回答しました。今、これをマルチスレッドで実行しようとしています。そのDelphi (XE2) Indy (10) Multithread Pingについて別の質問をしました。