コード例 #1
0
ファイル: UdpClientChannelSink.cs プロジェクト: yallie/zyan
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders requestHeaders, Stream requestStream)
        {
            // add message Uri to headers
            var mcm = (IMethodCallMessage)msg;
            requestHeaders[CommonTransportKeys.RequestUri] = mcm.Uri;

            // send data (FIXME: 1) add reliability, 2) handle exceptions)
            var transport = new UdpTransport(UdpClient);
            transport.Write(requestHeaders, requestStream, ServerEndpoint);

            // if the call is not one-way, schedule an async call
            if (!RemotingServices.IsOneWay(mcm.MethodBase))
            {
                ThreadPool.QueueUserWorkItem((s) =>
                {
                    try
                    {
                        ITransportHeaders responseHeaders;
                        Stream responseStream;
                        IPEndPoint remote;
                        transport.Read(out responseHeaders, out responseStream, out remote);
                        sinkStack.AsyncProcessResponse(responseHeaders, responseStream);
                    }
                    catch (Exception ex)
                    {
                        sinkStack.DispatchException(ex);
                    }
                });
            }
        }
コード例 #2
0
        public void AsyncProcessRequest(IClientChannelSinkStack sinkStack, IMessage msg, ITransportHeaders requestHeaders, Stream requestStream)
        {
            // add message Uri to headers
            var mcm = (IMethodCallMessage)msg;

            requestHeaders[CommonTransportKeys.RequestUri] = mcm.Uri;

            // send data (FIXME: 1) add reliability, 2) handle exceptions)
            var transport = new UdpTransport(UdpClient);

            transport.Write(requestHeaders, requestStream, ServerEndpoint);

            // if the call is not one-way, schedule an async call
            if (!RemotingServices.IsOneWay(mcm.MethodBase))
            {
                ThreadPool.QueueUserWorkItem((s) =>
                {
                    try
                    {
                        ITransportHeaders responseHeaders;
                        Stream responseStream;
                        IPEndPoint remote;
                        transport.Read(out responseHeaders, out responseStream, out remote);
                        sinkStack.AsyncProcessResponse(responseHeaders, responseStream);
                    }
                    catch (Exception ex)
                    {
                        sinkStack.DispatchException(ex);
                    }
                });
            }
        }
コード例 #3
0
        public void ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            // add message Uri to headers
            var mcm = (IMethodCallMessage)msg;

            requestHeaders[CommonTransportKeys.RequestUri] = mcm.Uri;

            // send data and receive reply (FIXME: 1) add reliability, 2) handle exceptions)
            IPEndPoint remote;
            var        transport = new UdpTransport(UdpClient);

            transport.Write(requestHeaders, requestStream, ServerEndpoint);
            transport.Read(out responseHeaders, out responseStream, out remote);
        }
コード例 #4
0
ファイル: UdpServerChannelSink.cs プロジェクト: yallie/zyan
        internal void Listen(int port)
        {
            var udpClient = new UdpClient(port);

            while (true)
            {
                ITransportHeaders requestHeaders;
                Stream requestStream;
                IPEndPoint remote;
                var transport = new UdpTransport(udpClient);
                transport.Read(out requestHeaders, out requestStream, out remote);

                ThreadPool.QueueUserWorkItem(s => ProcessMessage(remote, requestHeaders, requestStream));
            }
        }
コード例 #5
0
        internal void Listen(int port)
        {
            var udpClient = new UdpClient(port);

            while (true)
            {
                ITransportHeaders requestHeaders;
                Stream            requestStream;
                IPEndPoint        remote;
                var transport = new UdpTransport(udpClient);
                transport.Read(out requestHeaders, out requestStream, out remote);

                ThreadPool.QueueUserWorkItem(s => ProcessMessage(remote, requestHeaders, requestStream));
            }
        }
コード例 #6
0
        void ProcessMessage(IPEndPoint remote, ITransportHeaders requestHeaders, Stream requestStream)
        {
            // parse request uri
            var    url = requestHeaders[CommonTransportKeys.RequestUri].ToString();
            string objectUri;

            UdpChannelHelper.Parse(url, out objectUri);
            objectUri = objectUri ?? url;
            requestHeaders[CommonTransportKeys.RequestUri] = objectUri;

            IMessage          responseMsg;
            ITransportHeaders responseHeaders;
            Stream            responseStream;

            // process message
            var stack = new ServerChannelSinkStack();

            stack.Push(this, null);
            var operation = NextChannelSink.ProcessMessage(stack, null, requestHeaders, requestStream,
                                                           out responseMsg, out responseHeaders, out responseStream);

            switch (operation)
            {
            case ServerProcessing.Complete:
                stack.Pop(this);
                var transport = new UdpTransport(new UdpClient());
                transport.Write(responseHeaders, responseStream, remote);
                break;

            case ServerProcessing.Async:
                stack.StoreAndDispatch(NextChannelSink, null);
                break;

            case ServerProcessing.OneWay:
                break;
            }
        }
コード例 #7
0
ファイル: UdpServerChannelSink.cs プロジェクト: yallie/zyan
        void ProcessMessage(IPEndPoint remote, ITransportHeaders requestHeaders, Stream requestStream)
        {
            // parse request uri
            var url = requestHeaders[CommonTransportKeys.RequestUri].ToString();
            string objectUri;
            UdpChannelHelper.Parse(url, out objectUri);
            objectUri = objectUri ?? url;
            requestHeaders[CommonTransportKeys.RequestUri] = objectUri;

            IMessage responseMsg;
            ITransportHeaders responseHeaders;
            Stream responseStream;

            // process message
            var stack = new ServerChannelSinkStack();
            stack.Push(this, null);
            var operation = NextChannelSink.ProcessMessage(stack, null, requestHeaders, requestStream,
                out responseMsg, out responseHeaders, out responseStream);

            switch (operation)
            {
                case ServerProcessing.Complete:
                    stack.Pop(this);
                    var transport = new UdpTransport(new UdpClient());
                    transport.Write(responseHeaders, responseStream, remote);
                    break;

                case ServerProcessing.Async:
                    stack.StoreAndDispatch(NextChannelSink, null);
                    break;

                case ServerProcessing.OneWay:
                    break;
            }
        }
コード例 #8
0
ファイル: UdpClientChannelSink.cs プロジェクト: yallie/zyan
        public void ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            // add message Uri to headers
            var mcm = (IMethodCallMessage)msg;
            requestHeaders[CommonTransportKeys.RequestUri] = mcm.Uri;

            // send data and receive reply (FIXME: 1) add reliability, 2) handle exceptions)
            IPEndPoint remote;
            var transport = new UdpTransport(UdpClient);
            transport.Write(requestHeaders, requestStream, ServerEndpoint);
            transport.Read(out responseHeaders, out responseStream, out remote);
        }