鉴于下面的示例脚本,我正在通过管道将 TCP 连接从一台服务器传输到另一台服务器,效果很好。
net = require "net"
log = console.log
# This server needs to receive custom data eg. (remoteAddress or an uuid)
target = net.createServer (socket) ->
log('Target connection from ' + socket.remoteAddress)
target.listen(10000, '0.0.0.0', () -> log('Target ready'))
# User-facing server that pipes to the target server
front = net.createServer (socket) ->
log('Front connection from ' + socket.remoteAddress)
socket.on 'data', (data) ->
socket.proxy = net.createConnection 10000, () ->
socket.proxy.write(data)
socket.pipe(socket.proxy).pipe(socket)
front.listen(8006, '0.0.0.0', () -> log('Front ready'))
我面临的问题是我需要将原始套接字的 IP 地址(例如 socket.remoteAddress
)传递到其他服务器。
它不需要覆盖目标的 socket.remoteAddress
,只需以一种或另一种方式检索原始 IP。
这是我测试的方法:
$ telnet 172.0.0.50 8006
Trying 172.0.0.50...
Connected to 172.0.0.50.
Escape character is '^]'.
SendingData
结果是:
Target ready
Front ready
Front connection from 172.0.0.1
Target connection from 127.0.0.1
请注意,目标
服务器接收前端
服务器的IP地址,我完全理解原因。
不幸的是,我无法使用数据
,因为它可能已被客户端完全加密。
最佳答案
另一种更简洁的方法可能是您可以在socket.proxy连接期间发送实际的remoteAddress
,然后在目标服务器上记住它。这样,您就不必增加数据开销。
此外,在您的原始代码中,您将在每个“数据”事件上与目标服务器建立新的套接字连接。我不认为这是故意的,但这样的话,如果流量很高,您很快就会达到打开文件的限制。
因此,我建议您在与前端服务器建立新的套接字连接时,仅与目标服务器建立一次套接字连接。之后,您的代码应如下所示:
var net = require("net");
const log = console.log;
target = net.createServer(function(socket) {
log('Target connection from ' + socket.remoteAddress);
socket.once('data', function(data){
socket.id = data.toString(); // Now, use socket.id whenever you want at the target server.
});
});
target.listen(10000, '0.0.0.0', function() {
log('Target ready');
});
var front = net.createServer(function(socket) {
log('Front connection from ' + socket.remoteAddress);
socket.proxy = net.createConnection(10000, function() {
socket.proxy.write(socket.remoteAddress);
});
socket.pipe(socket.proxy).pipe(socket);
});
front.listen(8006, '0.0.0.0', function() {
log('Front ready');
});
要检查服务器的连接数,您可以使用 server.getConnections 。这样,您就可以防止事情超出范围。
希望这有帮助。
关于node.js - 在两个网络服务器之间发送连接元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41019665/