トレース ルートを実行するには、Indy のドキュメントを参照してください。
「Traceroute アプリケーションの場合、TTL 値を増やして ping エコー要求を送信します」
問題は、TTL プロパティが保護されていて設定できないことです。これは単なる別のバグですか、それとも TTL プロパティを公開するために新しいクラスを定義する必要があるのでしょうか?
ただし、新しいクラスを作成しました (Ping の回避策を含む)。
class TPing : public TIdIcmpClient {
public:
__property TTL;
__fastcall TPing(TComponent* Owner) : TIdIcmpClient(Owner) {};
__fastcall Ping(unsigned int Id = 0) {
AnsiString Proxy = StringOfChar('X',PacketSize);
TIdIcmpClient::Ping(Proxy,Id);
}
};
TTL を 5 に設定し、ping を google.com に呼び出した場合 (自分の場所から google.com への TTL が 6 であることを確認しました)。
したがって、TTL が 5 の場合、ICMP タイムアウト メッセージが生成され、ドキュメントによると、最後の IP が返されます。しかし、代わりに IP を取得します0.0.0.0
。これは、コールバックAReplyStatus
内のメンバー値です。OnReply(TComponent *ASender, const TReplyStatus *AReplyStatus)
FByteReceived 0,
FFromIpAddress { u"0.0.0.0" },
FToIpAddress { u"0.0.0.0" },
FMsgType '\0',
FMsgCode '\0',
FSequenceId 3490U(0x0DA2),
FMsRoundTripTime 109,
FTimeToLive '\0',
FReplyStatus 2 /* rsTimeOut */,
FPacketNumber 0,
FHostName { NULL },
FMsg { NULL },
FRedirectTo { NULL }
TTL を 6 に変更すると、すべてが期待どおりに機能し (google.com の回答)、代わりに rsEcho が返されます。
質問を明確にするため
に、途中ですべてのルーターの IP アドレスを収集するために traceroute (インクリメント TTL) を実行するにはどうすればよいですか?