Erlang noob寻求快速的代码审查

时间:2012-07-12 15:07:00

标签: erlang freeswitch

大家好,

非常新的Erlang,来自C / C ++ / Java。一直在玩代码,并让自己缩小到一定程度,一秒钟的指导可能会让我节省半天。所以我有一个小的telnet客户端,我打算连接到freeswitch esl端口,让我像在fs_cli中那样向端口发出命令。 (我想主要的是......我正在尝试与一个我应该可以通过telnet进行通信的端口进行通信)。当Linux telnet运行良好时,erlang应用程序失败了。我确信这个问题简单而微妙;任何帮助表示赞赏!

所以,以下是使用Linux telnet进行会话的方法:

$>telnet localhost 8021  
Trying localhost...  
Connected to localhost.  
Escape character is '^]'.  
Content-Type: auth/request  

auth password<ENTER>  
<ENTER>  
Content-Type: command/reply  
Reply-Text: +OK accepted  

log 1<ENTER>  
<ENTER>  
Content-Type: command/reply  
Reply-Text: +OK log level 1 [1]   

...好的,这是我的telnet客户端代码:

-module(getty).  
-export([s/0]).  

%-define(LISTEN_PORT, 9000).  
%-define(TCP_OPTS, [binary, {packet, raw}, {nodelay, true}, {reuseaddr, true}, {active, once}]).  

s() ->  
    case gen_tcp:connect( "localhost", 8021,[{active,false},{packet,2}]) of  
        {ok,Sock} ->   
            io:format("~p Connected to localhost 8021.~n", [erlang:localtime()] ),
            main_loop( Sock );  

        Error ->
             io:format("Error: ~p~n", [Error]) 
    end.

 main_loop( Sock ) ->
     Command = get_user_input( "Command> " ),

     spawn(fun() -> ex_cmd( Sock, Command ) end),
     main_loop( Sock ).

 ex_cmd(Sock, Command) ->
     B = gen_tcp:recv( Sock, 0 ),
    io:format( "Response: ~p~n", [B] ),
    gen_tcp:send( Sock, Command ),
    A = gen_tcp:recv( Sock, 0 ),
    %gen_tcp:close( Sock ),
    io:format( "Response: ~p~n", [A] ).     

get_user_input( Prompt ) ->
    A1 = string:concat(
        string:strip( % remove spaces from front and back
            string:strip( % remove line-feed from the end
                io:get_line( Prompt ), right, $\n)), "\r\n\r\n" ),
    io:format( "Command is: ~p~n", [A1] ),
    A1.

...这是使用erlang客户端的一小部分:

$>erl  
Erlang R15B01 (erts-5.9.1) [source] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]  

Eshell V5.9.1  (abort with ^G)  
1> c(getty).  
{ok,getty}  
2> getty:s().  
{{2012,7,12},{10,15,0}} Connected to localhost 8021.  
Command> auth password  
Command is: "auth password\r\n\r\n"  
Response: {error,closed}  
Response: {error,closed}  
Command>   

使用erlang客户端的不同结果的任何线索? TIA!

1 个答案:

答案 0 :(得分:4)

通过使用{packet,2},您声称将使用2字节标头发送数据包,声明数据包的大小,并且您希望服务器也发送此类标头。 Telnet不会这样做,因此如果您尝试模拟telnet客户端,请不要指定2的数据包模式。而是使用0或raw作为数据包类型以指定无标头。我认为,不使用数据包选项也默认为无标题。