![見出し画像](https://assets.st-note.com/production/uploads/images/96340983/rectangle_large_type_2_5e4079dfddde7861aa822ea6a56c2db0.png?width=1200)
TWSNMP FCのPINGのためGO言語のICMPの処理を習得する
昨日調べたPINGの処理が気になって夜中に目が覚めました。1時半だったので起きるのはやめました。5時半から開発開始です。
GO言語でPINGを実施している部分の大規模な改善です。目的は3つです。
送信するICMPのパケットのTTLを設定する
受信した応答のTTLを取得する
受信したパケットの送信元を取得する
トレースルートのために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の設定と取得はできました。
![](https://assets.st-note.com/img/1674514175550-1Gu9fz6JnF.png?width=1200)
のような感じです。
最後のICMP TimeExceededの処理は、かなり骨のあるもので、
今朝は時間切れで、できませんでした。
また、夜中に目が覚めるかもしれません。
明日に続く
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。