我试图用TCL编写代码。这个想法是编写在cisco上执行代理的代码。我的cisco是cisco 3700版本12.4,TCL的版本是8.3。我使用GNS(图形网络模拟器),因此所有组件都是虚拟的(包括Cisco)。
在我的代码中,我用两台不同的计算机打开了2个插槽:sock1和sock2。 我通过以下方式配置了这些套接字:
fconfigure $sock1 -translation binary -buffering none -blocking 0
fconfigure $sock2 -translation binary -buffering none -blocking 0
现在,我尝试在它们之间传输信息(代理)。 在我阅读时,该语言是单线程的,因此我需要使用事件。因此,我创建了两个调用函数的文件事件处理程序:
fileevent $sock1 readable [list proxy $sock1 $sock2]
fileevent $sock2 readable [list proxy $sock2 $sock1]
代理功能从第一个套接字读取数据并将其发送到另一个套接字。
代码运行良好:我在此代理服务器上转换了rdp和smb。问题是它真的很慢:大约需要1000-1100毫秒。因此,我无法通过代理使用远程桌面,甚至smbclient也非常慢。代理功能确实非常快(我检查了该功能,还尝试在该功能的开头和结尾进行打印)。因此,我假设来自os的中断非常慢(或者tcl执行脚本的速度很慢)。另外,我在Cisco的两侧打开了Wireshk,在传入消息和传出消息之间花费了第二时间。
其他信息:
我希望某些客户端可以同时通信,因此我的TCL代码定义了服务器套接字:
set server_socket [socket -server handle_conn $port]
vwait is_finish
和函数“ handle_conn”打开第二面的套接字并创建文件事件处理程序:
proc handle_conn{sock1 addr port} {
CREATE THE SECOND SOCKET (sock2)
fileevent $sock1 readable [list proxy $sock1 $sock2]
fileevent $sock2 readable [list proxy $sock2 $sock1]
}
因此,我需要异步代码(我试图编写一个同步版本:它能快速运行,但是问题是我不能同时创建多个连接(例如我的代理不适用于需要两个端口的程序,或者不能同时使用两个不同的程序)。
我无法理解问题是否出在fconfigure,tcl中的事件,gns或其他问题。 希望获得帮助!
编辑:
proc proxy {s1 s2} {
if {([eof $s1] || [eof $s2]) || ([catch {read $s1} data] || [catch {puts -nonewline $s2 $data}])} {
catch {close $s1}
catch {close $s2}
}
答案 0 :(得分:1)
我很好奇代码对您来说很慢; Tcl的速度足够快,可用于实现处理复杂内容的完整Web服务器。这让我怀疑还有其他事情在发生。例如,var theirEmail = "hello@hello.com"
var theirResponse = stringResponses.filter(function(response) {
return response[0] === theirEmail
})
命令听起来主要是只是将字节从一个通道复制到另一个通道,但是执行此操作的方法很慢,但是有快速的方法。最好的方法之一是将两个通道都置于二进制模式(proxy
),然后在异步模式下使用fconfigure $chan -translation binary
将字节移出;它已在内部进行了优化,以使用有效的缓冲区大小并限制内存缓冲区之间的复制数量。 fcopy
命令的外观如下:
proxy
移动所有内容后,将调用proc proxy {sourceChannel destinationChannel} {
fconfigure $sourceChannel -translation binary
fconfigure $destinationChannel -translation binary
fcopy $sourceChannel $destinationChannel -command [list \
copydone $sourceChannel $destinationChannel]
}
过程。这是一个基本示例,但是您可能需要更加小心,因为您的复印件在两个方向上都行进:
copydone
如果不是因为您正在cisco设备上运行,我还建议您升级正在使用的Tcl版本。正式地,很长一段时间以来一直不支持8.3。