Multicast Packets

175 views
Skip to first unread message

webuser 1300

unread,
Jan 6, 2022, 7:01:30 PM1/6/22
to golang-nuts
I have a python script that receives the packets, but when I try and do the same in go I get nothing back. Can someone please take a look?

func main() {
        //udp  := "10.239.59.108:14310"
        //"224.0.31.1/24"
        //"bond0.181"
        c, err := net.ListenPacket("udp4", "10.239.59.108:14310")
        if err != nil {
                println(err)
        }
       
        en0, err := net.InterfaceByName("eno1")
        if err != nil {
                print(err)
                // error handling
        }
        p := ipv4.NewPacketConn(c)
        if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 31, 1)}); err != nil {
                println(err)
        }
        b := make([]byte, 1500)
        for {
                n, cm, src, err := p.ReadFrom(b)
                println(n, src)
                if err != nil {
                        print(err)
                        // error handling
                }
                if cm.Dst.IsMulticast() {
                        print(100)
                }
        }
}

-----------------------------------------------
import sys
import socket
import struct


def help_and_exit(prog):
    print('Usage: ' + prog + ' from_nic_by_host_ip mcast_group_ip mcast_port')
    sys.exit(1)

def mc_recv(fromnicip, mcgrpip, mcport):
    bufsize = 1024

    # This creates a UDP socket
    receiver = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM, \
            proto=socket.IPPROTO_UDP, fileno=None)

    bindaddr = (mcgrpip, mcport)
    receiver.bind(bindaddr)

    if fromnicip == '0.0.0.0':
        mreq = struct.pack("=4sl", socket.inet_aton(mcgrpip), socket.INADDR_ANY)
    else:
        mreq = struct.pack("=4s4s", \
            socket.inet_aton(mcgrpip), socket.inet_aton(fromnicip))
    receiver.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

    # Receive the mssage
    for i in range(100):
        buf, senderaddr = receiver.recvfrom(1024)
        print(i, len(buf))

    # Release resources
    receiver.close()

    return msg

def main(argv):
    if len(argv) < 4:
        help_and_exit(argv[0])

    fromnicip = argv[1]
    mcgrpip = argv[2]
    mcport = int(argv[3])


    msg = mc_recv(fromnicip, mcgrpip, mcport)
    print(msg)

if __name__=='__main__':
    main(sys.argv)

webuser 1300

unread,
Jan 6, 2022, 10:47:14 PM1/6/22
to golang-nuts
This worked:

func main() {
    ipv4Addr := &net.UDPAddr{IP: net.IPv4(224, 0, 31, 1), Port: 14310}
    conn, err := net.ListenUDP("udp4", ipv4Addr)
    if err != nil {
        fmt.Printf("ListenUDP error %v\n", err)
        return
    }

    pc := ipv4.NewPacketConn(conn)
    iface, err := net.InterfaceByName("bond0.181")
    if err != nil {
        fmt.Printf("can't find specified interface %v\n", err)
        return
    }
    if err := pc.JoinGroup(iface, &net.UDPAddr{IP: net.IPv4(224, 0, 31, 1)}); err != nil {
        return
    }

    buf := make([]byte, 1024)
    for {
        if n, addr, err := conn.ReadFrom(buf); err != nil {
            fmt.Printf("error %v", err)
        } else {
                println(n, addr)
        }
    }

    return
}
 
Reply all
Reply to author
Forward
0 new messages