2013-09-15 2 views
0

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

Это сценарий, я использую

#!/bin/sh 
# test.tcl \ 
exec tclsh "$0" ${1+"[email protected]"} 

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, это OK. У меня есть демон multicast в производстве с использованием Tcl и его пакета udp, а netstat и ss инструменты также показывают мне сокет как прослушивание подстановочного адреса.

«Уловка» здесь, я полагаю, состоит в том, что многоадресная рассылка на один уровень вверх по стеку: объединение в группу многоадресной рассылки - это не просто открытие сокета или конечной точки на групповом адресе, а отправка очень реального IGMP «join», сообщение в локальном транспортном сегменте (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' 
+0

Если я бегу мой сценарий и выполнить первый или второй команды, я не получаю какой-либо вывода из tcpdump, означает ли это, что сообщения igmp не отправляются? – ndarkness

+0

@ndarkness, если имя интерфейса и адрес группы верны, тогда да. Сначала попробуйте создать действительно минимальный пример. Другой вопрос: используете ли вы дистрибутивное ядро ​​«запаса» (я имею в виду, вы уверены, что многократное кастинг включен)? Рассмотрение '/ boot/config- $ version' для' IGMP' и 'multi' может помочь. Также рекомендуется Grepping вывод 'sysctl -a'. – kostix

+0

Привет, спасибо за подсказки, делающие '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' – ndarkness

Смежные вопросы