6

次のような単純なTCPサーバーがあります。

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 をログに記録するにはどうすればよいですか?

4

3 に答える 3

10

問題は、ソケットが切断された後、特定のプロパティ ( などremoteAddress) が使用できなくなることです!

独自のオブジェクトでソケットをラップするか、接続時にそのリモートアドレスを別の場所に追跡することで、これを回避できます。(クロージャのためにウート。)

于 2012-09-16T05:30:33.107 に答える
0

特定のサーバーからの 504 エラーをデバッグしようとしているときに、このコードを変更することがわかりました

request(url, function (error, response, body) {
    if (error) {
        callback(error);
    } else {
        if (response.statusCode == 200) {
            callback(null, body);
        } else {
            // response.connection.remoteAddress is undefined here
            callback(new Error("Non status 200: " + response.statusCode + " received from " + response.connection.remoteAddress + " when requesting " + url));
        }
    }
});

このコードに

request(url, function (error, response, body) {
    if (error) {
        callback(error);
    } else {
        if (response.statusCode == 200) {
            callback(null, body);
        } else {
            // response.connection.remoteAddress is now magically set somehow
            callback(new Error("Non status 200: " + response.statusCode + " received from " + response.connection.remoteAddress + " when requesting " + url));
        }
    }
}).on('response', function(response) {
    // This next line is very important.  It seems to make the remoteAddress variable stay in the socket so we can read it.
    let remoteAddress = response.connection.remoteAddress;
});

動作するようでした。応答ハンドラーで remoteAddress 変数にアクセスすると、読み取りのために固執する理由がわかりません。

于 2019-06-12T16:07:53.800 に答える