端口范围的 tcl 套接字服务器
tcl socket server for port range
我目前正在像这样启动一个 Tcl 套接字服务器:
socket -server Server 0
这让操作系统选择一个可用的端口开始侦听。问题是我不希望它选择 1025 到 64k 之间的任何端口,而是想知道我是否可以指定一个端口范围?像这样:
socket -server Server 40000-41000
然后操作系统会在 40000 到 41000 之间选择一个可用端口供服务器侦听。有没有办法做到这一点?我无法在 Tcl API 中找到它,但是是否有一些不错的 API 调用方式来执行此操作而不是遍历端口范围直到找到可用端口?
不,没有 API。
一般服务器会监听一个特定的端口,以便客户端可以找到服务器。所以这样的API并不是特别有用
最好自己写。
OS 本身不提供能够做到这一点的 API,并且 Tcl 不会为您包装一个,因为这实际上是一个非常罕见的要求。按照惯例,服务器要么监听特定的端口(这样客户端就可以确切地知道要请求什么服务;例如,FTP 为 21,SSH 为 22,SMTP 为 25,HTTP 为 80,SNMP 为 161,HTTPS 为 443, 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"
}
我目前正在像这样启动一个 Tcl 套接字服务器:
socket -server Server 0
这让操作系统选择一个可用的端口开始侦听。问题是我不希望它选择 1025 到 64k 之间的任何端口,而是想知道我是否可以指定一个端口范围?像这样:
socket -server Server 40000-41000
然后操作系统会在 40000 到 41000 之间选择一个可用端口供服务器侦听。有没有办法做到这一点?我无法在 Tcl API 中找到它,但是是否有一些不错的 API 调用方式来执行此操作而不是遍历端口范围直到找到可用端口?
不,没有 API。
一般服务器会监听一个特定的端口,以便客户端可以找到服务器。所以这样的API并不是特别有用
最好自己写。
OS 本身不提供能够做到这一点的 API,并且 Tcl 不会为您包装一个,因为这实际上是一个非常罕见的要求。按照惯例,服务器要么监听特定的端口(这样客户端就可以确切地知道要请求什么服务;例如,FTP 为 21,SSH 为 22,SMTP 为 25,HTTP 为 80,SNMP 为 161,HTTPS 为 443, 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"
}