Skip to content

Instantly share code, notes, and snippets.

@joshperry
Created August 30, 2013 16:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save joshperry/6391532 to your computer and use it in GitHub Desktop.
Save joshperry/6391532 to your computer and use it in GitHub Desktop.
TCP Relay System using node.js from http://delog.wordpress.com/2011/07/19/a-tcp-relay-mechanism-with-node-js/ I would like to modify the design to have a control port to request a new socket from the server instead of having it just spin one up preemptively.
var argv = require("optimist").argv;
console.log(argv);
var net = require("net");
function connect() {
var relaySocket = new net.Socket();
var onceOnly = true;
relaySocket.connect(argv.rp, argv.rh, function() {
console.log("relay socket established");
var serverSocket = new net.Socket();
serverSocket.connect(argv.sp, argv.sh, function() {
console.log("server socket established");
});
serverSocket.on("data", function(data) {
try {
relaySocket.write(data);
} catch(ex) {
//console.log(ex);
}
});
serverSocket.on("close", function(had_error) {
console.log("server socket closed");
relaySocket.end();
});
serverSocket.on("error", function(exception) {
console.log("server socket error");
console.log(exception);
});
relaySocket.on("data", function(data) {
//console.log(data);
try {
serverSocket.write(data);
} catch(ex) {
//console.log(ex);
}
if (onceOnly) {
console.log("next relay connection established");
connect();
onceOnly = false;
}
});
relaySocket.on("close", function(had_error) {
console.log("relay socket closed");
serverSocket.end();
});
relaySocket.on("error", function(exception) {
console.log("relay socket error");
console.log(exception);
});
});
}
connect();
var argv = require("optimist").argv;
console.log(argv);
var net = require("net");
var controlSocket;
var nextSocket;
var socketPair = new Array();
var relay = net.createServer(function (socket) {
console.log("next relay socket established");
nextSocket = socket;
socket.on("data", function (data) {
var clientSocket = socketPair[uniqueKey(socket)];
if (clientSocket == undefined) {
//console.log("client socket pair not found");
socket.end();
return;
}
try {
clientSocket.write(data);
} catch(ex) {
//console.log(ex);
}
});
socket.on("close", function(had_error) {
console.log("relay socket closed");
var clientSocket = socketPair[uniqueKey(socket)];
if (clientSocket == undefined) {
console.log(" client socket pair not found");
} else {
clientSocket.end();
delete socketPair[uniqueKey(socket)];
delete socketPair[uniqueKey(clientSocket)];
}
if (nextSocket == socket) {
//requestNextSocket();
}
});
//socket.write('GET / HTTP/1.1\r\n\r\n');
});
relay.listen(argv.rp);
var server = net.createServer(function (socket) {
console.log("client socket established");
//console.log(socket);
if (nextSocket == undefined) {
console.log(" next relay socket not found");
socket.end();
return;
}
socketPair[uniqueKey(socket)] = nextSocket;
socketPair[uniqueKey(nextSocket)] = socket;
socket.on("data", function (data) {
//console.log(data);
var relaySocket = socketPair[uniqueKey(socket)];
if (relaySocket == undefined) {
//console.log("relay socket pair not found");
return;
}
try {
relaySocket.write(data);
} catch(ex) {
//console.log(ex);
}
});
socket.on("close", function(had_error) {
console.log("client socket closed");
var relaySocket = socketPair[uniqueKey(socket)];
if (relaySocket == undefined) {
console.log(" relay socket pair not found");
return;
}
relaySocket.end();
delete socketPair[uniqueKey(socket)];
delete socketPair[uniqueKey(relaySocket)];
});
});
server.listen(argv.sp);
function uniqueKey(socket) {
var key = socket.remoteAddress + ':' + socket.remotePort;
//console.log(key);
return key;
}
process.on("uncaughtException", function(err) {
console.log(err);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment