Created
August 30, 2013 16:14
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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