Ejemplo n.º 1
0
        private bool HandleNewConnection(SocketAsyncEventArgs e)
        {
            if (e.SocketError != SocketError.Success)
            {
                e.Dispose();
                return(false);
            }

            // Ok to create new event args on accept because we assume a connection to be long-running
            var receiveEventArgs = new SocketAsyncEventArgs();
            var buffer           = new byte[networkBufferSize];

            receiveEventArgs.SetBuffer(buffer, 0, networkBufferSize);

            var args = new ConnectionArgs
            {
                socket = e.AcceptSocket
            };

            receiveEventArgs.UserToken  = args;
            receiveEventArgs.Completed += RecvEventArg_Completed;

            e.AcceptSocket.NoDelay = true;
            // If the client already have packets, avoid handling it here on the handler so we don't block future accepts.
            if (!e.AcceptSocket.ReceiveAsync(receiveEventArgs))
            {
                Task.Run(() => RecvEventArg_Completed(null, receiveEventArgs));
            }
            return(true);
        }
Ejemplo n.º 2
0
        private bool HandleNewConnection(SocketAsyncEventArgs e)
        {
            if (e.SocketError != SocketError.Success)
            {
                e.Dispose();
                return(false);
            }

            // Ok to create new event args on accept because we assume a connection to be long-running
            var receiveEventArgs = new SocketAsyncEventArgs();
            var bufferSize       = BufferSizeUtils.ClientBufferSize(maxSizeSettings);
            var buffer           = new byte[bufferSize];

            receiveEventArgs.SetBuffer(buffer, 0, bufferSize);

            var(store, functionsGen, serializer) = ((FasterKV <Key, Value>, Func <WireFormat, Functions>, ParameterSerializer))e.UserToken;

            var args = new ConnectionArgs <Key, Value, Input, Output, Functions, ParameterSerializer>
            {
                socket          = e.AcceptSocket,
                store           = store,
                functionsGen    = functionsGen,
                serializer      = serializer,
                maxSizeSettings = maxSizeSettings
            };

            receiveEventArgs.UserToken  = args;
            receiveEventArgs.Completed += RecvEventArg_Completed;

            e.AcceptSocket.NoDelay = true;
            // If the client already have packets, avoid handling it here on the handler so we don't block future accepts.
            if (!e.AcceptSocket.ReceiveAsync(receiveEventArgs))
            {
                Task.Run(() => RecvEventArg_Completed(null, receiveEventArgs));
            }
            return(true);
        }
Ejemplo n.º 3
0
        private unsafe bool HandleNewConnection(SocketAsyncEventArgs e)
        {
            if (e.SocketError != SocketError.Success)
            {
                e.Dispose();
                return(false);
            }

            // Ok to create new event args on accept because we assume a connection to be long-running
            var receiveEventArgs = new SocketAsyncEventArgs();

            var args = new ConnectionArgs
            {
                socket = e.AcceptSocket
            };

#if NET5_0_OR_GREATER
            var buffer = GC.AllocateArray <byte>(NetworkBufferSize, true);
#else
            var buffer = new byte[NetworkBufferSize];
            args.recvHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
#endif
            args.recvBufferPtr = (byte *)Unsafe.AsPointer(ref buffer[0]);

            receiveEventArgs.SetBuffer(buffer, 0, NetworkBufferSize);
            receiveEventArgs.UserToken  = args;
            receiveEventArgs.Completed += RecvEventArg_Completed;

            e.AcceptSocket.NoDelay = true;
            // If the client already have packets, avoid handling it here on the handler so we don't block future accepts.
            if (!e.AcceptSocket.ReceiveAsync(receiveEventArgs))
            {
                Task.Run(() => RecvEventArg_Completed(null, receiveEventArgs));
            }
            return(true);
        }