查找服务器套接字的端口号

Finding server socket's port number

我正在创建一个服务器套接字

% set serverSocket [socket -server accept 0]
sock005DBCC0

由于我使用的端口号为零,操作系统将分配一个空闲端口给服务器套接字。

man 页面,我了解到我们必须使用 -socknamechan configure 来获取端口号。

-sockname

For client sockets (including the channels that get created when a client connects to a server socket) this option returns a list of three elements, the address, the host name and the port number for the socket. If the host name cannot be computed, the second element is identical to the address, the first element of the list.

%  chan configure $serverSocket -sockname
0.0.0.0 0.0.0.0 65495 :: :: 65495

上面的命令可以看到returns六个元素。 :: 这里的意义是什么?它指的是全球范围吗?

我的实际目的是获取套接字监听的端口号。

那么,为了获取端口号,我是否可以单独检索列表的最后一个元素,如下所示?

% set serverPort [lindex [chan configure $serverSocket -sockname] end]
65495
%

我问这个问题的原因是该列表中重复了该端口号。

:: 相当于 0.0.0.0,未指定的地址,用于 IPv6 (http://www.ietf.org/rfc/rfc3513.txt,页面)

看起来端口是 65495。您将获得两组三个元素,一组用于 ipv4,一组用于 ipv6

该列表中有两组三个元素,正是因为幕后的服务器套接字实际上有两个:一个用于 IPv4,一个用于 IPv6。 Tcl 会同时打开两者,因为它不知道客户端将如何提前连接(除非您在设置服务器选项时使用 -myaddr 选项,以便只有一种协议是可能的)。它们可以 理论上 在不同的端口上,但这真的不太可能,因为 Tcl 试图为两者使用相同的端口;你拿最后一项的想法可能没问题。

如果您真的很在意,当您有两个地址时,第一个将是 IPv4 地址,第二个将是 IPv6 地址,因此您可以使用 lindex … 2lindex … 5(或 lindex … end) 准确选择您的意思。

我可能会:

lassign [chan configure $serverSocket -sockname] serverAddress serverName serverPort