假设我已经创建了一个简单的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
});
一旦创建了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 documentation,但我无法找到与主机名相关的任何内容。文档实际上说socket.localAddress
将是一个IP地址,在我的情况下使它无用。
答案 0 :(得分:1)
TCP层无法获得该信息。当请求到达时,您需要查看Host
图层上的HTTP
标头。当请求到达时,这将以req.headers.host
的形式提供。 http://nodejs.org/docs/latest/api/all.html#all_message_headers
同样根据您的评论,尝试在端口80上运行非HTTP服务器会遇到麻烦。您将始终从Web蜘蛛和僵尸网络获得连接,因此请确保您的程序正确处理HTTP客户端连接和断开连接,或者发送HTTP错误消息。
Joe在评论中是正确的,如果您不使用HTTP,您的自定义协议将需要在您的自定义协议的第一个数据包/标头消息中将“虚拟主机”名称从客户端传输到服务器。