Sockets TCL脚本无法配置多播套接字
我在Ubuntu12.04下使用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
#!/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
retrievesconfig_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
。。。