支援 IPv4 (ping -4) 和 IPv6 (ping -6, ping6),或不指定 (ping)。
@networking/ping.c
簡單來說,首先透過 xhost_and_af2sockaddr(hostname, 0, af) 取得 sockaddr 格式的網址。
- hostname 可以是名稱網址或數字網址。
- 0 是沒用到的 port。
- af 可以是 AF_INET 強制使用 IPv4、AF_INET6 強制使用 IPv6,或 AF_UNSPEC 不指定,由 hostname 判斷或依據 DNS 結果決定最終是 IPv4 還是 IPv6。
- xhost_and_af2sockaddr() 實際上是呼叫 str2sockaddr(host, port, af, ai_flags),亦用在 traceroute、arping 等許多程式。host 格式也可以是 local:、[xx]:port、xx:port。host 中如果有 port 會取代函數傳入的 port。inet_aton() 檢查是否為數字 IPv4,inet_pton(AF_INET6) 檢查是否為數字 IPv6,否則需要 getaddrinfo()。
ping 回應逾時等候使用 signal(SIGALRM) 和 alarm()。
最後發封包,IPv6 呼叫 ping6(),否則呼叫 ping4()。
參考
- busybox ping.c
- https://lirobo.blogspot.com/2014/11/tcpdump.html
- https://lirobo.blogspot.com/2010/10/dns.html
- https://lirobo.blogspot.com/2010/06/mtu.html
沒有留言:
張貼留言