コード例 #1
0
        static void ServeSegment(RioSocket socket)
        {
            socket.SetLinger(0);
            var reader = new RioSegmentReader <ServeState>(socket);

            reader.State = new ServeState();
            reader.State.leftoverLength    = 0;
            reader.State.oldleftoverLength = 0;
            reader.State.reader            = reader;
            reader.State.socket            = socket;
            reader.OnIncommingSegment      = ProcessSocket;
            reader.Start();
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: xela-trawets/RioSharp
        public async static Task <ConnectionState> ExecuteStream()
        {
            var  buffer            = new byte[256 * pipeLineDeph];
            var  leftoverLength    = 0;
            var  oldleftoverLength = 0;
            uint endOfRequest      = 0x0a0d0a0d;
            uint current           = 0;
            int  responses         = 0;

            ConnectionState state = new ConnectionState();

            RioSocket connection = null;
            RioStream stream     = null;

            while (timer.Elapsed < span)
            {
                if (connection == null)
                {
                    try
                    {
                        connection = await clientPool.Connect(uri);

                        connection.SetLinger(0);
                        stream = new RioStream(connection);

                        //stream.Dispose();
                    }
                    catch (Exception e)
                    {
                        Debug.WriteLine(e.Message);
                        continue;
                    }
                }

                //check if connection is valid?
                connection.Send(reqz[pipeLineDeph]);

                while (responses < pipeLineDeph)
                {
                    int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);

                    if (bytesRead == 0)
                    {
                        break;
                    }

                    for (int i = 0; leftoverLength != 0 && i < 4 - leftoverLength; i++)
                    {
                        current += buffer[i];
                        current  = current << 8;
                        if (current == endOfRequest)
                        {
                            responses++;
                        }
                    }

                    leftoverLength = bytesRead % 4;
                    var length = bytesRead - leftoverLength;

                    unsafe
                    {
                        fixed(byte *data = &buffer[oldleftoverLength])
                        {
                            var start = data;
                            var end   = data + length;

                            for (; start <= end; start++)
                            {
                                if (*(uint *)start == endOfRequest)
                                {
                                    responses++;
                                }
                            }
                        }
                    }

                    oldleftoverLength = leftoverLength;

                    for (int i = bytesRead - leftoverLength; i < bytesRead; i++)
                    {
                        current += buffer[i];
                        current  = current << 4;
                    }
                }
                state.Requests += responses;
                responses       = 0;

                if (!keepAlive)
                {
                    stream.Dispose();
                    connection.Dispose();
                    connection = null;
                    stream     = null;
                    Thread.Sleep(100);
                }
            }
            stream?.Dispose();
            connection?.Dispose();
            return(state);
        }