2017-02-27 88 views
0

我試圖在TCL中使用socket -server accept <port>命令建立一個套接字,然後使用vwait forever循環 - 最簡單的套接字。退出TCL中的套接字而不終止應用程序

http://wiki.tcl.tk/15315

我能夠連接到服務器不錯,但我的問題是 - 如何關閉套接字,當它不再需要,而無需退出應用程序。

在我的應用程序一些背景:

  1. 它是一種新思工具與TCL的殼。

  2. 我打算使用TK構建一個GUI,理想情況下,我想在Python中爲了可伸縮性的原因開發它(通過Synopsys TCL shell加上TK接口不是常規的TCL/TK接口)。

  3. forever事件循環運行時,shell不斷偵聽 - 使應用程序自己的TCL用戶提示符不可用 - 我不希望當某些命令通過套接字運行時shell將可用,但我確實希望一旦套接字上的命令完成,shell就可用。 (我知道這將有點複雜的實現....但只是把問題了)

  4. 當我嘗試使用穿過套接字的exit命令,應用程序(整個)被關閉。

是否有任何命令可以通過套接字關閉套接字而不關閉整個應用程序?

請讓我知道是否需要更多細節。

回答

0

致電exit將退出解釋程序並導致過程關閉。通過在通道上使用close函數來關閉套接字。在連接客戶端的服務器應用程序中有兩個套接字。一旦處理了客戶端的所有事務,您的服務器代碼應在客戶端套接字上調用close。這是在您創建服務器套接字時傳入的回調函數中提供給您的代碼的。服務器套接字也需要在某個時候關閉。你如何做到這一點取決於你的應用程序和平臺。在unix系統上,你可以使用擴展來捕獲一個信號來調用這個關閉函數。或者您可能會關閉服務器以響應來自控制套接字或標準輸入通道的某些輸入。解釋器不會讀取和解析輸入,除非您添加代碼來執行此操作。使用fileevent您可以安排從多個通道讀取數據,並使用info complete,您可以從標準輸入讀取並評估輸入以獲取REPL循環進入您的服務器。一個implementation of this可以在網上找到,我想wiki也有一些例子。

+0

感謝您的鏈接!我會玩弄它,看看我是否能夠爲我的場景工作。 – sanjay