[erlang-questions] programming with sockets
LUKE
luke@REDACTED
Thu Nov 22 07:42:05 CET 2007
The first version will stop to receive data.
30> redir:start(8001,www.program.com.tw,80).
<0.27388.1>
When i connect to 127.0.0.1 8001.
31> 3.closed
But the next code can work correctly.
============================================================
-module(redir).
-export([start/3,accept/3,doLocalRecv/2,doRemoteRecv/2,disPatch/3]).
-define(TCP_OPTIONS,[list, {packet, 0}, {active, false}, {reuseaddr, true}]).
start(LPort,RHost,RPort)->
case gen_tcp:listen(LPort,?TCP_OPTIONS) of
{ok, ListenSocket}->spawn(redir,accept,[ListenSocket,RHost,RPort]);
{error,Why}->io:format("socket error0:~p~n",[Why])
end.
accept(ListenSocket,RHost,RPort) ->
case gen_tcp:accept(ListenSocket) of
{ok, AcceptSocket}->spawn(redir,disPatch,[AcceptSocket,RHost,RPort]);
{error,Why}->io:format("socket error1:~p~n",[Why])
end,
accept(ListenSocket,RHost,RPort).
disPatch(AcceptSocket,RHost,RPort)->
case gen_tcp:connect(RHost,RPort,?TCP_OPTIONS) of
%% ConnectSocket:server to remote ;AcceptSocket:client to server
{ok,ConnectSocket}->
spawn(redir,doRemoteRecv,[ConnectSocket,AcceptSocket]),
spawn(redir,doLocalRecv,[AcceptSocket,ConnectSocket]);
{error,Reason}->io:format("1.~p~n",[Reason])
end.
doLocalRecv(AcceptSocket,ConnectSocket) ->
case gen_tcp:recv(AcceptSocket,0) of
{ok,Packet} ->gen_tcp:send(ConnectSocket,Packet),doLocalRecv(AcceptSocket,ConnectSocket);
{error,Reason}->io:format("2.~p~n",[Reason])
end.
doRemoteRecv(ConnectSocket,AcceptSocket)->
case gen_tcp:recv(ConnectSocket,0) of
{ok,Packet} ->gen_tcp:send(AcceptSocket,Packet),doRemoteRecv(ConnectSocket,AcceptSocket);
{error,Reason}->io:format("3.~p~n",[Reason])
end.
============================================================
-module(redir).
-export([start/3,accept/3,doLocalRecv/2,doRemoteRecv/2]).
-define(TCP_OPTIONS,[list, {packet, 0}, {active, false}, {reuseaddr, true}]).
start(LPort,RHost,RPort)->
case gen_tcp:listen(LPort,?TCP_OPTIONS) of
{ok, ListenSocket}->
case gen_tcp:connect(RHost,RPort,?TCP_OPTIONS) of
%% ConnectSocket:server to remote ;AcceptSocket:client to server
{ok,ConnectSocket}->
spawn(redir,doRemoteRecv,[ConnectSocket,AcceptSocket]),
spawn(redir,doLocalRecv,[AcceptSocket,ConnectSocket]);
{error,Reason}->io:format("1.~p~n",[Reason])
end;
{error,Why}->io:format("socket error0:~p~n",[Why])
end.
accept(ListenSocket,RHost,RPort) ->
case gen_tcp:accept(ListenSocket) of
{ok, AcceptSocket}->spawn(redir,disPatch,[AcceptSocket,RHost,RPort]);
{error,Why}->io:format("socket error1:~p~n",[Why])
end,
accept(ListenSocket,RHost,RPort).
doLocalRecv(AcceptSocket,ConnectSocket) ->
case gen_tcp:recv(AcceptSocket,0) of
{ok,Packet} ->gen_tcp:send(ConnectSocket,Packet),doLocalRecv(AcceptSocket,ConnectSocket);
{error,Reason}->io:format("2.~p~n",[Reason])
end.
doRemoteRecv(ConnectSocket,AcceptSocket)->
case gen_tcp:recv(ConnectSocket,0) of
{ok,Packet} ->gen_tcp:send(AcceptSocket,Packet),doRemoteRecv(ConnectSocket,AcceptSocket);
{error,Reason}->io:format("3.~p~n",[Reason])
end.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20071122/b60c6243/attachment.htm>
More information about the erlang-questions
mailing list