Skip to content

Commit 23b417c

Browse files
Add support for OnSendError and OnRecvError handlers (#44)
* Add support for OnSendError and OnRecvError handlers Signed-off-by: Jeremiah Millay <[email protected]> * do not use handler := pattern for callbacks Signed-off-by: Jeremiah Millay <[email protected]> --------- Signed-off-by: Jeremiah Millay <[email protected]>
1 parent 0ce0e4e commit 23b417c

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

ping.go

+19
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,12 @@ type Pinger struct {
177177
// OnDuplicateRecv is called when a packet is received that has already been received.
178178
OnDuplicateRecv func(*Packet)
179179

180+
// OnSendError is called when an error occurs while Pinger attempts to send a packet
181+
OnSendError func(*Packet, error)
182+
183+
// OnRecvError is called when an error occurs while Pinger attempts to receive a packet
184+
OnRecvError func(error)
185+
180186
// Size of packet being sent
181187
Size int
182188

@@ -645,6 +651,9 @@ func (p *Pinger) recvICMP(
645651
var err error
646652
n, ttl, _, err = conn.ReadFrom(bytes)
647653
if err != nil {
654+
if p.OnRecvError != nil {
655+
p.OnRecvError(err)
656+
}
648657
if neterr, ok := err.(*net.OpError); ok {
649658
if neterr.Timeout() {
650659
// Read timeout
@@ -792,6 +801,16 @@ func (p *Pinger) sendICMP(conn packetConn) error {
792801

793802
for {
794803
if _, err := conn.WriteTo(msgBytes, dst); err != nil {
804+
if p.OnSendError != nil {
805+
outPkt := &Packet{
806+
Nbytes: len(msgBytes),
807+
IPAddr: p.ipaddr,
808+
Addr: p.addr,
809+
Seq: p.sequence,
810+
ID: p.id,
811+
}
812+
p.OnSendError(outPkt, err)
813+
}
795814
if neterr, ok := err.(*net.OpError); ok {
796815
if neterr.Err == syscall.ENOBUFS {
797816
continue

0 commit comments

Comments
 (0)