예제 #1
0
 /// <summary>
 /// Create new instance
 /// </summary>
 /// <param name="socket"></param>
 /// <param name="maxSizeSettings"></param>
 public ServerSessionBase(Socket socket, MaxSizeSettings maxSizeSettings)
 {
     this.socket          = socket;
     this.maxSizeSettings = maxSizeSettings;
     serverBufferSize     = BufferSizeUtils.ServerBufferSize(maxSizeSettings);
     messageManager       = new NetworkSender(serverBufferSize);
     bytesRead            = 0;
 }
예제 #2
0
        public ServerSessionBase(Socket socket, FasterKV <Key, Value> store, Functions functions, ParameterSerializer serializer, MaxSizeSettings maxSizeSettings)
        {
            this.socket          = socket;
            session              = store.For(new ServerFunctions <Key, Value, Input, Output, Functions, ParameterSerializer>(functions, this)).NewSession <ServerFunctions <Key, Value, Input, Output, Functions, ParameterSerializer> >();
            this.maxSizeSettings = maxSizeSettings;
            serverBufferSize     = BufferSizeUtils.ServerBufferSize(maxSizeSettings);
            messageManager       = new NetworkSender(serverBufferSize);
            this.serializer      = serializer;

            bytesRead = 0;
        }
예제 #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="address"></param>
        /// <param name="port"></param>
        /// <param name="networkBufferSize"></param>
        public FasterServerBase(string address, int port, int networkBufferSize)
        {
            this.address           = address;
            this.port              = port;
            this.networkBufferSize = networkBufferSize;
            if (networkBufferSize == default)
            {
                this.networkBufferSize = BufferSizeUtils.ClientBufferSize(new MaxSizeSettings());
            }

            activeSessions     = new ConcurrentDictionary <IMessageConsumer, byte>();
            sessionProviders   = new ConcurrentDictionary <WireFormat, ISessionProvider>();
            activeSessionCount = 0;
            Disposed           = false;
        }
예제 #4
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="address">IP address</param>
        /// <param name="port">Port</param>
        /// <param name="networkBufferSize">Size of network buffer</param>
        public FasterServer(string address, int port, int networkBufferSize = default)
        {
            activeSessions     = new ConcurrentDictionary <IServerSession, byte>();
            sessionProviders   = new ConcurrentDictionary <WireFormat, ISessionProvider>();
            activeSessionCount = 0;
            disposed           = false;

            this.networkBufferSize = networkBufferSize;
            if (networkBufferSize == default)
            {
                this.networkBufferSize = BufferSizeUtils.ClientBufferSize(new MaxSizeSettings());
            }

            var ip       = IPAddress.Parse(address);
            var endPoint = new IPEndPoint(ip, port);

            servSocket = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            servSocket.Bind(endPoint);
            servSocket.Listen(512);
            acceptEventArg            = new SocketAsyncEventArgs();
            acceptEventArg.Completed += AcceptEventArg_Completed;
        }
예제 #5
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);
        }