2 // System.Runtime.Remoting.Channels.Tcp.TcpServerChannel.cs
4 // Author: Rodrigo Moya (rodrigo@ximian.com)
6 // 2002 (C) Copyright, Ximian, Inc.
9 using System.Collections;
10 using System.Runtime.Remoting.Messaging;
11 using System.Text.RegularExpressions;
12 using System.Net.Sockets;
14 using System.Threading;
17 namespace System.Runtime.Remoting.Channels.Tcp
19 public class TcpServerTransportSink : IServerChannelSink, IChannelSinkBase
21 IServerChannelSink next_sink;
23 public TcpServerTransportSink (IServerChannelSink next)
28 public IServerChannelSink NextChannelSink {
35 public IDictionary Properties {
37 throw new NotImplementedException ();
42 public void AsyncProcessResponse (IServerResponseChannelSinkStack sinkStack, object state,
43 IMessage msg, ITransportHeaders headers, Stream stream)
45 throw new NotImplementedException ();
49 public Stream GetResponseStream (IServerResponseChannelSinkStack sinkStack, object state,
50 IMessage msg, ITransportHeaders headers)
52 throw new NotImplementedException ();
55 public ServerProcessing ProcessMessage (IServerChannelSinkStack sinkStack,
57 ITransportHeaders requestHeaders,
59 out IMessage responseMsg,
60 out ITransportHeaders responseHeaders,
61 out Stream responseStream)
63 // this is the first sink, and TcpServerChannel does not call it.
64 throw new NotSupportedException ();
67 internal void InternalProcessMessage (Stream requestStream)
69 Console.WriteLine ("ProcessMessageInternal");
73 public class TcpServerChannel : IChannelReceiver, IChannel
79 Thread server_thread = null;
81 TcpServerTransportSink sink;
82 ChannelDataStore channel_data;
84 void Init (IServerChannelSinkProvider provider) {
85 if (provider == null) {
86 provider = new BinaryServerFormatterSinkProvider ();
88 IServerChannelSink next_sink = provider.CreateSink (this);
90 host = Dns.GetHostByName(Dns.GetHostName()).HostName;
92 string [] uris = null;
95 uris = new String [1];
96 uris [0] = GetChannelUri ();
99 channel_data = new ChannelDataStore (uris);;
101 sink = new TcpServerTransportSink (next_sink);
103 listener = new TcpListener (port);
104 StartListening (null);
107 public TcpServerChannel (int port)
113 public TcpServerChannel (IDictionary properties,
114 IServerChannelSinkProvider serverSinkProvider)
116 port = (int)properties ["port"];
117 Init (serverSinkProvider);
120 public TcpServerChannel (string name, int port,
121 IServerChannelSinkProvider serverSinkProvider)
125 Init (serverSinkProvider);
128 public TcpServerChannel (string name, int port)
135 public object ChannelData
142 public string ChannelName
149 public int ChannelPriority
156 public string GetChannelUri ()
158 return "tcp://" + host + ":" + port;
161 public string[] GetUrlsForUri (string uri)
163 string [] result = new String [1];
165 if (uri.IndexOf ('/') != 0)
166 result [0] = GetChannelUri () + "/" + uri;
168 result [0] = GetChannelUri () + uri;
173 public string Parse (string url, out string objectURI)
177 string host = TcpChannel.ParseTcpURL (url, out objectURI, out port);
179 return "tcp://" + host + ":" + port;
182 void WaitForConnections ()
185 TcpClient client = listener.AcceptTcpClient ();
187 sink.InternalProcessMessage (client.GetStream ());
193 public void StartListening (object data)
195 if (server_thread == null) {
198 port = ((IPEndPoint)listener.LocalEndpoint).Port;
199 channel_data.ChannelUris = new String [1];
200 channel_data.ChannelUris [0] = GetChannelUri ();
203 server_thread = new Thread (new ThreadStart (WaitForConnections));
204 server_thread.Start ();
208 public void StopListening (object data)
210 if (server_thread != null) {
211 server_thread.Abort ();
212 server_thread = null;