Networking Firefox插件:挂起TCP连接

Networking Firefox插件:挂起TCP连接,networking,firefox-addon,Networking,Firefox Addon,我正在创建一个Firefox附加组件,其中包含在一个端口上侦听TCP连接的服务器。问题在于它并不总是关闭连接:在发送FIN-ACK并接收到ACK后,如果客户端不发送FIN-ACK作为返回,TCP会话将保持打开状态 只有一些连接没有完全关闭。但是过了一段时间,它们挂起了太多的TC连接,Firefox无法打开新的文件句柄,也无法接收任何新的连接 TCP localhost.localdomain:commtact-https->localhost.localdomain:46951 (CLOS

我正在创建一个Firefox附加组件,其中包含在一个端口上侦听TCP连接的服务器。问题在于它并不总是关闭连接:在发送FIN-ACK并接收到ACK后,如果客户端不发送FIN-ACK作为返回,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);
}

我认为您需要保存在call
onSocketAccepted
中传递的传输,然后在此调用上调用
close()