Sockets TCL脚本无法配置多播套接字

Sockets TCL脚本无法配置多播套接字,sockets,tcl,multicast,multicastsocket,tclsh,Sockets,Tcl,Multicast,Multicastsocket,Tclsh,我在Ubuntu12.04下使用tcl脚本,当我试图配置多播套接字时,我遇到了一些问题。我试图做的是将流量从某个套接字转发到多播套接字,但我不知道为什么,尽管多播套接字显然创建得很好;它没有绑定到我想要的多播组 这是我正在使用的脚本 #!/bin/sh # test.tcl \ exec tclsh "$0" ${1+"$@"} package require udp set multicastPort "50003" proc connector {unicastIP multicast

我在Ubuntu12.04下使用tcl脚本,当我试图配置多播套接字时,我遇到了一些问题。我试图做的是将流量从某个套接字转发到多播套接字,但我不知道为什么,尽管多播套接字显然创建得很好;它没有绑定到我想要的多播组

这是我正在使用的脚本

#!/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
但是,如果我运行脚本并检查系统中的端口,多播端口将不会被分配正确的多播IP,如您所见

~$ 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
谁能告诉我原因吗

提前感谢,


问候

好的,没关系。我有一个使用Tcl及其
udp
包的多播守护进程正在生产中,
netstat
ss
工具还将套接字显示为侦听通配符地址

我想,这里的“诀窍”是,多播是一个层次:加入多播组不仅仅是打开组地址上的套接字或端点,而是向本地传输段(在大多数部署中是以太网)发送非常真实的“加入”消息并进一步与附近的
IGMP
路由器通信(同样,在以太网上,它们主要是交换机)

因此,在您的情况下,只需启动
tcpdump
,看看启动程序时它会转储什么。对
tcpdump
的有用调用如下所示:

tcpdump -i eth0 -n 'igmp and host 224.0.1.1'
要观察UDP流量交换,请使用

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

如果我运行脚本并执行第一个或第二个命令,我没有从tcpdump获得任何类型的输出,这是否意味着igmp消息没有发送?@ndarkness,如果接口名称和组地址正确,则是。首先尝试创建一个非常简单的示例。另一个问题:您是否正在运行一个“库存”发行版内核(我的意思是,您确定启用了多播功能)?检查
/boot/config-$version
中的
IGMP
multi
可能会有所帮助。还建议对sysctl-a的输出进行Grepping。您好,感谢您在执行
cat/boot/config-3.5.0-39-generic | grep IGMP
retrieves
config_BRIDGE_IGMP_SNOOPING=y时提供的提示。如果我键入sysctl-a | grep igmp
得到这个
net.ipv4.conf.all.force_igmp_version=0 net.ipv4.conf.default.force_igmp_version=0 net.ipv4.conf.eth0.force_igmp_version=0 net.ipv4.max.eth2.force_igmp_version=0 net.ipv4.conf.lo.force_igmp_=0 net.ipv4.conf.igmp_20 net.ipv4.igmp_max_msf=10
。。。