我目前正在启动这样的Tcl套接字服务器:
socket -server Server 0
这使操作系统可以选择一个可用的端口来开始监听。问题是我不希望它选择1025到64k之间的任何端口,而是想知道我是否可以指定一系列端口?像这样:
socket -server Server 40000-41000
然后操作系统会选择40000到41000之间的可用端口供服务器监听。有没有办法做到这一点?我无法在Tcl API中找到它,但有没有一些很好的API调用方式来实现它而不是遍历端口范围直到找到可用的端口?
答案 0 :(得分:1)
不,没有API。
通常,服务器侦听特定端口,以便客户端可以找到服务器。所以这样的API并不是特别有用。
最好自己写一下。
答案 1 :(得分:1)
操作系统本身并没有提供能够做到这一点的API,而且Tcl并没有为你提供一个,因为它实际上是一个非常罕见的要求。传统上,服务器要么监听特定的端口(因此客户端可以准确地知道要求的服务;例如,21用于FTP,22用于SSH,25用于SMTP,80用于HTTP,161用于SNMP,用于443用于HTTPS,993用于安全IMAP )或客户有一些其他方式被告知要求什么,真正的任何端口将做(0是特殊的“选择卡,任何卡”地址)。您可以向Tcl服务器套接字询问它实际使用的端口fconfigure
:
set portNumber [lindex [fconfigure $socket -sockname] 2]
但要在特定范围内的端口上获取服务器套接字?没有API。我们必须自己做饭:
for {set port 40000} {$port <= 41000} {incr port} {
if {![catch {
set sock [socket -server $yourHandler $port]
}]} then {
break
}
}
# If we failed...
if {![info exist sock]} {
error "No ports free in range 40k-41k"
}
这是有效的,因为未能绑定端口将使套接字创建失败(整齐地,catch
干净)然后您可以尝试绑定下一个端口。扫描端口范围需要一段时间,但它会起作用。
在程序中将它包装起来可能更整洁。而Tcl 8.6的try
结构将使代码不那么模糊:
proc portInRange {from to handler} {
for {set p $from} {$p <= $to} {incr p} {
try {
return [socket -server $handler $p]
} on error {} continue
}
error "No ports free in range $from-$to"
}