Esempio n. 1
0
    public void Run(string[] args)
    {
        string sockfile = "/tmp/" + System.IO.Path.GetRandomFileName();

        Console.WriteLine("Waiting for turbo at [" + sockfile + "]");

        Socket s = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified);

        s.Bind(new Mono.Unix.UnixEndPoint(sockfile));
        s.Listen(1);

        System.Diagnostics.Process.Start("/tmp/turbonet", sockfile);

        Socket conn = s.Accept();

        Console.WriteLine("Cube connected to turbo process.");

        byte[] buf = new byte[256 * 1024];
        int    readpos = 0, parsepos = 0;

        netki.Bitstream.Buffer bufwrap = new netki.Bitstream.Buffer();
        bufwrap.buf = buf;

        while (true)
        {
            int rd = conn.Receive(buf, readpos, buf.Length - readpos, SocketFlags.None);
            if (rd <= 0)
            {
                Console.WriteLine("Socket closed!");
                break;
            }

            readpos += rd;

            // Start parsing from the start.
            bufwrap.bitpos  = 0;
            bufwrap.bytepos = parsepos;
            bufwrap.error   = 0;
            bufwrap.bufsize = readpos;

            int parsed = 0;
            while (true)
            {
                if (bufwrap.bufsize - bufwrap.bytepos < 2)
                {
                    break;
                }

                System.UInt32 id = netki.Bitstream.ReadBits(bufwrap, 16);
                if (bufwrap.error != 0)
                {
                    Console.WriteLine("read id error");
                    break;
                }

                bool decoded = false;
                switch (id)
                {
                case netki.CubeTurboInfo.TYPE_ID:
                {
                    netki.CubeTurboInfo res = new netki.CubeTurboInfo();
                    if (netki.CubeTurboInfo.ReadFromBitstream(bufwrap, res))
                    {
                        OnTurboInfo(res);
                        decoded = true;
                    }
                    break;
                }

                case netki.CubeClientConnect.TYPE_ID:
                {
                    netki.CubeClientConnect res = new netki.CubeClientConnect();
                    if (netki.CubeClientConnect.ReadFromBitstream(bufwrap, res))
                    {
                        OnTurboClientConnect(res);
                        decoded = true;
                    }
                    break;
                }

                case netki.CubeClientDisconnect.TYPE_ID:
                {
                    netki.CubeClientDisconnect res = new netki.CubeClientDisconnect();
                    if (netki.CubeClientDisconnect.ReadFromBitstream(bufwrap, res))
                    {
                        OnTurboClientDisconnect(res);
                        decoded = true;
                    }
                    break;
                }

                case netki.CubeClientData.TYPE_ID:
                {
                    netki.CubeClientData res = new netki.CubeClientData();
                    if (netki.CubeClientData.ReadFromBitstream(bufwrap, res))
                    {
                        OnTurboClientData(res);
                        decoded = true;
                    }
                    break;
                }

                default:
                    Console.WriteLine("Turbo: unknown packet id " + id);
                    break;
                }

                if (decoded)
                {
                    netki.Bitstream.SyncByte(bufwrap);
                    parsed = bufwrap.bytepos;
                }
                else
                {
                    break;
                }
            }

            if (parsed > 0)
            {
                parsepos = parsed;
            }

            if (readpos == buf.Length)
            {
                Console.WriteLine("Turbo: read buffer exhausted!");
                break;
            }

            if (readpos == parsepos)
            {
                readpos  = 0;
                parsepos = 0;
            }
            else if (parsepos > 65536)
            {
                for (int i = parsepos; i < readpos; i++)
                {
                    buf[i - parsepos] = buf[i];
                }
                readpos -= parsepos;
                parsepos = 0;
            }
        }
    }
Esempio n. 2
0
 public void OnTurboClientData(netki.CubeClientData data)
 {
     Console.WriteLine("Cube: client id got data " + data.ConnectionId + " (" + data.Data.Length + ")");
 }