Сценарий TCL не может настроить многоадресный сокет

Я работаю с tcl-скриптом под Ubuntu 12.04 и сталкиваюсь с некоторой проблемой, когда пытаюсь настроить многоадресный сокет. Я пытаюсь перенаправить трафик с одного сокета на многоадресный, но я не знаю почему, хотя многоадресный сокет создается хорошо; это не связано с многоадресной группой, которую я хочу.

Это скрипт, который я использую

#!/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

Кто-нибудь может сказать мне причину?

Заранее спасибо,

С уважением!

1 ответ

AFAIK, это нормально. У меня есть многоадресный демон в производстве с использованием Tcl и его udp пакет и netstat а также ss Утилиты также показывают сокет, прослушивающий подстановочный адрес.

Я полагаю, что "хитрость" заключается в том, что многоадресная передача - это один уровень вверх по стеку: присоединение к многоадресной группе - это не просто открытие сокета или конечной точки на групповом адресе, а скорее отправка очень реальной информации. IGMP сообщение "присоединиться" к локальному транспортному сегменту (Ethernet, в большинстве развертываний) и дальнейшая связь с ближайшим IGMP маршрутизаторы (опять же, по Ethernet, они в основном коммутаторы).

Так что, в вашем случае, просто запустить 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'
Другие вопросы по тегам