2012-09-16 44 views
4

我有一個簡單的TCP服務器,如下所示:爲什麼socket.remoteAddress在'end'事件上未定義?

var net = require('net'); 
var PORT = 6346; 

var server = net.createServer(function(socket) { 

    socket.on('connect', function() { 
     console.log('Client connected: ' + socket.remoteAddress); 
     socket.write('Welcome to the server!\r\n'); 
    }); 

    socket.on('end', function() { 
     console.log('Client disconnected: ' + socket.remoteAddress); 
    }); 

    socket.on('error', function() { 
     console.log('Client error: ' + socket.remoteAddress); 
    }); 

    socket.on('timeout', function() { 
     console.log('Client timed out:' + socket.remoteAddress); 
    }); 


}).listen(PORT); 

當我連接到我看到預期Client connected: 127.0.0.1但是當我拔下我看到Client disconnected: undefined服務器。爲什麼socket.remoteAddress未定義,如何在斷開連接時記錄客戶端的IP?

回答

7

問題是,在套接字斷開後,某些屬性(如remoteAddress)不再可用!

你可以通過用你自己的對象封裝套接字來解決這個問題,或者在連接的時候跟蹤那個遠程地址。 (Woot for closures。)

+0

我懷疑是這個問題。我只是沒有在文檔中看到。我想我可以在Connect事件中添加一個屬性,像這個'socket.ip = socket.remoteAddress;'對嗎? – styfle

+0

@styfle,絕對。我想我已經在我自己的應用程序中完成了這一點。我通常會對修改和對象保持謹慎,儘管我沒有創建它,但對於未來的兼容性,如果沒有其他的話。我建議在你的閉包中設置一個變量。 – Brad

+0

我該怎麼做? – styfle