Mercurial > luasocket
comparison etc/forward.lua @ 0:4b915342e2a8
LuaSocket 2.0.2 + CMake build description.
author | Eric Wing <ewing . public |-at-| gmail . com> |
---|---|
date | Tue, 26 Aug 2008 18:40:01 -0700 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4b915342e2a8 |
---|---|
1 -- load our favourite library | |
2 local dispatch = require("dispatch") | |
3 local handler = dispatch.newhandler() | |
4 | |
5 -- make sure the user knows how to invoke us | |
6 if table.getn(arg) < 1 then | |
7 print("Usage") | |
8 print(" lua forward.lua <iport:ohost:oport> ...") | |
9 os.exit(1) | |
10 end | |
11 | |
12 -- function to move data from one socket to the other | |
13 local function move(foo, bar) | |
14 local live | |
15 while 1 do | |
16 local data, error, partial = foo:receive(2048) | |
17 live = data or error == "timeout" | |
18 data = data or partial | |
19 local result, error = bar:send(data) | |
20 if not live or not result then | |
21 foo:close() | |
22 bar:close() | |
23 break | |
24 end | |
25 end | |
26 end | |
27 | |
28 -- for each tunnel, start a new server | |
29 for i, v in ipairs(arg) do | |
30 -- capture forwarding parameters | |
31 local _, _, iport, ohost, oport = string.find(v, "([^:]+):([^:]+):([^:]+)") | |
32 assert(iport, "invalid arguments") | |
33 -- create our server socket | |
34 local server = assert(handler.tcp()) | |
35 assert(server:setoption("reuseaddr", true)) | |
36 assert(server:bind("*", iport)) | |
37 assert(server:listen(32)) | |
38 -- handler for the server object loops accepting new connections | |
39 handler:start(function() | |
40 while 1 do | |
41 local client = assert(server:accept()) | |
42 assert(client:settimeout(0)) | |
43 -- for each new connection, start a new client handler | |
44 handler:start(function() | |
45 -- handler tries to connect to peer | |
46 local peer = assert(handler.tcp()) | |
47 assert(peer:settimeout(0)) | |
48 assert(peer:connect(ohost, oport)) | |
49 -- if sucessful, starts a new handler to send data from | |
50 -- client to peer | |
51 handler:start(function() | |
52 move(client, peer) | |
53 end) | |
54 -- afte starting new handler, enter in loop sending data from | |
55 -- peer to client | |
56 move(peer, client) | |
57 end) | |
58 end | |
59 end) | |
60 end | |
61 | |
62 -- simply loop stepping the server | |
63 while 1 do | |
64 handler:step() | |
65 end |