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

时间:2015-03-25 08:16:58

标签: sockets tcl port

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

% set serverSocket [socket -server accept 0]
sock005DBCC0

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

man页面上,我了解到我们必须使用-socknamechan 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
%

我之所以这么说是因为该列表中的端口号重复了。

2 个答案:

答案 0 :(得分:1)

对于IPv6,

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

看起来端口是65495.你得到两组三个元素,一个用于ipv4,一个用于ipv6

答案 1 :(得分:1)

该列表中有两组三个元素,因为封面下的服务器套接字实际上是两个:一个用于IPv4,一个用于IPv6。 Tcl打开两者,因为它不知道客户端将如何提前连接(除非您在使用服务器选项时使用-myaddr选项以使其只能使用一个协议)。它们理论上可以在不同的端口上,但由于Tcl试图为两者使用相同的端口,所以这是不太可能的。关于拿最后一项的想法很可能。

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

我可能会这样做:

lindex … end