ndarkness
ndarkness

Reputation: 1089

TCL script cannot configure multicast socket

I'm working with tcl script under ubuntu 12.04, and I'm facing some problem when I try to configure a multicast socket. What I'm trying to do is to forward traffic from some socket to a multicast one, but I don't know why although the multicast socket is created well,apparently; it isn't bound to the multicast group I want to.

This is the script I'm using

#!/bin/sh
# test.tcl \
exec tclsh "$0" ${1+"$@"}

package require udp

set multicastPort "50003"

proc connector {unicastIP multicastIP port {protocol tcp}} {

    if { [string equal $protocol "tcp"] } {

        socket -server serverTCP -myaddr $unicastIP  $port
        puts "tcp"

    } elseif {[string equal $protocol "udp" ] } {
        serverUDP $unicastIP $multicastIP $port
        puts "udp"

    }

}
proc serverUDP {unicastIP multicastIP port} {
    global multicastPort

    set socketUDP [udp_open $port]
    puts " $unicastIP"
    fconfigure $socketUDP -blocking false -translation binary -buffering none -remote [list $unicastIP $port]
    #fileevent $socketUDP readable [list gettingData $socketUDP]

    set multicastSocket [udp_open $multicastPort]
    udp_conf $multicastSocket -ttl 4
    fconfigure $multicastSocket -blocking false -translation binary -buffering none -mcastadd $multicastIP -remote [list $multicastIP $port]
    fileevent $socketUDP readable [list forwarding $socketUDP $multicastSocket ]

    #puts $socketUDP "hello!"
    #flush $socketUDP
}
proc forwarding {socketSrc socketDst} {
    set data [read -nonewline $socketSrc]
    puts "Read data-> $data"
    puts -nonewline $socketDst $data
    puts "Written data-> [read -nonewline $socketDst]"
}
connector 127.0.0.1 224.0.1.1 50000 udp
vwait forever

However if I run the script and check out the ports in my system, the multicast port is not assigned the proper multicast IP as you can see

~$ netstat -ptnlu
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

udp        0      0 0.0.0.0:50000           0.0.0.0:*                           3334/tclsh      
udp        0      0 0.0.0.0:50003           0.0.0.0:*                           3334/tclsh

Could anyone tell me the reason?

THanks in advance,

Regards!

Upvotes: 0

Views: 538

Answers (1)

kostix
kostix

Reputation: 55483

AFAIK, that is OK. I have a multicast daemon in production using Tcl and its udp package, and netstat and ss tools also show me the socket as listening on the wildcard address.

"The trick" here, I suppose, is that multicasting is one level up the stack: joining a multicast group is not merely opening a socket or an endpoint on the group address but rather sending a very real IGMP "join" message to the local transport segment (Ethernet, in most deployments) and further communicating with the nearby IGMP routers (again, on Ethernet, they're mostly switches).

So, in your case, just fire up tcpdump and see what it dumps when you start your program. A useful call to tcpdump looks something like this:

tcpdump -i eth0 -n 'igmp and host 224.0.1.1'

To observe UDP traffic exchanges use

tcpdump -i eth0 -n 'udp and host 224.0.1.1 and port 50000'

Upvotes: 1

Related Questions