- // ==++==
- //
- //
- // Copyright (c) 2002 Microsoft Corporation. All rights reserved.
- //
- // The use and distribution terms for this software are contained in the file
- // named license.txt, which can be found in the root of this distribution.
- // By using this software in any fashion, you are agreeing to be bound by the
- // terms of this license.
- //
- // You must not remove this notice, or any other, from this software.
- //
- //
- // ==--==
- //==========================================================================
- // File: TcpClientSocketManager.cs
- //
- // Summary: Class for managing a socket connection.
- //
- //==========================================================================
- using System;
- using System.Collections;
- using System.IO;
- using System.Net;
- using System.Net.Sockets;
- using System.Runtime.Remoting.Messaging;
- using System.Text;
- using System.Threading;
- namespace System.Runtime.Remoting.Channels.Tcp
- {
- // A client socket manager instance should encapsulate the socket
- // for the purpose of reading a response
- internal class TcpClientSocketHandler : TcpSocketHandler
- {
- // prebaked bytes
- private static byte[] s_endOfLineBytes = Encoding.ASCII.GetBytes("/r/n");
- private String _machineAndPort; // "machineName:port"
- // connection state information
- private bool _bOneWayRequest = false; // was the request made OneWay?
- private bool _bChunked;
- private int _contentLength;
- private Stream _requestStream; // the request stream that we return from GetRequestStream()
- private TcpReadingStream _responseStream; // the stream that we returned from GetResponseStream()
- public TcpClientSocketHandler(Socket socket, String machineAndPort) :
- base(socket)
- {
- _machineAndPort = machineAndPort;
- } // TcpClientSocketHandler
- // Prepare for reading a new request off of the same socket
- protected override void PrepareForNewMessage()
- {
- _requestStream = null;
- _responseStream = null;
- } // PrepareForNewRequest
- public override void OnInputStreamClosed()
- {
- // make sure we read to the end of the response stream
- if (_responseStream != null)
- {
- _responseStream.ReadToEnd();
- _responseStream = null;
- }
- // return socket to the cache
- ReturnToCache();
- } // OnInputStreamClosed
- public BaseTransportHeaders ReadHeaders()
- {
- BaseTransportHeaders headers = new BaseTransportHeaders();
- UInt16 operation;
- ReadVersionAndOperation(out operation);
- // At this point, we're always expecting a Reply, so check for that.
- if (operation != TcpOperations.Reply)
- {
- throw new RemotingException(
- String.Format(
- CoreChannel.GetResourceString("Remoting_Tcp_ExpectingReplyOp"),
- operation.ToString()));
- }
- // content length must come next (may be chunked or a specific length)
- ReadContentLength(out _bChunked, out _contentLength);
- // read to end of headers
- ReadToEndOfHeaders(headers);
- return headers;
- } // ReadHeaders
- public Stream GetRequestStream(IMessage msg, int contentLength,
- ITransportHeaders headers)
- {
- IMethodCallMessage mcm = (IMethodCallMessage)msg;
- String uri = mcm.Uri;
- _bOneWayRequest = RemotingServices.IsOneWay(mcm.MethodBase);
- ChunkedMemoryStream headerStream = new ChunkedMemoryStream(CoreChannel.BufferPool);
- // output preamble and version
- WritePreambleAndVersion(headerStream);
- // output opcode
- if (!_bOneWayRequest)
- WriteUInt16(TcpOperations.Request, headerStream);
- else
- WriteUInt16(TcpOperations.OneWayRequest, headerStream);
- // output content delimiter style
- WriteUInt16(TcpContentDelimiter.ContentLength, headerStream);
- WriteInt32(contentLength, headerStream);
- // output request uri
- WriteUInt16(TcpHeaders.RequestUri, headerStream);
- WriteByte(TcpHeaderFormat.CountedString, headerStream);
- WriteCountedString(uri, headerStream);
- // output rest of headers
- WriteHeaders(headers, headerStream);
- headerStream.WriteTo(NetStream);
- headerStream.Close();
- _requestStream = NetStream;
- return _requestStream;
- } // GetRequestStream
- public void SendRequest(IMessage msg, ITransportHeaders headers, Stream contentStream)
- {
- int requestLength = (int)contentStream.Length;
- GetRequestStream(msg, requestLength, headers);
- StreamHelper.CopyStream(contentStream, NetStream);
- contentStream.Close();
- } // SendRequest
- public Stream GetResponseStream()
- {
- if (!_bChunked)
- _responseStream = new TcpFixedLengthReadingStream(this, _contentLength);
- else
- _responseStream = new TcpChunkedReadingStream(this);
- return _responseStream;
- } // GetResponseStream
- public bool OneWayRequest
- {
- get { return _bOneWayRequest; }
- }
- public void ReturnToCache()
- {
- TcpClientTransportSink.ClientSocketCache.ReleaseSocket(
- _machineAndPort, this);
- }
- } // TcpClientSocketHandler
- } // namespace System.Runtime.Remoting.Channels
TcpClientSocketManager.cs
最新推荐文章于 2022-09-28 16:45:33 发布