大家好,
非常新的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!
答案 0 :(得分:4)
通过使用{packet,2},您声称将使用2字节标头发送数据包,声明数据包的大小,并且您希望服务器也发送此类标头。 Telnet不会这样做,因此如果您尝试模拟telnet客户端,请不要指定2的数据包模式。而是使用0或raw作为数据包类型以指定无标头。我认为,不使用数据包选项也默认为无标题。