views:

797

answers:

5

This is an erlang problem, it seems. I have this code to test the client sending data, written in Actionscript 3:

var socket:Socket=new Socket("localhost", 2345);
socket.addEventListener(Event.CONNECT, connected);

private function connected(event:Event):void {
    socket.writeInt(12); //packet length, should be correct? 4 bytes each?
    socket.writeInt(3);
    socket.writeInt(6);
    socket.writeInt(9);
    socket.flush();
}

Then I have this small server, written in Erlang:

start_nano_server() ->
    {ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 0},
         {reuseaddr, true},
         {active, true},
        {packet_size, 128}]),
    {ok, Socket} = gen_tcp:accept(Listen),
    gen_tcp:close(Listen), 
    receive_data(Socket, []).

receive_data(Socket, SoFar) ->
    receive
    {tcp,Socket,Bin} ->   
        receive_data(Socket, [Bin|SoFar]);
    {tcp_closed,Socket} ->
        Bytes=list_to_binary(reverse(SoFar)),
        io:format("~p~n",[Bytes])
    end.

Now, no matter what I send from the client, I ALWAYS get [<<0,0,0,4,0,0,0,32>>] as the response. I can try writing bytes to the socket directly instead of ints, and I get the same thing. I can write more or less data, same result. UTF strings same result. Even when specifying "4" as the packet header length, I just get the same consistent result of [<<0,0,0,32>>] instead. I don't understand what I'm doing wrong here.

+2  A: 

Try not closing Listen before receiving data.

Alexey Romanov
+1  A: 

Suspect its more likely a Flash problem - your Erlang server code works perfectly with a Java socket client.

tonys
+3  A: 

Here's an extract from our working Erlang server that connects to a Flash socket...

It is based on Klacke's chargen server example: http://erlang.org/examples/klacke_examples/chargen.erl

-module(remoting_soc).

-export([accept/1]).

accept(Listen) ->

    {ok, Soc} = gen_tcp:accept(Listen),
    Pid = spawn(fun() -> loop(Soc) end),
    gen_tcp:controlling_process(Soc,Pid),
    %% Start Listening for another connection
    remoting_soc:accept(Listen).

loop(Socket)->

    receive

        {tcp, Socket,"register"++Rest} ->
            ...do stuff...
            loop(Socket);

    end.
A: 

I am about to answer my own question in case anyone wants to know the answer.

Using a packet sniffer, I was able to find out that Flash was indeed sending the wrong packet. Although I don't know the significance of what the packet data actually was, I know what the problem was. I guess it was because I opened the Flash socket and the Erlang socket on the same machine - normally this wouldn't be a problem, but I believe that since Flash doesn't have any differenciation between listening sockets and sending sockets, that it somehow clashed with the open socket on the Erlang program.

When you specify Socket(host, port) in the Flash socket, not only are you able to send data on that socket, but you can receive it too, so that seemed to be the source of the problem.

I tested running the Flash program on my laptop and the server on my PC and it worked fine.

ryeguy