예제 #1
0
        private void ClientConnectedHandler(IAsyncResult ar)
        {
            IdentifiedClient identifiedClient = null;

            lock (_lock)
            {
                if (_socket == null)
                {
                    return;
                }

                // Check number of clients.
                if (_connectedClients.Count + 1 >= _socketPendingQueueSize)
                {
                    CallOnException(new InvalidOperationException("Maximum connected clients count is reached."));
                    return;
                }

                try
                {
                    var clientSocket = _socket.EndAccept(ar);
                    identifiedClient = new IdentifiedClient(clientSocket);

                    // Add client.
                    if (!_connectedClients.TryAdd(identifiedClient.Id, identifiedClient))
                    {
                        CallOnException(new InvalidOperationException(
                                            $"Unable to add new client '{identifiedClient.Id}' to list of connected clients."));
                    }

                    _serviceProvider.OnClientConnected(identifiedClient.Id);

                    // Run receive thread.
                    Task.Run(() =>
                    {
                        var state = new ReceiveState(identifiedClient,
                                                     (SocketServiceProvider)_serviceProvider.Clone());
                        clientSocket.BeginReceive(state.Buffer, 0, sizeof(UInt32), SocketFlags.None,
                                                  DataReceivedCallback, state);
                    });

                    // Wait for next client to connect.
                    _socket.BeginAccept(ClientConnectedHandler, null);
                }
                catch (SocketException e)
                {
                    CallOnException(e);

                    if (identifiedClient?.Id != null)
                    {
                        DestroyClient(identifiedClient.Id);
                    }
                }
            }
        }
예제 #2
0
        private void SendDirect(IdentifiedClient client, byte[] data)
        {
            if (client == null)
            {
                CallOnException(new InvalidOperationException("Client is not connected to socket server."));
                return;
            }

            try
            {
                lock (_lock)
                {
                    var prefixedData = ByteUtils.PrefixBufferSize(data);

                    client.ClientSocket.Send(prefixedData);
                    client.UpdateLastWrite();
                }
            }
            catch (SocketException e)
            {
                CallOnException(e, client.Id);
            }
        }
예제 #3
0
 /// <summary>
 /// Creates new object with specified client and buffer which size is default.
 /// </summary>
 /// <param name="client"></param>
 /// <param name="provider"></param>
 /// <param name="bufferSize"></param>
 public ReceiveState(IdentifiedClient client, SocketServiceProvider provider, int bufferSize = DefaultBufferSize)
 {
     IdentifiedClient = client;
     Buffer           = new byte[bufferSize];
     ServiceProvider  = provider;
 }