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); } } } }
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); } }
/// <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; }