//socket基本應用
//erlang程序基本寫法
-module(vpl).
-export[(run/2)].
-define(IP,"127.0.0.1").
-define(PORT,1777).
run(ThreadCount,MsgCount)->
CurrentThreadNo = -1,
CurrentMsgNo = -1,
swpan_thread(CurrentThreadNo,CurrentMsgNo,ThreadCount,MsgCount).
swpan_thread(CurrentThreadNo,CurrentMsgNo,ThreadCount,MsgCount)->
NewThreadNo = CurrentThreadNo + 1,
if
NewThreadNo == ThreadCount ->
ok;
NewThreadNo < ThreadCount ->
RetryCount = 3,
spawn(fun() ->
connect_vsp(NewThreadNo,MsgCount,RetryCount)
end),
swpan_thread(NewThreadNo,CurrentMsgNo,ThreadCount,MsgCount)
end.
connect_vsp(NewThreadNo,MsgCount,RetryCount)->
case gen_tcp:connect(?IP,?PORT,[binary]) of
{ok,Socket} ->
io:fwrite("connect success! ThreadNo=~w~n",[NewThreadNo]),
TransId = 0,
send_msg(Socket,MsgCount,TransId,NewThreadNo);
{error,Reason} ->
io:fwrite("connect failed Error=~s,ThreadNo=~w~n !",[Reason,NewThreadNo]),
NewRetryCount = RetryCount - 1,
if
NewRetryCount > 0 ->
io:fwrite("reconnect ThreadNo=~w,RetryTime=~w~n",[NewThreadNo,NewRetryCount]),
connect_vsp(NewThreadNo,MsgCount,NewRetryCount);
NewRetryCount == 0 ->
io:fwrite("reconnect ThreadNo=~w Reach Retry Max! ~n",[NewThreadNo])
end
end.
send_msg(Socket,MsgCount,TransId,NewThreadNo)->
MsgContentBin = <<"TestContent">>,
Len = string:len(binary_to_list(MsgContentBin)),
%%packet head
MsgType = 16#222,
Version=1,
ReserveInt=0,
SendMsg = binary_to_list(<<Len:32,MsgType:16,Version:16,ReserveInt:32,>>) ++ binary_to_list(MsgContentBin),
if
MsgCount == 0 ->
ok = gen_tcp:close(Socket),
io:fwrite("test over ThreadNo=~w~n",[NewThreadNo]);
MsgCount > 0 ->
NewMsgCount = MsgCount - 1,
NewTransId = TransId + 1,
case gen_tcp:send(Socket,SendMsg) of
ok ->
receive_data(Socket,NewMsgCount,NewTransId,NewThreadNo);
{error,Reason}->
io:fwrite("send failed ~s~n !",[Reason])
end
end.
receive_data(Socket,NewMsgCount,NewTransId,NewThreadNo) ->
receive
{tcp,Socket,Bin} ->
<<RecvLen:32,MsgType:16,_/binary>> = Bin,
io:fwrite("~w ~.16B ~n",[RecvLen,RecvMsg]),
send_msg(Socket,NewMsgCount,NewTransId,NewThreadNo);
{tcp_closed,Socket}->
io:fwrite("close~n")
end.