NodeJS TCP Socket没有显示客户端主机名信息



假设我已经创建了一个简单的node.js TCP Socket服务器,如下所示:

var server = net.createServer(function (socket) {
  socket.end("goodbyen");
});
// 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
});

一旦建立了tcp connection,我想解析客户端试图连接的主机名。然而,socket似乎没有这些信息。

以下是我运行前面的代码(删除ip地址)时得到的结果

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

我已经通过nodejs套接字文档,但我找不到任何与主机名相关的东西。该文件实际上说,socket.localAddress将是一个IP地址,使它在我的情况下无用。

该信息在TCP层不可用。当请求到达时,您需要查看HTTP层的Host标头。当请求到达时,它将作为req.headers.host可用。http://nodejs.org/docs/latest/api/all.html all_message_headers

同样根据你的评论,试图在端口80上运行非http服务器是自找麻烦。你会一直从网络蜘蛛和僵尸网络获得连接,所以确保你的程序正确处理HTTP客户端连接并断开连接,或者可能发送HTTP错误消息。

Joe在评论中是正确的,如果你不使用HTTP,你的自定义协议将需要在你的自定义协议的第一个数据包/报头消息中从客户端传输"虚拟主机"名称到服务器。

最新更新