Exemplo n.º 1
0
        private void Connect()
        {
            if (_socketState != null)
            {
                if (_socketState.IsConnected)
                {
                    return;
                }

                _socketState.Dispose();
            }

            Logger.Write("Connecting to server...");

            Logger.Write(string.Format("Resolving host \"{0}\"...", _host));

            IPAddress address = null;

            try
            {
                address = IPAddress.Parse(_host);
            }
            catch (ArgumentException)
            {
            }
            catch (FormatException)
            {
            }

            if (address == null)
            {
                IPHostEntry dnsEntry = Dns.GetHostEntry(_host);

                foreach (IPAddress ia in dnsEntry.AddressList)
                {
                    if (ia.AddressFamily == AddressFamily.InterNetwork)
                    {
                        address = ia;
                        break;
                    }
                }
            }

            IPEndPoint endPoint = new IPEndPoint(address, _port);

            Logger.Write("Creating socket...");

            _socketState        = new SocketState();
            _socketState.Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);

            Logger.Write(string.Format("Connecting to \"{0}:{1}\"...", address.ToString(), _port));

            _socketState.Socket.BeginConnect(endPoint, ConnectCallback, _socketState);

            if (!_socketState.Wait(_connectTimeout))
            {
                throw new TimeoutException("Connection timed out.");
            }

            if (_socketState.Exception != null)
            {
                throw _socketState.Exception;
            }

            _socketState.IsConnected = true;

            Logger.Write("Connection successful.");
        }
Exemplo n.º 2
0
        public TResponse Invoke <TRequest, TResponse>(TRequest request)
            where TRequest : class
            where TResponse : class
        {
            Logger.Write(string.Format("Invoking request \"{0}\"...", request.GetType().Name));

            if (_isDisposed)
            {
                throw new ObjectDisposedException(typeof(ThinClient).FullName);
            }

            TResponse response = null;

            lock (_syncLock)
            {
                try
                {
                    if (_lastRequestType != typeof(TRequest))
                    {
                        _sequence++;
                    }

                    request.GetType().GetProperty("SessionId").SetValue(request, _sessionId, null);
                    request.GetType().GetProperty("Sequence").SetValue(request, _sequence, null);

                    _lastRequestType = typeof(TRequest);

                    Connect();

                    XmlSerializer serializer = GetSerializer(typeof(TRequest));

                    var stream = new MemoryStream(4096);

                    serializer.Serialize(stream, request);

                    for (int i = 0; i < EndOfFileLength; i++)
                    {
                        stream.WriteByte(0);
                    }

                    if (Logger.IsEnabled)
                    {
                        string data = Encoding.UTF8.GetString(stream.ToArray(), 0, (int)stream.Length).Replace('\0', '0');
                        Logger.Write(string.Format("Sending data \"{0}\"...", data));
                    }

                    _socketState.Socket.BeginSend(stream.ToArray(), 0, (int)stream.Length, 0, SendCallback, _socketState);

                    if (!_socketState.Wait(_sendTimeout))
                    {
                        throw new TimeoutException("Send timed out.");
                    }

                    if (_socketState.Exception != null)
                    {
                        throw _socketState.Exception;
                    }

                    Logger.Write("Receiving response...");

                    response = ReceiveResponse <TResponse>();

                    _sequence++;

                    Logger.Write("Request completed successfully.");

                    return(response);
                }
                catch (Exception ex)
                {
                    Logger.Write(ex.ToString());

                    if (_socketState != null)
                    {
                        _socketState.Dispose();
                    }

                    throw;
                }
            }
        }