我需要运行一个用 Tcl 编写的 web 服务器,它默认依赖一个硬编码的端口号来监听,虽然我担心如果该端口已经被使用,它可能会导致它失败。它确实允许您将端口号作为参数传递,但如果您还不确定它是一个未使用的端口,则可能会导致同样的问题。
我设计了以下方法来获得一个似乎可以工作的未使用端口(见最后一行的旁边),并且失败的机会(即端口在中间时间被使用)似乎比仅仅依赖要渺茫得多一个随机选择的端口号。尽管如此,我并不完全满意,并且想知道还有哪些其他方法可以实现这一目标。
proc noop {chan addr port} {
}
set chan [socket -server noop 0]
set sockname [chan configure $chan -sockname]
chan close $chan
set port [lindex $sockname end] ;# e.g. 51922
set chan2 [socket -server noop $port] ;# test re-usability of port
chan close $chan2
实际上,您可以做的事情并不多,因为理论上当您没有自己打开套接字时,可以随时打开套接字,但要保持在临时端口范围之外(即,从 32768 (0x8000) 到 65535 ( 0xFFFF)) 会有所帮助,因为这样您就不会遇到 TCP 连接客户端自动分配端口的问题。
以普通用户身份运行的本地网络服务器的常用端口号为 8000 和 8080(HTTPS 为 8443),但实际端口号通常并不重要。关键是您通常将这些端口作为机器整体计划的一部分进行规划;您可以有一个很好的想法,因为您可以控制系统,因此不会有任何干扰。VM 使这一切变得相当简单(并且在完全部署方案中,您使用 apache 或 nginx 代理使所有内容都出现在系统保护的端口 80 和 443 后面)。
或者,您可以让真实系统打开伪端口 0(如在您的脚本中),然后在继续为该端口提供真实服务之前报告它实际分配的端口。这是对您现在所做工作的一个微不足道的扩展……在一个层面上,但要求您的整个系统设置为非常量端口号。这可能很困难,而且通常只对测试框架有用(Tcl 自己的测试套件大量使用这个技巧)或者底层协议从头开始设计以这种方式工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句