private void ReceiveCallback(IAsyncResult ar)
        {
            TcpAdapterEndPoint endPoint = null;

            try
            {
                endPoint = (TcpAdapterEndPoint)ar.AsyncState;

                Socket clientSocket = endPoint.Socket;

                int byteCount = clientSocket.EndReceive(ar);

                if (byteCount > 0)
                {
                    MultiPartMessage msg = new MultiPartMessage("",
                                                                new MemoryStream(endPoint.buffer, 0, byteCount));

                    OnMessageReceived(msg, endPoint);

                    InitializeEndPoint(endPoint);
                }
                else
                {
                    Disconnect(endPoint);
                }
            }
            catch (Exception ex)
            {
                Disconnect(endPoint, ex);
            }
        }
        private TcpAdapterEndPoint CreateEndPoint(Socket socket)
        {
            TcpAdapterEndPoint endPoint = new TcpAdapterEndPoint(this, socket);

            try
            {
                Uri uri = new UriBuilder("tcp", ((IPEndPoint)socket.RemoteEndPoint).Address.ToString(),
                                         ((IPEndPoint)socket.RemoteEndPoint).Port).Uri;

                TcpAdapterEndPoint existingEndPoint = MessageEngine.Instance.AdapterProxy.ResolveUriToEndPoint(uri) as TcpAdapterEndPoint;

                if (existingEndPoint != null)
                {
                    Disconnect(existingEndPoint);
                }

                OnEndPointCreated(endPoint);

                InitializeEndPoint(endPoint);
            }
            catch (Exception)
            {
                Disconnect(endPoint);
                throw;
            }

            return(endPoint);
        }
        private void InitializeEndPoint(TcpAdapterEndPoint endPoint)
        {
            int timeout = Configuration.ReadAsInt("TcpEndPointTimeout");

            if (timeout > 0)
            {
                SetEndPointTimeout(endPoint, DateTime.Now.AddMilliseconds(timeout));
            }

            endPoint.Socket.BeginReceive(endPoint.buffer, 0, TcpAdapterEndPoint.bufferSize, 0, ReceiveCallback, endPoint);
        }
        public void SetEndPointTimeout(TcpAdapterEndPoint endPoint, DateTime timeout)
        {
            lock (endPoint)
            {
                endPoint.Timeout = timeout;
            }

            lock (_syncObject)
            {
                if (timeout < _currentTimeout)
                {
                    _timeoutWaitEvent.Set();
                }
            }
        }
        private void OnEndpointTimeout(TcpAdapterEndPoint endPoint)
        {
            //Mark as timed out
            lock (endPoint)
            {
                endPoint.Timeout = DateTime.MaxValue;
            }

            Disconnect(endPoint);

            if ((MessageEngine.Instance.Tracing.Switch.Level & SourceLevels.Warning) == SourceLevels.Warning)
            {
                MessageEngine.Instance.Tracing.TraceEvent(TraceEventType.Warning, 0, "EndPoint: \"{0}\" timed out due to inactivity.", endPoint);
            }
        }
 private void Disconnect(TcpAdapterEndPoint endPoint, Exception exception)
 {
     if (endPoint != null)
     {
         try
         {
             endPoint.Socket.Close();
         }
         catch (SocketException)
         {
         }
         catch (ObjectDisposedException)
         {
         }
         finally
         {
             endPoint.Exception = exception;
             OnEndPointDestroyed(endPoint);
         }
     }
 }
        /// <summary>
        /// Transmits a message over the adapter protocol.
        /// </summary>
        /// <param name="msg">The message to transmit.</param>
        public override void TransmitMessage(MultiPartMessage msg)
        {
            Uri sendUri = (Uri)msg.Metadata.Read("SendUri");

            TcpAdapterEndPoint endPoint
                = (TcpAdapterEndPoint)MessageEngine.Instance.AdapterProxy.ResolveUriToEndPoint(sendUri);

            if (endPoint == null)
            {
                throw new AdapterException("Failed to transmit message to Uri: \"" + sendUri + "\". The EndPoint does not exist.");
            }

            try
            {
                byte[] buffer = new byte[msg.Data.Length];
                msg.Data.Seek(0, SeekOrigin.Begin);
                msg.Data.Read(buffer, 0, (int)msg.Data.Length);

                endPoint.Socket.Send(buffer, 0, (int)msg.Data.Length, SocketFlags.None);
            }
            catch (NullReferenceException ex)
            {
                throw new AdapterException("Failed to transmit message to EndPoint: \"" + endPoint + "\".", ex);
            }
            catch (ArgumentNullException ex)
            {
                throw new AdapterException("Failed to transmit message to EndPoint: \"" + endPoint + "\".", ex);
            }
            catch (SocketException ex)
            {
                Disconnect(endPoint, ex);
                throw new AdapterException("Failed to transmit message to EndPoint: \"" + endPoint + "\".", ex);
            }
            catch (ObjectDisposedException ex)
            {
                //The socket has been closed by another thread
                Disconnect(endPoint, ex);
                throw new AdapterException("Failed to transmit message to EndPoint: \"" + endPoint + "\".", ex);
            }
        }
 public void Disconnect(TcpAdapterEndPoint endPoint)
 {
     Disconnect(endPoint, null);
 }