見出し画像

TWSNMP FCのPINGのためGO言語のICMPの処理を習得する

昨日調べたPINGの処理が気になって夜中に目が覚めました。1時半だったので起きるのはやめました。5時半から開発開始です。
GO言語でPINGを実施している部分の大規模な改善です。目的は3つです。

  1. 送信するICMPのパケットのTTLを設定する

  2. 受信した応答のTTLを取得する

  3. 受信したパケットの送信元を取得する

  4. トレースルートのためにICMP TimeExceededの処理をする

受信したパケットの送信元を取得する処理は、すでにありました。
送信するICMPのパケットにTTLを設定するのは

	ipcon := conn.IPv4PacketConn()
	if ipcon != nil && p.SendTTL > 0 && p.SendTTL < 256 {
		ipcon.SetTTL(p.SendTTL)
	}

のようなコードでできました。SetTTLという関数がありました。わかりやすすい!
受信した応答のTTLを取得するコードは

n, cm, src, err = conn.IPv4PacketConn().ReadFrom(bytes)
if cm != nil {
   ttl = cm.TTL
}

のように組み込んであったのですが取得できません。ちょっとしたおまじないが必要でした。受信するコネクションにTTLを取得するフラグを付ける必要がありました。

conn.IPv4PacketConn().SetControlMessage(ipv4.FlagTTL, true)

これで、TTLの設定と取得はできました。

のような感じです。

最後のICMP TimeExceededの処理は、かなり骨のあるもので、
今朝は時間切れで、できませんでした。
また、夜中に目が覚めるかもしれません。

明日に続く


開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。