0

我开始学习 tcl 脚本语言,我正在尝试做一个 tcl 脚本,它通过单播网络隧道传输所有多播数据包。

由于我是tcl的新手,所以我想问点:

  1. 我正在使用 Eclipse 在 tcl 中进行编码,我已经安装了所需的插件,并且我认为还有所有的包,但是,Eclipse 强调了我下面的调用

    fconfigure $sockMulticast -buffering none -mcastadd $ipMulticast -translation binary -remote [list $ipMulticast $port]
    

    说有额外的论点,我不明白,因为在这里可以阅读:

    Pat 写道:“多播与标准单播或广播 UDP 略有不同。您的操作系统会忽略多播数据包,除非应用程序已明确加入多播组。在 TclUDP 的情况下,我们通过使用

    fconfigure $socket -mcastadd $mcastaddress
    
  2. 当我配置 TCP 套接字(单播)时,我应该在调用时再次指定目标单播 IPfconfigure吗?

代码:

#!/bin/sh
# updToTcp.tcl \
exec tclsh "$0" ${1+"$@"}

package require udp

set ::connectionsMulticast [list]
set ::connectionsUnicast [list]

proc udp_connect {ipMulticast ipUnicast port {multicast false}} {

    #Open UDP multicast socket
    set sockMulticast [udp_open $port]  
    if {$multicast} {
        #configures the multicast port
        fconfigure $sockMulticast -buffering none -mcastadd $ipMulticast -translation binary -remote [list $ipMulticast $port] ;#(1)
        #update the list of multicast connections with the socket
        lappend ::connectionsMulticast[list $ipMulticast $port $socketMulticast]

        #Open TCP unicast socket
        set sockUnicast [socket $ipUnicast $port]
        #configures the unicast port
        fconfigure $sockUnicast -buffering none -translation binary;#(2)
        #update the list of unicast connections with the socket
        lappend ::connectionsMulticast[list $ipUnicast $port $socketUnicast]

        #listen to the multicast socket, and forwarding the data to the unicast one
        fileevent $sockMulticast readable [list ::dataForwarding $sockMulticast $sockUnicast]
    }
}

    proc dataForwarding {socketSrc socketDst} {
    #get the data from the source socket, and place it on data
    set data [read $socketSrc]
    #placing the data in the destination socket
    puts -nonewline $socketDst $data
    return
    }
4

1 回答 1

1

在第一点上,Eclipse 是完全错误的。该fconfigure命令可以采用任意数量的选项/值对(或单个选项来检索一个值,或者没有选项来一次检索多个值——尽管不一定是全部;串行通道有一些奇怪的特性,但它们并不重要你现在)。不幸的是,他们错了,但它确实发生了。

关于第二点,我不会尝试更改 TCP 端点的 IP 地址。你不能这样做(严格来说,不是 Tcl 的绑定;我根本不知道你是否可以这样做)。TCP 和 UDP 通道对可以更改的内容和时间有非常不同的限制(因为 TCP 通道使用握手协议在两个端口之间建立连接会话,而 UDP 则完全没有这种限制;反过来,TCP 通道可以被视为可靠的流,而 UDP 根本不是流协议,没有会话/连接)。

您的lappend通话也有问题;您省略了变量名称和附加到这些全局列表的值之间的关键空格。这意味着您希望保存连接信息列表的全局变量实际上不会这样做;相反,您会得到许多名称完全不切实际的奇怪变量。如果您添加 IPv6 支持(因为它可以用于::IP 地址的呈现,尽管它也是 Tcl 命名空间分隔符),这一切都将完全崩溃。立即修复;以后给自己省点麻烦……

于 2013-08-13T18:30:40.467 回答