[erlang-questions] ssl {active, once} {packet, 4}

Daniel Goertzen daniel.goertzen@REDACTED
Thu Jun 27 18:23:35 CEST 2013


When using {packet, 4} the length does not include the length of the header.

Dan.


On Thu, Jun 27, 2013 at 12:39 AM, H.C. v. Stockhausen <hc@REDACTED> wrote:

> Hi,
>
> this is my first post to this group. Hello everyone.
>
> I am writing a client that connects to a server via ssl:connect. Upon
> connection the server returns a <greeting/>. Thereafter the client
> sends commands. The protocol has a 4 byte header that specifies the
> payload length followed by the xml payload.
>
> Here's an extract of my initial attempt that works:
>
> %%%%%%%%%%%%%%%%%%%%%%%%
> ...
> -behaviour(gen_server).
> -define(HEADER_SIZE, 4).
> ...
>
> init([]) ->
>     {ok, Socket} = ssl:connect(
>         <host>, <port>, [
>         binary,
>         {active, false},
>         {keepalive, true},
>         {certfile, <some/path>},
>         {keyfile, <some/path>}
>         ]),
>     {ok, #state{socket=Socket}, 0}.
>
> ...
>
> handle_info(timeout, State) ->
>     {ok, _Greeting} = recv(State#state.socket),
>     {noreply, State}.
>
> ...
> % internal helpers
>
> send(Socket, Msg) ->
>     Length = string:len(Msg) + ?HEADER_SIZE,
>     Data = <<Length:32, (list_to_binary(Msg))/binary>>,
>     ok = ssl:send(Socket, Data),
>     ok.
>
> recv(Socket) ->
>     {ok, <<Length:32/integer>>} = ssl:recv(Socket, ?HEADER_SIZE),
>     {ok, Data} = ssl:recv(Socket, Length-?HEADER_SIZE),
>     Response = binary_to_list(Data),
>     {ok, Response}.
>
> %%%%%%%%%%%%%%%%%%%%%%%%
>
> I have two questions.
>
> 1) As you can see init()/1 has a 0 timeout to trigger
> handle_info(timeout, State) which then fetches and discard the
> greeting message.
>
> Shouldn't I be able to just set {active, once} instead and handle the
> initial server response in a matching handle_info clause? I tried but
> it's never triggered. All I receive after a while is
> {ssl_closed,{sslsocket,new_ssl,<0.65.0>}}.
>
> 2) I manually build and unwrap the header/payload but isn't that what
> {packet, 4} is for? I also tried that but the server does not respond,
> as incidentally was the case when I initially didn't set the header
> properly.
>
> I realise that there are a lot of list_to_binary_to_list_to...
> conversions but that's another issue, isn't it?
>
> Is this how {active, once} and {packet, 4} should work or am I missing
> something, such as differences when it comes to ssl or client vs.
> server behaviour?
>
> Best regards,
> Hans Christian
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20130627/75e28e0b/attachment.htm>


More information about the erlang-questions mailing list