2015-05-19 1 views
0

Я разрабатываю надстройку firefox, которая использует серверный сокет, и я обнаружил, что могу открывать сокеты сервера с тем же адресом: порт, что очень странно. Я проверил с netstat, и я был в шоке.Firefox sdk addon: Очень странно, я могу открыть 2 серверных сокета по одному адресу: port

Поведение этой вещи состоит в том, что первый открытый серверный сокет принимает все соединения, а затем, когда он закрыт, второй начинает принимать новые соединения.

Более интересно то, что если я открою сокет сервера с java, то я не могу открыть другой серверный сокет с аддоном Firefox. Таким образом, для этой проблемы должны быть некоторые флаги, но я не могу найти что-либо в API-интерфейсе sdk, чтобы избежать этой проблемы.

Я делаю тестирование под Windows 7.

Я хотел бы, чтобы обнаружить, что серверный сокет уже открыт, мгновенно. Я не хочу открывать клиентский сокет, чтобы проверить это. Есть идеи?

Вот как я открываю сокет, не очень сложно ...

try 
{ 
    serverSocket = Cc["@mozilla.org/network/server-socket;1"].createInstance(Ci.nsIServerSocket); 
    serverSocket.init(listenPort, true, 100); 
    serverSocket.asyncListen(listener); 
} 
catch(error) 
{ 
    console.log(error); 

ответ

0

Хорошо, после того, как много поисков, я могу только предложить решения этой проблемы. Просто проверьте, открыт ли сокет сервера. Это решение очень быстро и работает. Ниже приведен код для создания ServerSocket, чтобы избежать этой проблемы:

const {Cc, Ci, Cu, components} = require("chrome"); 

const gThreadManager = Cc["@mozilla.org/thread-manager;1"].getService(); 

function ServerSocket(){ 

    function checkFreePort(port, callback, error){ 
     try{   
      var bRead = false; 
      var socket_service = Cc["@mozilla.org/network/socket-transport-service;1"].getService(Ci.nsISocketTransportService); 

      // we open a socket client to test if there is a server socket listening 
      socket = socket_service.createTransport(null, 0, "127.0.0.1", port, null); 
      socket.setEventSink ({ 
       onTransportStatus : function(transport, status){ 
        if (status == nsISocketTransport.STATUS_CONNECTED_TO) // connected 
        { 
         if (!bRead) 
         { 
          bRead = true; 
          try{ 
           socket.close(); 
          }catch(ex){ 
           console.log(ex); 
          } 
          // connected to the server socket, so we return error 
          error(); 
         } 
        } 
       } 
      }, gThreadManager.mainThread); 

      // we put a timeout to avoid the block of the extension forever, 2 seconds should be enougth for localhost 
      // actually tests shows that the socket replies instantly if there is no server socket listening on the onInputStreamReady 
      socket.setTimeout(0, 2000); 

        var input = socket.openInputStream(Ci.nsITransport.OPEN_BLOCKING,0,0); 


      input.asyncWait({ 
       onInputStreamReady: function(input) { 
        try 
        { 
         // if there is no server socket listening, we get onInputStreamReady and reading the stream will throw an error... 

         if (bRead) // we detected the connection before, so we have finished 
          return; 
         var sin = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); 
         sin.init(input); 
         sin.read(1); 
         bRead = true; 
         // we read something, code should never execute this because we must be connected before and we have controlled it 
         // but... just in case... 
         error(); 

        } 
        catch(ex) { 
         // error reading, the socket can't connect, so it is ok for us 
         bRead = true; 
         callback(); 
        }   
        finally 
        { 
         sin.close(); 
         input.close(); 
        } 
       } 
      }, 0, 0, gThreadManager.mainThread); 
     } 
     catch(error2) 
     { 
      console.log("Unexpected error: " + error2); 
      error(); 
     } 

    } 

} 

ServerSocket.prototype = { 
    listen: function(port, listener, errorCallback){ 
     checkFreePort(port, function(){ 
      serverSocket.init(port, true, 100); 
      serverSocket.asyncListen(listener); 
     }, errorCallback); 
    } 
} 


var listener = { 
     onSocketAccepted: function(serverSocket, clientSocket) { 
      console.log("Accepted connection on " + clientSocket.host + ":" + clientSocket.port); 

      // do stuff 

     } 
    }; 


var server = new ServerSocket(8080, listener, function(){ 
    console.log("Error creating server socket"); 
});