频道栏目
首页 > 程序开发 > 软件开发 > C语言 > 正文
Erlang_Demo
2011-06-27 10:27:24           
收藏   我要投稿
//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. 
点击复制链接 与好友分享!回本站首页
相关TAG标签
上一篇:Day 1:Introduction
下一篇:新手指南-序列化篇之一
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站