NodeJS TCP套接字不显示客户端主机名信息

可以说我创build了一个简单的node.js TCP Socket服务器,如下所示。

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 }); 

一旦build立了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 套接字文档,但我无法find任何与主机名相关的任何东西。 该文件实际上说, socket.localAddress将是一个IP地址,使得它在我的情况下是无用的。

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

同样基于你的评论,试图在端口80上运行一个非HTTP服务器是很麻烦的。 您将始终获得来自Web蜘蛛和僵尸networking的连接,因此请确保您的程序正确处理HTTP客户端连接和断开连接,或者可能发送HTTP错误消息。

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