2011-04-29 61 views
1

我正在創建一個Firefox附加組件,其中包含偵聽一個端口上的TCP連接的服務器。問題在於它並不總是關閉連接:在發送FIN-ACK並接收到ACK之後,如果客戶端不返回FIN-ACK,則TCP會話保持打開狀態。Firefox附加組件:懸掛TCP連接

只有一些連接沒有完全關閉。但過了一段時間,他們連接的TC連接太多,Firefox無法打開新的文件句柄,或者收到任何新的連接。

TCP localhost.localdomain:commtact-https->localhost.localdomain:46951 (CLOSE_WAIT) 

我不能找到一種方法,最好在附加的(但我也試圖在客戶端),以確保所有的TCP連接都正確關閉。這裏是服務器的功能是什麼樣的附加:

init_server: function(port) { 
server.result = {}; 
server.listener = { 
    onSocketAccepted : function(serverSocket, transport) { 
     server.result.sout = transport.openOutputStream(0,0,0); 
     var instream = transport.openInputStream(0,0,0); 
     server.result.sin = Components.classes["@mozilla.org/binaryinputstream;1"]. 
      createInstance(Components.interfaces.nsIBinaryInputStream); 
     server.result.sin.setInputStream(instream); 

     server.debug("New incoming connection"); 

     var dataListener = { 
      onStartRequest: function(request, context) { 
       server.debug("onStartRequest"); 
      }, 
      onStopRequest: function(request, context, status) { 
       server.debug("onStopRequest"); 
//    instream.close(); 
//   delete instream; 
//    server.result.sout.close(); 
//   server.result.sin.close(); 
      }, 
      onDataAvailable: function(request, context, inputStream, offset, count) { 
       var sis = Components.classes ["@mozilla.org/scriptableinputstream;1"].createInstance (Components.interfaces.nsIScriptableInputStream); 
       sis.init(inputStream); 
       var str = sis.read(count); 
       var suc = Components.classes ["@mozilla.org/intlscriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter); 
       suc.charset = "utf-8"; 
       var line = suc. ConvertToUnicode (str); 
       server.debug(line); 

       [ ... process data ... ] 

//  instream.close(); 
//  server.result.sout.close(); 
//  server.result.sin.close(); 
//  delete instream; 
      }, 
     }; 

     // Listen to new data 
     var pump = Components.classes["@mozilla.org/network/input-stream-pump;1"].createInstance(Components.interfaces.nsIInputStreamPump); 
     pump.init(instream, -1, -1, 0, 0, false); //screenserver.result.sin 
     pump.asyncRead(dataListener, null); 
    }, 
    onStopListening : function(serverSocket, status){ 
     server.debug("Client dead?"); 
     server.init_server(server.PORT); 
    }, 
}; 

    server.socket = null; 
    server.socket = Components.classes["@mozilla.org/network/server-socket;1"].getService(Components.interfaces.nsIServerSocket); 
    server.socket.init(port, true, -1); 
    server.socket.asyncListen(server.listener); 
} 

回答

2

我認爲你需要保存你在電話onSocketAccepted通過運輸,然後調用上close()

+0

這似乎工作。非常感謝 – Julien 2011-04-30 02:45:58