0

我在 ubuntu 12.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

谁能告诉我原因?

提前致谢,

问候!

4

1 回答 1

1

AFAIK,没关系。我在生产中使用 Tcl 及其udp包有一个多播守护程序,netstat并且ss工具还向我显示了侦听通配符地址的套接字。

我想这里的“诀窍”是多播是堆栈的上一层:加入多播组不仅仅是打开组地址上的套接字或端点,而是向IGMP本地传输发送一个非常真实的“加入”消息段(以太网,在大多数部署中)并进一步与附近的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'
于 2013-09-15T15:20:00.343 回答