mirror of
https://github.com/go-ping/ping.git
synced 2025-08-11 09:51:59 +00:00
Add ability to specifiy source IP address
This commit is contained in:
parent
5cc5e2921d
commit
3eec4c7c0d
12
ping.go
12
ping.go
@ -137,6 +137,9 @@ type Pinger struct {
|
|||||||
// Tracker: Used to uniquely identify packet when non-priviledged
|
// Tracker: Used to uniquely identify packet when non-priviledged
|
||||||
Tracker int64
|
Tracker int64
|
||||||
|
|
||||||
|
// Source is the source IP address
|
||||||
|
Source string
|
||||||
|
|
||||||
// stop chan bool
|
// stop chan bool
|
||||||
done chan bool
|
done chan bool
|
||||||
|
|
||||||
@ -144,7 +147,6 @@ type Pinger struct {
|
|||||||
addr string
|
addr string
|
||||||
|
|
||||||
ipv4 bool
|
ipv4 bool
|
||||||
source string
|
|
||||||
size int
|
size int
|
||||||
id int
|
id int
|
||||||
sequence int
|
sequence int
|
||||||
@ -277,12 +279,12 @@ func (p *Pinger) Run() {
|
|||||||
func (p *Pinger) run() {
|
func (p *Pinger) run() {
|
||||||
var conn *icmp.PacketConn
|
var conn *icmp.PacketConn
|
||||||
if p.ipv4 {
|
if p.ipv4 {
|
||||||
if conn = p.listen(ipv4Proto[p.network], p.source); conn == nil {
|
if conn = p.listen(ipv4Proto[p.network]); conn == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
conn.IPv4PacketConn().SetControlMessage(ipv4.FlagTTL, true)
|
conn.IPv4PacketConn().SetControlMessage(ipv4.FlagTTL, true)
|
||||||
} else {
|
} else {
|
||||||
if conn = p.listen(ipv6Proto[p.network], p.source); conn == nil {
|
if conn = p.listen(ipv6Proto[p.network]); conn == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
conn.IPv6PacketConn().SetControlMessage(ipv6.FlagHopLimit, true)
|
conn.IPv6PacketConn().SetControlMessage(ipv6.FlagHopLimit, true)
|
||||||
@ -570,8 +572,8 @@ func (p *Pinger) sendICMP(conn *icmp.PacketConn) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Pinger) listen(netProto string, source string) *icmp.PacketConn {
|
func (p *Pinger) listen(netProto string) *icmp.PacketConn {
|
||||||
conn, err := icmp.ListenPacket(netProto, source)
|
conn, err := icmp.ListenPacket(netProto, p.Source)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Error listening for ICMP packets: %s\n", err.Error())
|
fmt.Printf("Error listening for ICMP packets: %s\n", err.Error())
|
||||||
close(p.done)
|
close(p.done)
|
||||||
|
Loading…
Reference in New Issue
Block a user