예제 #1
0
        public void TestSocketFlags()
        {
            // Default value.
            var awaitable = new SocketAwaitable();

            Assert.AreEqual(awaitable.SocketFlags, SocketFlags.None);

            // Assign value.
            awaitable.SocketFlags = SocketFlags.Broadcast;
            Assert.AreEqual(awaitable.SocketFlags, SocketFlags.Broadcast);

            // Clear awaitable.
            awaitable.Clear();
            Assert.AreEqual(awaitable.SocketFlags, SocketFlags.None);
        }
예제 #2
0
        public void TestRemoteEndPoint()
        {
            // Default value.
            var awaitable = new SocketAwaitable();

            Assert.IsNull(awaitable.RemoteEndPoint);

            // Assign value.
            var endPoint = new IPEndPoint(IPAddress.Loopback, IPEndPoint.MaxPort);

            awaitable.RemoteEndPoint = endPoint;
            Assert.AreSame(awaitable.RemoteEndPoint, endPoint);

            // Clear awaitable.
            awaitable.Clear();
            Assert.IsNull(awaitable.RemoteEndPoint);
        }
예제 #3
0
        public void TestBuffer()
        {
            // Default buffer values.
            var awaitable = new SocketAwaitable();

            Assert.IsNotNull(awaitable.Buffer.Array);
            Assert.AreEqual(awaitable.Buffer.Array.Length, 0);
            Assert.AreEqual(awaitable.Buffer.Offset, 0);
            Assert.AreEqual(awaitable.Buffer.Count, 0);

            // Default transferred values.
            Assert.IsNotNull(awaitable.Transferred.Array);
            Assert.AreEqual(awaitable.Transferred.Array.Length, 0);
            Assert.AreEqual(awaitable.Transferred.Offset, 0);
            Assert.AreEqual(awaitable.Transferred.Count, 0);

            // Assign a null buffer.
            var nullBuffer = default(ArraySegment <byte>);

            Assert.IsNull(nullBuffer.Array);

            awaitable.Buffer = nullBuffer;
            Assert.IsNotNull(awaitable.Buffer.Array);
            Assert.AreEqual(awaitable.Buffer.Array.Length, 0);
            Assert.AreEqual(awaitable.Buffer.Offset, 0);
            Assert.AreEqual(awaitable.Buffer.Count, 0);

            // Assign a valid buffer.
            var data   = new byte[32];
            var buffer = new ArraySegment <byte>(data, 8, 16);

            awaitable.Buffer = buffer;
            Assert.AreSame(awaitable.Buffer.Array, data);
            Assert.AreEqual(awaitable.Buffer.Offset, buffer.Offset);
            Assert.AreEqual(awaitable.Buffer.Count, buffer.Count);

            // Clear awaitable.
            awaitable.Clear();
            Assert.IsNotNull(awaitable.Buffer.Array);
            Assert.AreEqual(awaitable.Buffer.Array.Length, 0);
            Assert.AreEqual(awaitable.Buffer.Offset, 0);
            Assert.AreEqual(awaitable.Buffer.Count, 0);
        }
예제 #4
0
        private async Task ListenerHandler()
        {
            listener.Listen(int.MaxValue);

            while (!isStopped)
            {
                SocketAwaitable     socketAwaitable = null;
                ArraySegment <byte> buffer          = new ArraySegment <byte>();

                try
                {
                    socketAwaitable = socketAwaitablePool.Take();
                    socketAwaitable.Clear();

                    buffer = bufferManager.GetBuffer();
                    socketAwaitable.Buffer = buffer;

                    var result = await listener.AcceptAsync(socketAwaitable);

                    if (result != SocketError.Success || socketAwaitable.AcceptSocket == null)
                    {
                        if (logger.IsDebugEnabled)
                        {
                            logger.Debug("Received error when accepting connection result[{0}]", result);
                        }

                        continue;
                    }

                    var socket = socketAwaitable.AcceptSocket;

                    logger.Info("Received connection from {0}", socket.RemoteEndPoint.ToString());

                    socket.NoDelay     = true;
                    socket.SendTimeout = 1000;

                    var session = socketSessionFactory.CreateAsyncSocketSession(socket.RemoteEndPoint.ToString(), socket);

                    session.PacketMaker.Append(socketAwaitable.Transferred);

                    Add(session);
                }
                catch (SocketException e)
                {
                    logger.Info(e, "SocketException in ListenerHandler. Ignoring...");

                    continue;
                }
                catch (Exception e)
                {
                    logger.Warn(e, "Exception in ListenerHandler");

                    throw;
                }
                finally
                {
                    if (socketAwaitable != null)
                    {
                        socketAwaitable.Clear();
                        socketAwaitablePool.Add(socketAwaitable);
                    }

                    if (buffer.Array != null)
                    {
                        bufferManager.ReleaseBuffer(buffer);
                    }
                }
            }
        }