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."); }
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; } } }