在两个Net服务器之间发送连接元数据

鉴于下面的示例脚本我pipe道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。

这是我如何testing这个:

 $ 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 

请注意, target服务器接收front服务器的IP地址,我完全明白为什么。

不幸的是,我不能使用这些data因为它可能被客户端完全encryption。

另一个更简洁的方法是,您可以在socket.proxy连接期间发送实际的remoteAddress ,然后在目标服务器上记住它。 这样,您不必为数据添加开销。

同样在你的原始代码中,你正在每一个“数据”事件上build立一个新的套接字连接到目标服务器。 我不认为这是有意的,但这样,如果stream量很高,你很快就会打开文件限制。

所以我build议你在与前台服务器有一个新的套接字连接时只做一次到目标服务器的套接字连接。 之后,你的代码应该是这样的:

 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 。 这样,你可以防止事情发生。

希望这可以帮助。

思考更多关于不需要关注数据的解决scheme,有一个重要的事实,即两个服务器都知道打开目标连接的套接字端口。 它是前连接套接字的socket.remotePort和目标服务器套接字的socket.remotePort

这个事实使得build立一个端口/ IP地图成为可能:

 net = require "net" log = console.log portMap = {} # This server needs to receive custom data eg. (remoteAddress or an uuid) target = net.createServer (socket) -> socket.once 'data', (data) -> socket.id = portMap[socket.remotePort] log('Target connection from ' + socket.id); 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.once 'data', (data) -> socket.proxy = net.createConnection 10000, () -> portMap[socket.proxy.localPort] = socket.remoteAddress; socket.proxy.write(data) socket.pipe(socket.proxy).pipe(socket) front.listen(8006, '0.0.0.0', () -> log('Front ready'))