程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Erlang_Demo

Erlang_Demo

編輯:關於C語言

//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. 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved