node.js - NodeJS TCP Socket 不显示客户端主机名信息

标签 node.js sockets tcp

假设我已经创建了一个简单的 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 地址,这在我的情况下是无用的。

最佳答案

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

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

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

关于node.js - NodeJS TCP Socket 不显示客户端主机名信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16745745/

相关文章:

javascript - C# UWP 中的发射格式

javascript - 如何使用 try、catch 在错误处理中打印消息

node.js - Sonarqube 未检测到使用 mocha 生成的 LCOV 报告

java - 如何从通过 Bungeecord 运行的另一台 Paper Spigot 服务器获取玩家计数

.net - 异步套接字服务器C#,如何从AsyncCallback获取数据

ios - GCDAsyncSocket 在传输数据时更改数据

java - Netty 4.0 channel.id() 返回负整数?

node.js - Node.js 的 Connect、Express 和 "middleware"是什么?

java - 对象序列化与字符串

c++ - 为什么在服务器和客户端的 sin_port 中指定相同的端口?