Socket statistics

Ulf Wiger (AL/EAB) ulf.wiger@REDACTED
Tue Apr 19 11:14:10 CEST 2005


On April 19 2005 10:18, Joe wrote:
> 
>     Good morning Gurus
> 
>     Are there any Erlang functions for obtaining socket statistics?
> 
>     I'd like something like:
> 
> 	Stats = gen_tcp:statistics(Socket),
> 
>    Stats should then contain some "amazingly interesting" 
> (sic) information.
> For example, total time of session number of packets 
> sent/received, packet losses etc. 


Can't find anything in the docs, but looking at the 
Source, I found this (below). Apparently, packet loss
is not one of the things counted.

/Uffe

=:=:=:=:=:=:=:=:=:=:=

-module(inet).

-export([getstat/1, getstat/2]).

getstat(Socket) ->
    prim_inet:getstat(Socket, stats()).

getstat(Socket,What) ->
    prim_inet:getstat(Socket, What).

=:=:=:=:=:=:=:=:=:=:=


-module(prim_inet).
-export([..., getstat/2, ...]).

...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% GETSTAT(insock(), StatList) -> {ok,StatReply} | {error, Reason}
%%
%% get socket statistics (from driver)
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

getstat(S, Stats) when port(S),list(Stats) ->
    case encode_stats(Stats) of
        {ok, Bytes} ->
            case ctl_cmd(S, ?INET_REQ_GETSTAT, Bytes) of
                {ok, Data} -> decode_stats(Data);
                Error -> Error
            end;
        Error -> Error
    end.

...

encode_stats(L) ->
    case catch enc_stats(L) of
        List when list(List) -> {ok, List};
        Error -> Error
    end.

enc_stats([H|T]) ->
    case H of
        recv_cnt  -> [?INET_STAT_RECV_CNT | enc_stats(T)];
        recv_max  -> [?INET_STAT_RECV_MAX | enc_stats(T)];
        recv_avg  -> [?INET_STAT_RECV_AVG | enc_stats(T)];
        recv_dvi  -> [?INET_STAT_RECV_DVI | enc_stats(T)];
        send_cnt  -> [?INET_STAT_SEND_CNT | enc_stats(T)];
        send_max  -> [?INET_STAT_SEND_MAX | enc_stats(T)];
        send_avg  -> [?INET_STAT_SEND_AVG  | enc_stats(T)];
        send_pend -> [?INET_STAT_SEND_PEND | enc_stats(T)];
        send_oct  -> [?INET_STAT_SEND_OCT  | enc_stats(T)];
        recv_oct  -> [?INET_STAT_RECV_OCT  | enc_stats(T)];
        _ -> throw({error, einval})
    end;
enc_stats([]) -> [].


decode_stats(Bytes) -> 
    case catch dec_stats(Bytes) of
        List when list(List) -> {ok, List};
        Error -> Error
    end.


dec_stats([?INET_STAT_SEND_OCT,X7,X6,X5,X4,X3,X2,X1,X0 | R]) ->
    Val = ?u64(X7,X6,X5,X4,X3,X2,X1,X0),
    [{send_oct, Val} | dec_stats(R)];
dec_stats([?INET_STAT_RECV_OCT,X7,X6,X5,X4,X3,X2,X1,X0 | R]) ->
    Val = ?u64(X7,X6,X5,X4,X3,X2,X1,X0),
    [{recv_oct, Val} | dec_stats(R)];
dec_stats([X,X3,X2,X1,X0 | R]) ->
    Val = ?u32(X3,X2,X1,X0),
    case X of
        ?INET_STAT_RECV_CNT  -> [{recv_cnt,Val} | dec_stats(R)];
        ?INET_STAT_RECV_MAX  -> [{recv_max,Val} | dec_stats(R)];
        ?INET_STAT_RECV_AVG  -> [{recv_avg,Val} | dec_stats(R)];
        ?INET_STAT_RECV_DVI  -> [{recv_dvi,Val} | dec_stats(R)];
        ?INET_STAT_SEND_CNT  -> [{send_cnt,Val} | dec_stats(R)];
        ?INET_STAT_SEND_MAX  -> [{send_max,Val} | dec_stats(R)];
        ?INET_STAT_SEND_AVG  -> [{send_avg,Val} | dec_stats(R)];
        ?INET_STAT_SEND_PEND -> [{send_pend,Val} | dec_stats(R)];
        _  -> throw({error, einval})
    end;
dec_stats([]) -> [].



More information about the erlang-questions mailing list