/// <summary> /// Sends a message back to the client. /// </summary> /// <param name="message">The reply message to send.</param> /// <param name="receivedMessage">The received message which is being replied to.</param> public void Reply(byte[] message, ReceivedMessage receivedMessage) { // Sanitize if (message == null) { throw new ArgumentNullException("message"); } if (receivedMessage.Socket == null) { throw new ArgumentException("contains corrupted data", "receivedMessageState"); } var messageWithControlBytes = AppendControlBytesToMessage(message, receivedMessage.ThreadId); var socketAsyncEventArgs = _socketAsyncEventArgsSendPool.Pop(); socketAsyncEventArgs.SetBuffer(messageWithControlBytes, 0, messageWithControlBytes.Length); // Do the send to the appropriate client TryUnsafeSocketOperation(receivedMessage.Socket, SocketAsyncOperation.Send, socketAsyncEventArgs); }
/// <summary> /// Sends a message back to the client. /// </summary> /// <param name="message">The reply message to send.</param> /// <param name="receivedMessage">The received message which is being replied to.</param> public void Reply(byte[] message, ReceivedMessage receivedMessage) { // Sanitize if (message == null) { throw new ArgumentNullException("message"); } if (receivedMessage.Socket == null) { throw new ArgumentException("contains corrupted data", "receivedMessageState"); } // Create room for the control bytes var messageWithControlBytes = new byte[message.Length + _controlBytesPlaceholder.Length]; Buffer.BlockCopy(message, 0, messageWithControlBytes, _controlBytesPlaceholder.Length, message.Length); // Set the control bytes on the message SetControlBytes(messageWithControlBytes, receivedMessage.ThreadId); // Do the send to the appropriate client try { receivedMessage.Socket.BeginSend(messageWithControlBytes, 0, messageWithControlBytes.Length, 0, SendCallback, receivedMessage.Socket); } catch (SocketException ex) { HandleCommunicationError(receivedMessage.Socket, ex); return; } catch (ObjectDisposedException) { // If disposed, handle communication error was already done and we're just catching up on other threads. Supress it. return; } // Put received message back in the pool _receiveMessagePool.Push(receivedMessage); }