/// <summary> /// Binds the channel to the specified endpoint. /// </summary> /// <param name="remoteEndpoint">The endpoint to connect to.</param> /// <param name="forwardedPort">The forwarded port for which the channel is opened.</param> public void Bind(IPEndPoint remoteEndpoint, IForwardedPort forwardedPort) { if (!IsConnected) { throw new SshException("Session is not connected."); } _forwardedPort = forwardedPort; _forwardedPort.Closing += ForwardedPort_Closing; // Try to connect to the socket try { _socket = SocketAbstraction.Connect(remoteEndpoint, ConnectionInfo.Timeout); // send channel open confirmation message SendMessage(new ChannelOpenConfirmationMessage(RemoteChannelNumber, LocalWindowSize, LocalPacketSize, LocalChannelNumber)); } catch (Exception exp) { // send channel open failure message SendMessage(new ChannelOpenFailureMessage(RemoteChannelNumber, exp.ToString(), ChannelOpenFailureMessage.ConnectFailed, "en")); throw; } var buffer = new byte[RemotePacketSize]; SocketAbstraction.ReadContinuous(_socket, buffer, 0, buffer.Length, SendData); }
/// <summary> /// Establishes a socket connection to the specified host and port. /// </summary> /// <param name="host">The host name of the server to connect to.</param> /// <param name="port">The port to connect to.</param> /// <param name="timeout">The maximum time to wait for the connection to be established.</param> /// <exception cref="SshOperationTimeoutException">The connection failed to establish within the configured <see cref="ConnectionInfo.Timeout"/>.</exception> /// <exception cref="SocketException">An error occurred trying to establish the connection.</exception> protected Socket SocketConnect(string host, int port, TimeSpan timeout) { var ipAddress = DnsAbstraction.GetHostAddresses(host)[0]; var ep = new IPEndPoint(ipAddress, port); DiagnosticAbstraction.Log(string.Format("Initiating connection to '{0}:{1}'.", host, port)); var socket = SocketFactory.Create(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { SocketAbstraction.Connect(socket, ep, timeout); const int socketBufferSize = 2 * Session.MaximumSshPacketSize; socket.SendBufferSize = socketBufferSize; socket.ReceiveBufferSize = socketBufferSize; return(socket); } catch (Exception) { socket.Dispose(); throw; } }