Я пытаюсь пробить отверстие TCP через два NAT в node.js. Проблема в том, что я не могу понять, как выбрать, какой локальный порт использовать соединение?Перфорация отверстий TCP в Node.js
4
A
ответ
1
Сокету назначается локальный порт. Чтобы повторно использовать один и тот же порт, вы можете подключиться к клиенту с помощью того же сокета, который использовался для связи с сервером. Это работает для вас, потому что вы выполняете перфорирование отверстий в TCP. Однако вы не можете выбрать порт самостоятельно.
Вот некоторые тестовый код:
// server.js
require('net').createServer(function(c) {
c.write(c.remotePort.toString(10));
}).listen(4434);
//client.js
var c = require('net').createConnection({host : '127.0.0.1', port : 4434});
c.on('data', function(data) {
console.log(data.toString(), c.localPort);
c.end();
});
c.on('end', function() {
c.connect({host : '127.0.0.1', port : 4434});
});
-1
После создания соединения с общим сервером, вы также должны слушать на том же локальном (!!) порт, который использовался для установления этого соединения.
Я продлил свой testcode до полного ТСР Перфорация доказательство концепции:
// server.js
var server = require('net').createServer(function (socket) {
console.log('> Connect to this public endpoint with clientB:', socket.remoteAddress + ':' + socket.remotePort);
}).listen(4434, function (err) {
if(err) return console.log(err);
console.log('> (server) listening on:', server.address().address + ':' + server.address().port)
});
// clientA.js
var c = require('net').createConnection({host : 'PUBLIC_IP_OF_SERVER', port : 4434}, function() {
console.log('> connected to public server via local endpoint:', c.localAddress + ':' + c.localPort);
// do not end the connection, keep it open to the public server
// and start a tcp server listening on the ip/port used to connected to server.js
var server = require('net').createServer(function (socket) {
console.log('> (clientA) someone connected, it\s:', socket.remoteAddress, socket.remotePort);
socket.write("Hello there NAT traversal man, this is a message from a client behind a NAT!");
}).listen(c.localPort, c.localAddress, function (err) {
if(err) return console.log(err);
console.log('> (clientA) listening on:', c.localAddress + ':' + c.localPort);
});
});
// clientB.js
// read the server's output to find the public endpoint of A:
var c = require('net').createConnection({host : 'PUBLIC_IP_OF_CLIENT_A', port : PUBLIC_PORT_OF_CLIENT_A},function() {
console.log('> (clientB) connected to clientA!');
c.on('data', function (data) {
console.log(data.toString());
});
});
Для более полной версии с сигнализации происходит на сервере, я имею в виду мой код здесь: https://github.com/SamDecrock/node-tcp-hole-punching
Найденный обходной путь, который работает для этой конкретной проблемы. Отправка ответа. –