private void ReadAsyncTcpMessage(object data) { // This method is called by a new thread to asynchronously // read the response to a request // The stack was provided as state data in QueueUserWorkItem IClientChannelSinkStack stack = (IClientChannelSinkStack)data; // The first sink in the stack is this sink. Pop it and // get the status data, which is the TcpConnection used to send // the request TcpConnection connection = (TcpConnection)stack.Pop(this); try { ITransportHeaders responseHeaders; // Read the response, blocking if necessary MessageStatus status = TcpMessageIO.ReceiveMessageStatus(connection.Stream, connection.Buffer); if (status != MessageStatus.MethodMessage) { throw new RemotingException("Unknown response message from server"); } Stream responseStream = TcpMessageIO.ReceiveMessageStream(connection.Stream, out responseHeaders, connection.Buffer); // Free the connection, so it can be reused connection.Release(); connection = null; // Ok, proceed with the other sinks stack.AsyncProcessResponse(responseHeaders, responseStream); } catch { if (connection != null) { connection.Release(); } throw; } }
public void ProcessMessages() { byte[] buffer = new byte[256]; NetworkStream ns = new NetworkStream(_socket); _stream = new BufferedStream(ns); try { bool end = false; while (!end) { MessageStatus type = TcpMessageIO.ReceiveMessageStatus(_stream, buffer); switch (type) { case MessageStatus.MethodMessage: _sink.InternalProcessMessage(this); break; case MessageStatus.Unknown: case MessageStatus.CancelSignal: end = true; break; } _stream.Flush(); } } catch (Exception ex) { #if DEBUG Console.WriteLine("The exception was caught during TcpServerChannel.ProcessMessages: {0}, {1}", ex.GetType(), ex.Message); #endif } finally { try { _stream.Close(); _socket.Close(); } catch { } } }
public void ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, out ITransportHeaders responseHeaders, out Stream responseStream) { TcpConnection connection = null; try { if (requestHeaders == null) { requestHeaders = new TransportHeaders(); } requestHeaders [CommonTransportKeys.RequestUri] = ((IMethodMessage)msg).Uri; // Sends the message connection = TcpConnectionPool.GetConnection(_host, _port); TcpMessageIO.SendMessageStream(connection.Stream, requestStream, requestHeaders, connection.Buffer); connection.Stream.Flush(); // Reads the response MessageStatus status = TcpMessageIO.ReceiveMessageStatus(connection.Stream, connection.Buffer); if (status != MessageStatus.MethodMessage) { throw new RemotingException("Unknown response message from server"); } responseStream = TcpMessageIO.ReceiveMessageStream(connection.Stream, out responseHeaders, connection.Buffer); } finally { if (connection != null) { connection.Release(); } } }