diff options
Diffstat (limited to 'mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs')
-rw-r--r-- | mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs | 173 |
1 files changed, 90 insertions, 83 deletions
diff --git a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs index 2f3a0ee7598..7b491bdf3ec 100644 --- a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs +++ b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Tcp/TcpServerChannel.cs @@ -2,6 +2,7 @@ // System.Runtime.Remoting.Channels.Tcp.TcpServerChannel.cs // // Author: Rodrigo Moya (rodrigo@ximian.com) +// Lluis Sanchez Gual (lsg@ctv.es) // // 2002 (C) Copyright, Ximian, Inc. // @@ -13,63 +14,10 @@ using System.Net.Sockets; using System.Net; using System.Threading; using System.IO; +using System.Runtime.Remoting.Channels.Simple; namespace System.Runtime.Remoting.Channels.Tcp { - public class TcpServerTransportSink : IServerChannelSink, IChannelSinkBase - { - IServerChannelSink next_sink; - - public TcpServerTransportSink (IServerChannelSink next) - { - next_sink = next; - } - - public IServerChannelSink NextChannelSink { - get { - return next_sink; - } - } - - [MonoTODO] - public IDictionary Properties { - get { - throw new NotImplementedException (); - } - } - - [MonoTODO] - public void AsyncProcessResponse (IServerResponseChannelSinkStack sinkStack, object state, - IMessage msg, ITransportHeaders headers, Stream stream) - { - throw new NotImplementedException (); - } - - [MonoTODO] - public Stream GetResponseStream (IServerResponseChannelSinkStack sinkStack, object state, - IMessage msg, ITransportHeaders headers) - { - throw new NotImplementedException (); - } - - public ServerProcessing ProcessMessage (IServerChannelSinkStack sinkStack, - IMessage requestMsg, - ITransportHeaders requestHeaders, - Stream requestStream, - out IMessage responseMsg, - out ITransportHeaders responseHeaders, - out Stream responseStream) - { - // this is the first sink, and TcpServerChannel does not call it. - throw new NotSupportedException (); - } - - internal void InternalProcessMessage (Stream requestStream) - { - Console.WriteLine ("ProcessMessageInternal"); - } - } - public class TcpServerChannel : IChannelReceiver, IChannel { int port = 0; @@ -81,11 +29,12 @@ namespace System.Runtime.Remoting.Channels.Tcp TcpServerTransportSink sink; ChannelDataStore channel_data; - void Init (IServerChannelSinkProvider provider) { - if (provider == null) { - provider = new BinaryServerFormatterSinkProvider (); + void Init (IServerChannelSinkProvider serverSinkProvider) + { + if (serverSinkProvider == null) { + // FIXME: change soap for binary + serverSinkProvider = new SimpleServerFormatterSinkProvider (); } - IServerChannelSink next_sink = provider.CreateSink (this); host = Dns.GetHostByName(Dns.GetHostName()).HostName; @@ -95,9 +44,20 @@ namespace System.Runtime.Remoting.Channels.Tcp uris = new String [1]; uris [0] = GetChannelUri (); } - - channel_data = new ChannelDataStore (uris);; + // Gets channel data from the chain of channel providers + + channel_data = new ChannelDataStore (uris); + IServerChannelSinkProvider provider = serverSinkProvider;
+ while (provider != null)
+ {
+ provider.GetChannelData(channel_data);
+ provider = provider.Next;
+ }
+ + // Creates the sink chain that will process all incoming messages + + IServerChannelSink next_sink = ChannelServices.CreateServerChannelSinkChain (serverSinkProvider, this);
sink = new TcpServerTransportSink (next_sink); listener = new TcpListener (port); @@ -113,21 +73,21 @@ namespace System.Runtime.Remoting.Channels.Tcp public TcpServerChannel (IDictionary properties, IServerChannelSinkProvider serverSinkProvider) { - port = (int)properties ["port"]; + port = Int32.Parse ((string)properties ["port"]); Init (serverSinkProvider); } public TcpServerChannel (string name, int port, IServerChannelSinkProvider serverSinkProvider) { - name = name; + this.name = name; this.port = port; Init (serverSinkProvider); } public TcpServerChannel (string name, int port) { - name = name; + this.name = name; this.port = port; Init (null); } @@ -158,35 +118,32 @@ namespace System.Runtime.Remoting.Channels.Tcp return "tcp://" + host + ":" + port; } - public string[] GetUrlsForUri (string uri) - { - string [] result = new String [1]; - - if (uri.IndexOf ('/') != 0) - result [0] = GetChannelUri () + "/" + uri; - else - result [0] = GetChannelUri () + uri; - - return result; - } + public string[] GetUrlsForUri (string uri)
+ {
+ if (!uri.StartsWith ("/")) uri = "/" + uri; +
+ string [] chnl_uris = channel_data.ChannelUris;
+ string [] result = new String [chnl_uris.Length];
+
+ for (int i = 0; i < chnl_uris.Length; i++)
+ result [i] = chnl_uris [i] + uri;
+
+ return result;
+ }
public string Parse (string url, out string objectURI) { - int port; - - string host = TcpChannel.ParseTcpURL (url, out objectURI, out port); - - return "tcp://" + host + ":" + port; + return TcpChannel.ParseChannelUrl (url, out objectURI); } void WaitForConnections () { - while (true) { + while (true) + { TcpClient client = listener.AcceptTcpClient (); - sink.InternalProcessMessage (client.GetStream ()); - - client.Close (); + ClientConnection reader = new ClientConnection (client, sink); + ThreadPool.QueueUserWorkItem ( new WaitCallback( reader.ProcessMessages)); } } @@ -201,6 +158,7 @@ namespace System.Runtime.Remoting.Channels.Tcp } server_thread = new Thread (new ThreadStart (WaitForConnections)); + server_thread.IsBackground = true; server_thread.Start (); } } @@ -214,4 +172,53 @@ namespace System.Runtime.Remoting.Channels.Tcp } } } + + class ClientConnection + { + TcpClient _client; + TcpServerTransportSink _sink; + Stream _stream; + + byte[] _buffer = new byte[TcpMessageIO.DefaultStreamBufferSize]; + + public ClientConnection (TcpClient client, TcpServerTransportSink sink) + { + _client = client; + _sink = sink; + } + + public Stream Stream + { + get { return _stream; } + } + + public byte[] Buffer + { + get { return _buffer; } + } + + public void ProcessMessages(object data) + { + _stream = _client.GetStream(); + + bool end = false; + while (!end) + { + MessageType type = TcpMessageIO.ReceiveMessageType (_stream); + + switch (type) + { + case MessageType.MethodMessage: + _sink.InternalProcessMessage (this); + break; + + case MessageType.CancelSignal: + end = true; + break; + } + } + + _stream.Close(); + } + } } |