Skip to content

Instantly share code, notes, and snippets.

@Yaffle
Created November 21, 2011 05:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Yaffle/1381713 to your computer and use it in GitHub Desktop.
Save Yaffle/1381713 to your computer and use it in GitHub Desktop.
udpproxy in node.js
/*jslint node: true, indent: 2 */
"use strict";
var httpPort = 4022;
var http = require('http');
var dgram = require('dgram');
var querystring = require('querystring');
var udpSockets = {};
http.createServer(function (request, response) {
var ipAddress = request.socket.remoteAddress,
socket,
m;
request.socket.setTimeout(0);
console.log("New HTTP connection from: " + ipAddress);
// request.url should be "/udp/239.255.0.0:1234/", 224-239.0-255.0-255.0-255, port 0 - 65535
m = request.url.match(/^\/udp\/((?:22[4-9]|23[0-9])(?:\.(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3})\:(\d+)/);
if (!m) {
response.writeHead(400);
response.end();
}
response.writeHead(200);
m = {
port: Math.min(65535, +m[2]),
address: m[1]
};
function onSocketMessage(message) {
response.write(message);
}
socket = udpSockets[m.address + ':' + m.port];
if (!socket) {
socket = dgram.createSocket('udp4');
socket.bind(m.port, m.address);
udpSockets[m.address + ':' + m.port] = socket;
socket.setMaxListeners(0);
}
socket.on('message', onSocketMessage);
request.on('close', function () {
socket.removeListener('message', onSocketMessage);
if (!socket.listeners('message').length) {
socket.close();
delete udpSockets[m.address + ':' + m.port];
}
console.log("Closed HTTP connection: " + ipAddress);
response.end();
});
}).listen(httpPort);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment