Properly decoding telnet IAC negotiations.

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Properly decoding telnet IAC negotiations.

Thom Cherryhomes
Another round of late late night hacking.

I've been further experimenting with ranch to implement a proper Telnet implementation (for those who thought Telnet was simply a TCP connection from A to B...nope..)

First, I wanted to compliment the softwre engineers who worked on gen_statem, it's a fantastic replacement for gen_fsm which consolidates a lot of previously seperate functions into something that is simpler to implement, but has a lot more functionality.

As part of the Telnet negotiation process, I am having to send a string of IAC codes to specify no echo, character mode, etc. to get the terminal characteristics that I want:

negotiation(internal, preamble, #data{transport=Transport,socket=Socket}=Data) ->
    io:format("Sending preamble~n"),
    Transport:send(Socket,<<255,253,1,255,253,31,255,251,1,255,251,3>>),
    {next_state, negotiation, Data};

but now that I am sending this data, I am getting the terminal characteristics that I want, but as part of the negotiation, the client not only acknowledges the attributes that I wanted, but the client responds with attributes of its own:

1> EventType info -- Msg {tcp,#Port<0.638>,
                           <<255,252,1,255,251,31,255,250,31,0,170,0,113,255,
                             240,255,253,1,255,253,3>>} -- Data {data,
                                                                 nakbbs_telnet_ascii,
                                                                 #Port<0.638>,
                                                                 ranch_tcp} --


I know how to parse each of these bits, but am wondering how best to do the appropriate pattern matching to deal with each incoming bit of info.

The one saving grace is that each piece of the reply is dileniated with 255 followed by the protocol option to change (1 = echo, 31 = window size, etc.) 

Is the correct approach to snip off each dileniated piece from the binary and match?

-Thom



_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions