public void Connect(Connection connection, Address address, bool noVerification) { TcpSocket socket = new TcpSocket(); if (connection.Handler != null && connection.Handler.CanHandle(EventId.SocketConnect)) { connection.Handler.Handle(Event.Create(EventId.SocketConnect, connection, null, null, socket)); } socket.Connect(address.Host, address.Port); if (address.UseSsl) { SslSocket sslSocket = new SslSocket(socket, noVerification); if (connection.Handler != null && connection.Handler.CanHandle(Handler.EventId.SocketConnect)) { connection.Handler.Handle(Event.Create(EventId.SslAuthenticate, connection, null, null, sslSocket)); } else { sslSocket.AuthenticateAsClient(address.Host); } this.socketTransport = sslSocket; } else { this.socketTransport = socket; } }
public async Task ConnectAsync(Address address, ConnectionFactory factory) { Socket socket; IPAddress[] ipAddresses; IPAddress ipAddress; if (IPAddress.TryParse(address.Host, out ipAddress)) { socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); ipAddresses = new IPAddress[] { ipAddress }; } else { socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ipAddresses = Dns.GetHostEntry(address.Host).AddressList; } if (factory.tcpSettings != null) { factory.tcpSettings.Configure(socket); } await Task.Factory.FromAsync( (c, s) => ((Socket)s).BeginConnect(ipAddresses, address.Port, c, s), (r) => ((Socket)r.AsyncState).EndConnect(r), socket); IAsyncTransport transport; if (address.UseSsl) { SslStream sslStream; var ssl = factory.sslSettings; if (ssl == null) { sslStream = new SslStream(new NetworkStream(socket)); await sslStream.AuthenticateAsClientAsync(address.Host); } else { sslStream = new SslStream(new NetworkStream(socket), false, ssl.RemoteCertificateValidationCallback); await sslStream.AuthenticateAsClientAsync(address.Host, ssl.ClientCertificates, ssl.Protocols, ssl.CheckCertificateRevocation); } transport = new SslSocket(this, sslStream); } else { transport = new TcpSocket(this, socket); } this.socketTransport = transport; this.writer = new Writer(this, this.socketTransport); }
public void Connect(Connection connection, Address address, bool noVerification) { var ipHostEntry = Dns.GetHostEntry(address.Host); Exception exception = null; TcpSocket socket = null; foreach (var ipAddress in ipHostEntry.AddressList) { if (ipAddress == null) { continue; } try { socket = new TcpSocket(); socket.Connect(new IPEndPoint(ipAddress, address.Port)); exception = null; break; } catch (SocketException socketException) { if (socket != null) { socket.Close(); socket = null; } exception = socketException; } } if (exception != null) { throw exception; } if (address.UseSsl) { SslSocket sslSocket = new SslSocket(socket); sslSocket.AuthenticateAsClient( address.Host, null, noVerification ? SslVerification.NoVerification : SslVerification.VerifyPeer, SslProtocols.Default); this.socketTransport = sslSocket; } else { this.socketTransport = socket; } }
public void Connect(Connection connection, Address address, bool noVerification) { TcpSocket socket = new TcpSocket(); socket.Connect(address.Host, address.Port); if (address.UseSsl) { SslSocket sslSocket = new SslSocket(socket, noVerification); sslSocket.AuthenticateAsClient(address.Host); this.socketTransport = sslSocket; } else { this.socketTransport = socket; } }
public async Task ConnectAsync(Address address, ConnectionFactory factory) { Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp); if (factory.tcpSettings != null) { factory.tcpSettings.Configure(socket); } await Task.Factory.FromAsync( (c, s) => ((Socket)s).BeginConnect(address.Host, address.Port, c, s), (r) => ((Socket)r.AsyncState).EndConnect(r), socket); IAsyncTransport transport; if (address.UseSsl) { SslStream sslStream; var ssl = factory.SslInternal; if (ssl == null) { sslStream = new SslStream(new NetworkStream(socket)); await sslStream.AuthenticateAsClientAsync(address.Host); } else { sslStream = new SslStream(new NetworkStream(socket), false, ssl.RemoteCertificateValidationCallback, ssl.LocalCertificateSelectionCallback); await sslStream.AuthenticateAsClientAsync(address.Host, ssl.ClientCertificates, ssl.Protocols, ssl.CheckCertificateRevocation); } transport = new SslSocket(this, sslStream); } else { transport = new TcpSocket(this, socket); } this.socketTransport = transport; this.writer = new Writer(this, this.socketTransport); }
public async Task ConnectAsync(Address address, ConnectionFactory factory) { IPAddress[] ipAddresses; IPAddress ip; if (IPAddress.TryParse(address.Host, out ip)) { ipAddresses = new IPAddress[] { ip }; } else { ipAddresses = await TaskExtensions.GetHostAddressesAsync(address.Host); } // need to handle both IPv4 and IPv6 Socket socket = null; Exception exception = null; for (int i = 0; i < ipAddresses.Length; i++) { if (ipAddresses[i] == null || (ipAddresses[i].AddressFamily == AddressFamily.InterNetwork && !Socket.OSSupportsIPv4) || (ipAddresses[i].AddressFamily == AddressFamily.InterNetworkV6 && !Socket.OSSupportsIPv6)) { continue; } socket = new Socket(ipAddresses[i].AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { await socket.ConnectAsync(ipAddresses[i], address.Port); exception = null; break; } catch (Exception e) { exception = e; socket.Dispose(); socket = null; } } if (socket == null) { throw exception ?? new SocketException((int)SocketError.AddressNotAvailable); } if (factory.tcpSettings != null) { factory.tcpSettings.Configure(socket); } IAsyncTransport transport; if (address.UseSsl) { SslStream sslStream; var ssl = factory.SslInternal; if (ssl == null) { sslStream = new SslStream(new NetworkStream(socket)); await sslStream.AuthenticateAsClientAsync(address.Host); } else { sslStream = new SslStream(new NetworkStream(socket), false, ssl.RemoteCertificateValidationCallback, ssl.LocalCertificateSelectionCallback); await sslStream.AuthenticateAsClientAsync(address.Host, ssl.ClientCertificates, ssl.Protocols, ssl.CheckCertificateRevocation); } transport = new SslSocket(this, sslStream); } else { transport = new TcpSocket(this, socket); } this.socketTransport = transport; this.writer = new Writer(this, this.socketTransport); }
public void Connect(Connection connection, Address address, bool noVerification) { var ipHostEntry = Dns.GetHostEntry(address.Host); Exception exception = null; TcpSocket socket = null; // reference to SSL socket, wrapper for above TCP socket SslSocket sslSocket = null; foreach (var ipAddress in ipHostEntry.AddressList) { if (ipAddress == null) { continue; } try { socket = new TcpSocket(); // SSL connection requested with an SSL host if (address.UseSsl) { // wrap TCP socket to SSL socket sslSocket = new SslSocket(socket, address.Host, ValidateCertificate); } socket.Connect(new IPEndPoint(ipAddress, address.Port)); exception = null; break; } catch (SocketException socketException) { if (address.UseSsl) { if (sslSocket != null) { sslSocket.Close(); sslSocket = null; } } if (socket != null) { socket.Close(); socket = null; } exception = socketException; } } if (exception != null) { throw exception; } if (address.UseSsl) { this.socketTransport = sslSocket; } else { this.socketTransport = socket; } }
public async Task ConnectAsync(Address address, ConnectionFactory factory) { Socket socket; IPAddress[] ipAddresses; IPAddress ipAddress; if (IPAddress.TryParse(address.Host, out ipAddress)) { socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); ipAddresses = new IPAddress[] { ipAddress }; } else { socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ipAddresses = Dns.GetHostEntry(address.Host).AddressList; } if (factory.tcpSettings != null) { factory.tcpSettings.Configure(socket); } await Task.Factory.FromAsync( (c, s) => ((Socket)s).BeginConnect(ipAddresses, address.Port, c, s), (r) => ((Socket)r.AsyncState).EndConnect(r), socket); IAsyncTransport transport; if (address.UseSsl) { SslStream sslStream; var ssl = factory.SslInternal; if (ssl == null) { sslStream = new SslStream(new NetworkStream(socket)); await sslStream.AuthenticateAsClientAsync(address.Host); } else { sslStream = new SslStream(new NetworkStream(socket), false, ssl.RemoteCertificateValidationCallback); await sslStream.AuthenticateAsClientAsync(address.Host, ssl.ClientCertificates, ssl.Protocols, ssl.CheckCertificateRevocation); } transport = new SslSocket(this, sslStream); } else { transport = new TcpSocket(this, socket); } this.socketTransport = transport; this.writer = new Writer(this, this.socketTransport); }