我正在创建一个服务器套接字
% set serverSocket [socket -server accept 0]
sock005DBCC0
由于我使用端口号为零,操作系统将为服务器套接字分配一个空闲端口。
在man页面上,我了解到我们必须使用-sockname
和chan configure
来获取端口号。
-sockname
对于客户端套接字(包括在创建时创建的通道) 客户端连接到服务器套接字)此选项返回一个列表 三个元素,地址,主机名和端口号 插座。如果无法计算主机名,则第二个元素是 与地址相同,即列表的第一个元素。
% chan configure $serverSocket -sockname
0.0.0.0 0.0.0.0 65495 :: :: 65495
如您所见,上面的命令返回六个元素。 ::
在这里有什么意义?它是指全球范围吗?
我的目的是获取套接字正在侦听的端口号。
因此,为了获得端口号,我可以单独检索列表的最后一个元素,如下所示吗?
% set serverPort [lindex [chan configure $serverSocket -sockname] end]
65495
%
我之所以这么说是因为该列表中的端口号重复了。
答案 0 :(得分:1)
::
相当于0.0.0.0
,即未指定的地址
(http://www.ietf.org/rfc/rfc3513.txt,页面)
看起来端口是65495.你得到两组三个元素,一个用于ipv4,一个用于ipv6
答案 1 :(得分:1)
该列表中有两组三个元素,因为封面下的服务器套接字实际上是两个:一个用于IPv4,一个用于IPv6。 Tcl打开两者,因为它不知道客户端将如何提前连接(除非您在使用服务器选项时使用-myaddr
选项以使其只能使用一个协议)。它们理论上可以在不同的端口上,但由于Tcl试图为两者使用相同的端口,所以这是不太可能的。关于拿最后一项的想法很可能。
如果您真的在意,当您有两个地址时,第一个地址将是IPv4地址,第二个地址将是IPv6地址,因此您可以使用lindex … 2
或lindex … 5
(或{ {1}})准确选择你的意思。
我可能会这样做:
lindex … end