Exemplo n.º 1
0
        public async Task <AsyncSocketSession> GetConnectedSocket(IProcessor processor)
        {
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            {
                NoDelay     = true,
                LingerState = new LingerOption(true, 2)
            };

            var serverSocketAccept = listener.AcceptSocketAsync();

            socket.Connect(new IPEndPoint(IPAddress.Loopback, ((IPEndPoint)listener.LocalEndpoint).Port));
            await serverSocketAccept;

            var serverSocket = serverSocketAccept.Result;

            var session = new AsyncSocketSession(Guid.NewGuid().ToString(),
                                                 socket,
                                                 processor,
                                                 SocketAwaitablePool,
                                                 BlockingBufferManager);

            serverSocketsBySession.Add(session, serverSocket);

            return(session);
        }
Exemplo n.º 2
0
        public ServerSession(
            System.Net.Sockets.Socket workSocket,
            System.Net.IPEndPoint bindEndPoint,
            string bindEndPointName,
            bool serverKeepAlive,
            ProcessorFactory processorFactory)
        {
            workSocket.NoDelay = true; //donot use Nagle

            _clientIp         = ((System.Net.IPEndPoint)workSocket.RemoteEndPoint).Address;
            _bindEndPoint     = bindEndPoint;
            _bindEndPointName = bindEndPointName;
            _serverKeepAlive  = serverKeepAlive;
            _processorFactory = processorFactory;

            _session = new AsyncSocketSession(workSocket);
            _session.ConnectionClose       += new EventHandler <ConnectionCloseEventArgs>(session_ConnectionClose);
            _session.SendComplete          += new EventHandler <SendCompleteEventArgs>(session_SendComplete);
            _session.ReceiveHeaderComplete += new EventHandler <ReceiveHeaderCompleteEventArgs>(session_ReceiveHeaderComplete);
            _session.ReceiveBodyComplete   += new EventHandler <ReceiveBodyCompleteEventArgs>(session_ReceiveBodyComplete);

            _connectionToken = System.Guid.NewGuid().ToString("N");
            _bodyBuffer      = new byte[BODY_BUFFER_LENGTH];

            //set the active time
            _lastActiveTime = DateTime.Now;
        }
Exemplo n.º 3
0
    private static void Server_NewClientAccepted(Socket client, ISocketSession session)
    {
        Console.WriteLine("----- new client ------------");
        AsyncSocketSession ass = session as AsyncSocketSession;

        ass.SetReceiveHandler(arg =>
        {
            Console.WriteLine("----- new receive ------------");
            string received = System.Text.Encoding.UTF8.GetString(arg.Buffer, arg.Offset, arg.BytesTransferred);
            Console.WriteLine(received);

            ass.Send(received);
        });
    }
Exemplo n.º 4
0
    private static void Server_ReadCompleted(Socket client, object state)
    {
        SocketAsyncEventArgs arg = state as SocketAsyncEventArgs;

        string received = System.Text.Encoding.UTF8.GetString(arg.Buffer, arg.Offset, arg.BytesTransferred);

        Console.WriteLine(received);

        AsyncSocketSession session = arg.UserToken as AsyncSocketSession;

        if (session == null)
        {
            return;
        }
        session.Send(received);
    }
Exemplo n.º 5
0
        public ArraySegment <byte> ReadDataSentFromSession(AsyncSocketSession session)
        {
            Thread.Sleep(1000);

            var receiveBuffer = new byte[16000];

            var serverSocket = serverSocketsBySession[session];

            int totalBytesRead = 0;

            while (serverSocket.Available > 0)
            {
                int bytesRead = serverSocket.Receive(receiveBuffer, totalBytesRead, 1000, SocketFlags.None);

                totalBytesRead += bytesRead;
                Thread.Sleep(1000);
            }

            return(new ArraySegment <byte>(receiveBuffer, 0, totalBytesRead));
        }
Exemplo n.º 6
0
        public async Task ServerIsAbleToProcessPacketsAndCleansUpResources(ISocketSessionFactory sessionFactory, IProcessor processor, IPlayer player)
        {
            player.GetCityCount().Returns(1);
            player.HasTwoFactorAuthenticated = DateTime.Now;

            var socketAwaitablePool = new SocketAwaitablePool(10);
            var buffer = new BlockingBufferManager(1000, 15);

            Socket             serverSideSocket = null;
            AsyncSocketSession session          = null;

            sessionFactory.CreateAsyncSocketSession(Arg.Any <string>(), Arg.Any <Socket>())
            .Returns(args =>
            {
                serverSideSocket = args.Arg <Socket>();
                session          = new AsyncSocketSession(string.Empty, serverSideSocket, processor, socketAwaitablePool, buffer)
                {
                    Player = player
                };
                return(session);
            });

            AsyncTcpServer server = new AsyncTcpServer(sessionFactory, socketAwaitablePool, buffer);

            try
            {
                server.Start("127.0.0.1", 0);

                // Connect and verify client connected and socket options are set
                var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                {
                    NoDelay = true
                };

                var packetToSend1 = new Packet(Command.MarketSell);
                packetToSend1.AddString("Hello");
                var bytesToSendOnConnect = packetToSend1.GetBytes();

                await socket.ConnectAsync(new SocketAwaitable
                {
                    RemoteEndPoint = server.LocalEndPoint
                });

                await Task.Delay(1000);

                await socket.SendAsync(new SocketAwaitable
                {
                    Buffer = new ArraySegment <byte>(bytesToSendOnConnect, 0, bytesToSendOnConnect.Length)
                });

                await Task.Delay(1000);

                server.GetSessionCount().Should().Be(1);
                serverSideSocket.Connected.Should().BeTrue();
                serverSideSocket.NoDelay.Should().BeTrue();
                serverSideSocket.SendTimeout.Should().Be(1000);

                // Send packets and verify server processes packets
                var packetToSend2 = new Packet(Command.MarketBuy);
                packetToSend2.AddString("World");
                var bytesToSecondAfterConnect = packetToSend2.GetBytes();
                await socket.SendAsync(new SocketAwaitable
                {
                    Buffer = new ArraySegment <byte>(bytesToSecondAfterConnect, 0, bytesToSecondAfterConnect.Length)
                });

                await Task.Delay(1000);

                // Stop server and verify it disconnect and releases resources
                server.Stop();

                await Task.Delay(1000);

                player.HasTwoFactorAuthenticated.Should().Be(null);

                serverSideSocket.Connected.Should().BeFalse();
                socketAwaitablePool.Count.Should().Be(10);
                buffer.AvailableBuffers.Should().Be(15);

                processor.Received(1).Execute(session, Arg.Is <Packet>(packet => packet.GetBytes().SequenceEqual(bytesToSecondAfterConnect)));
                processor.Received(1).Execute(session, Arg.Is <Packet>(packet => packet.GetBytes().SequenceEqual(bytesToSendOnConnect)));
                processor.Received(1).ExecuteEvent(session, Arg.Is <Packet>(packet => packet.Cmd == Command.OnDisconnect));
            }
            finally
            {
                server.Stop();
            }
        }
Exemplo n.º 7
0
        public void CloseSessionFromServerSide(AsyncSocketSession session)
        {
            var serverSocket = serverSocketsBySession[session];

            serverSocket.Close();
        }