Сценарий 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

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

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

С уважением!


person ndarkness    schedule 15.09.2013    source источник


Ответы (1)


АФАИК, это нормально. У меня есть работающий демон многоадресной рассылки, использующий 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'
person kostix    schedule 15.09.2013
comment
Если я запускаю свой скрипт и выполняю либо первую, либо вторую команду, я не получаю никакого вывода от tcpdump, значит ли это, что сообщения igmp не отправляются? - person ndarkness; 15.09.2013
comment
@ndarkness, если имя интерфейса и адрес группы верны, то да. Попробуйте сначала создать действительно минимальный пример. Другой вопрос: вы используете стандартное ядро ​​​​дистрибутива (я имею в виду, вы уверены, что многоадресная рассылка включена)? Изучение /boot/config-$version для IGMP и multi может помочь. Также рекомендуется выполнить проверку вывода sysctl -a. - person kostix; 16.09.2013
comment
Привет, спасибо за подсказки, делающие cat /boot/config-3.5.0-39-generic | grep IGMP извлечение 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.conf.eth1.force_igmp_version = 0 net.ipv4.conf.eth2.force_igmp_version = 0 net.ipv4.conf.lo.force_igmp_version = 0 net.ipv4.igmp_max_memberships = 20 net.ipv4.igmp_max_msf = 10 - person ndarkness; 16.09.2013
comment
Более того, если я запускаю многоадресную потоковую передачу vlc локально, я могу открыть многоадресный поток в той же машине, так что я думаю, что это не проблема самой многоадресной рассылки, если проблема скрипта tcl... - person ndarkness; 16.09.2013