2

次のように単純な node.js TCP ソケット サーバーを作成したとしましょう。

var server = net.createServer(function (socket) {
  socket.end("goodbye\n");
});
// listen on port 80, like a webserver would, and configured to accept connections to multiple hosts, ie test.example.com, sdfsdfsdf.example.com, example2.com. 
server.listen(80, function() {
  address = server.address();
  console.log("opened server on %j", address);
});

server.on('connection', function(socket) {
    //log('connection data', socket);
    log('CONNECTED SOCKET DATA', socket.address());
    log('CONNECTED LOCAL, %s:%s', socket.localAddress, socket.localPort);
    log('CONNECTED %s:%s', socket.remoteAddress, socket.remotePort);

    //How do I find the server hostname that the client connected to?
    // eg test.example.com or example2.com
});

TCPconnectionが作成されたら、クライアントが接続しようとしたホスト名を解析したいと思います。ただし、socketはこの情報を持っていないようです。

以下は、前のコードを実行したときに得られたものです (削除された IP アドレス)

CONNECTED SOCKET DATA { port: 80, family: 2, address: '[SERVER IP ADDRESS]' }
CONNECTED LOCAL, undefined:undefined
CONNECTED [CLIENT IP ADDRESS]:13263

nodejsソケットのドキュメントを調べましたが、ホスト名に関連するものは見つかりません。ドキュメントには、実際にはsocket.localAddressIP アドレスになると記載されていますが、私の場合は役に立たなくなります。

4

1 に答える 1

1

その情報は、TCP 層では利用できません。リクエストが到着したらHost、レイヤーのヘッダーを確認する必要があります。これは、リクエストが到着した時点HTTPで使用可能になります。http://nodejs.org/docs/latest/api/all.html#all_message_headersreq.headers.host

また、コメントに基づいて、ポート 80 で非 HTTP サーバーを実行しようとすると、問題が発生します。Web スパイダーやボットネットから常に接続を取得するため、プログラムが接続している HTTP クライアントを適切に処理して切断するか、HTTP エラー メッセージを送信するようにしてください。

HTTP を使用していない場合、カスタム プロトコルは、カスタム プロトコルの最初のパケット/ヘッダー メッセージでクライアントからサーバーに「仮想ホスト」名を送信する必要があるというコメントで Joe は正しいです。

于 2013-05-25T02:34:53.137 に答える