2015-03-25 45 views
1

我創建一個服務器套接字查找服務器套接字的端口號

% 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 
% 

我問這個問題的原因是因爲該列表中重複了該端口號。

回答

1

該列表中有兩組三個元素,這正是因爲服務器套接字實際上是兩個:一個用於IPv4,一個用於IPv6。由於Tcl不知道客戶端將如何提前連接(除非在使服務器選項使其成爲只有一種協議可用時使用-myaddr選項),因此Tcl將同時打開它。他們可能會從理論上位於不同的端口,但這實際上不太可能,因爲Tcl試圖爲這兩個端口使用相同的端口;關於採取最後一項的想法可能沒問題。

如果你真的關心,當你有兩個地址第一個將是IPv4地址,第二個將是IPv6地址,所以你可以使用lindex … 2lindex … 5(或lindex … end)來接你的意思到底是什麼。

我可能會做的事:

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

@ Donal研究員:謝謝Donal幫助你。 – Dinesh 2015-03-25 11:38:32

1

::0.0.0.0相當於非指定地址,IPv6的 (http://www.ietf.org/rfc/rfc3513.txt,頁)

它看起來像端口是65495.你得到兩套三個要素,一是對於IPv4,一個對於ipv6

+0

我怕我不知道關於TCL什麼的,所以我不能幫你的最後一個問題。 – 2015-03-25 08:35:00