【问题标题】:tcl socket server for port range用于端口范围的 tcl 套接字服务器
【发布时间】:2015-07-31 15:29:41
【问题描述】:

我目前正在像这样启动一个 Tcl 套接字服务器:

socket -server Server 0

这让操作系统选择一个可用端口开始监听。问题是我不希望它选择 1025 到 64k 之间的任何端口,而是想知道我是否可以指定一个端口范围?像这样的:

socket -server Server 40000-41000

然后操作系统会选择一个介于 40000 和 41000 之间的可用端口供服务器监听。有没有办法做到这一点?我在 Tcl API 中找不到它,但是否有一些不错的 API 调用方式来做到这一点,而不是遍历端口范围直到找到可用端口?

【问题讨论】:

  • 为什么你需要一个客户端不可能发现的端口上的服务器?只需创建您的服务器并确保它应该操作的端口是通过命令行参数或其他一些数据驱动机制传递的。这样我认为你有足够的灵活性。
  • 服务器端口是通过另一种机制得知的。我理解你的困惑——通常像 SSH 或 SMTP 或数据库之类的东西都存在于众所周知的端口上。这种通过0 获取可用端口的机制适用于根据需要创建的动态服务器,其中许多服务器可能在同一台机器上运行,因此它们不能共享同一个端口。

标签: sockets tcl


【解决方案1】:

操作系统本身并没有提供能够做到这一点的 API,而且 Tcl 也没有为您提供一个 API,因为它实际上是一个非常罕见的需求。传统上,服务器要么监听特定端口(因此客户端可以确切地知道要请求什么服务;例如,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"
}

这是可行的,因为绑定端口失败会导致套接字创建失败(巧妙地,catchably),然后您可以尝试绑定下一个端口。扫描端口范围需要一些时间,但它会起作用。

将其包含在一个过程中可能更简洁。而 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"
}

【讨论】:

  • 请注意,这样做可能会与安全监控软件进行“有趣”的交互,并可能导致系统管理员非常担心。从操作的角度来看,选择一致的端口号几乎总是要好得多
  • 您的第一个解决方案是关于我在说“是否有一些不错的 API 调用方法可以做到这一点,而不是遍历端口范围直到找到可用端口?”时的想法。但由于没有这样的 API(感谢您确认我没有错过它),我喜欢第二个答案——我不知道新的 try 构造。绝对不那么晦涩。
【解决方案2】:

不,没有 API。

通常,服务器侦听特定端口,以便客户端可以找到服务器。所以这样的 API 并不是特别有用。

最好自己写。

【讨论】:

  • 是的,通常是这样。但是,通过0 获取可用端口的能力是为了创建动态服务器,通过查找机制使其端口已知。我不是唯一一个使用这个的人,我很确定。由于防火墙问题,我想要这个范围。我不想说“选择我任何可用的端口”,而是想在一个范围内询问它,以便该范围可以在防火墙中打开。感谢您确认在 0 参数之外不存在此类 API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
相关资源
最近更新 更多