/*
NNCP -- Node to Node copy, utilities for store-and-forward data exchange
-Copyright (C) 2016-2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2016-2022 Sergey Matveev <stargrave@stargrave.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
}
func (ctx *Ctx) MCDTx(ifiName string, port int, interval time.Duration) error {
- conn, err := net.DialUDP("udp",
- &net.UDPAddr{Port: port, Zone: ifiName},
- &net.UDPAddr{IP: mcdIP, Port: MCDPort, Zone: ifiName},
- )
+ ifi, err := net.InterfaceByName(ifiName)
+ if err != nil {
+ return err
+ }
+ addr := &net.UDPAddr{IP: mcdIP, Port: port, Zone: ifiName}
+ conn, err := net.ListenMulticastUDP("udp", ifi, addr)
if err != nil {
return err
}
+
+ dst := &net.UDPAddr{IP: mcdIP, Port: MCDPort, Zone: ifiName}
var buf bytes.Buffer
mcd := MCD{Magic: MagicNNCPDv1.B, Sender: ctx.Self.Id}
if _, err := xdr.Marshal(&buf, mcd); err != nil {
panic(err)
}
if interval == 0 {
- _, err = conn.Write(buf.Bytes())
+ _, err = conn.WriteTo(buf.Bytes(), dst)
return err
}
go func() {
ifiName, MCDPort, port,
)
})
- _, err = conn.Write(buf.Bytes())
+ _, err = conn.WriteTo(buf.Bytes(), dst)
if err != nil {
ctx.LogE("mcd", les, err, func(les LEs) string {
return fmt.Sprintf("MCD on %s/%d/%d", ifiName, MCDPort, port)