More .NET libraries
-
Rebex SFTP
.NET SFTP client
-
Rebex File Transfer Pack
FTP and SFTP together
-
Rebex Total Pack
All Rebex .NET libraries together
Back to feature list...
Proxies and custom sockets
On this page:
FTP proxy servers
FTP proxy servers differs according to sequence of FTP commands used to pass connection and authentication data to the proxy:
Proxy Type | FTP commands internally used by the proxy |
---|---|
FtpUser |
USER serverUser@proxyUser@serverHost[:serverPort] PASS serverPassword@proxyPassword |
FtpOpen |
USER proxyUser PASS proxyPassword OPEN serverHost[:serverPort] USER serverUser PASS serverPassword |
FtpSite |
USER proxyUser PASS proxyPassword SITE serverHost[:serverPort] USER serverUser PASS serverPassword |
FtpDoubleLogin |
USER ProxyUser@FtpHost PASS ProxyPassword USER FtpUser PASS FtpPassword |
To connect through an FTP proxy server, set Ftp.Proxy
properties
before calling the Connect
method. Use ProxyType
property to specify the proxy type from the above table:
// create FTP client instance
var ftp = new Rebex.Net.Ftp();
// use FTP OPEN proxy
ftp.Proxy.ProxyType = FtpProxyType.FtpOpen;
ftp.Proxy.Host = proxyHost;
ftp.Proxy.Port = proxyPort;
ftp.Proxy.UserName = proxyUserName;
ftp.Proxy.Password = proxyPassword;
// connect to the server
ftp.Connect(hostname);
' create FTP client instance
Dim ftp = New Rebex.Net.Ftp()
' use FTP OPEN proxy
ftp.Proxy.ProxyType = FtpProxyType.FtpOpen
ftp.Proxy.Host = proxyHost
ftp.Proxy.Port = proxyPort
ftp.Proxy.UserName = proxyUserName
ftp.Proxy.Password = proxyPassword
' connect to the server
ftp.Connect(hostname)
SOCKS4/SOCKS5 proxy servers
To connect through SOCKET4, SOCKET4a or SOCKS5 proxy servers, set Ftp.Proxy
properties
before calling the Connect
method. Use ProxyType
property to specify the proxy type:
// create FTP client instance
var ftp = new Rebex.Net.Ftp();
// use SOCKS5 proxy
ftp.Proxy.ProxyType = FtpProxyType.Socks5;
ftp.Proxy.Host = proxyHost;
ftp.Proxy.Port = proxyPort;
ftp.Proxy.UserName = proxyUserName;
// connect to the server
ftp.Connect(hostname);
' create FTP client instance
Dim ftp = New Rebex.Net.Ftp()
' use SOCKS5 proxy
ftp.Proxy.ProxyType = FtpProxyType.Socks5
ftp.Proxy.Host = proxyHost
ftp.Proxy.Port = proxyPort
ftp.Proxy.UserName = proxyUserName
' connect to the server
ftp.Connect(hostname)
HTTP CONNECT proxy servers
To connect through a HTTP proxy server, set Ftp.Proxy
properties
before calling the Connect
method. Make sure the proxy server supports HTTP CONNECT method,
and set the ProxyType
property to HttpConnect
:
// create FTP client instance
var ftp = new Rebex.Net.Ftp();
// use HTTP CONNECT proxy
ftp.Proxy.ProxyType = FtpProxyType.HttpConnect;
ftp.Proxy.Host = proxyHost;
ftp.Proxy.Port = proxyPort;
ftp.Proxy.UserName = proxyUserName;
ftp.Proxy.Password = proxyPassword;
// connect to the server
ftp.Connect(hostname);
' create FTP client instance
Dim ftp = New Rebex.Net.Ftp()
' use HTTP CONNECT proxy
ftp.Proxy.ProxyType = FtpProxyType.HttpConnect
ftp.Proxy.Host = proxyHost
ftp.Proxy.Port = proxyPort
ftp.Proxy.UserName = proxyUserName
ftp.Proxy.Password = proxyPassword
' connect to the server
ftp.Connect(hostname)
Proxies with single sign-on
Some HTTP CONNECT proxies support NTLM authentication with single sign-on. To take advantage of this
feature, set the AuthenticationMethod
property to ProxyAuthentication.Ntlm
.
// create FTP client instance
var ftp = new Rebex.Net.Ftp();
// use HTTP CONNECT proxy
ftp.Proxy.ProxyType = FtpProxyType.HttpConnect;
ftp.Proxy.Host = proxyHost;
ftp.Proxy.Port = proxyPort;
// use single sign-on
ftp.Proxy.AuthenticationMethod = FtpProxyAuthentication.Ntlm;
// connect to the server
ftp.Connect(hostname);
' create FTP client instance
Dim ftp = New Rebex.Net.Ftp()
' use HTTP CONNECT proxy
ftp.Proxy.ProxyType = FtpProxyType.HttpConnect
ftp.Proxy.Host = proxyHost
ftp.Proxy.Port = proxyPort
' use single sign-on
ftp.Proxy.AuthenticationMethod = FtpProxyAuthentication.Ntlm
' connect to the server
ftp.Connect(hostname)
SSH server as proxy
It's possible to tunnel FTP sessions through an SSH server, essentially using it as a proxy server.
You can utilize the SshSession
class from the Rebex.Networking
shared library, also available as part of Rebex FTP library.
// establish the shared SSH connection
var session = new Rebex.Net.SshSession();
session.Connect(sshHostname);
session.Authenticate(sshUsername, sshPassword);
// use SSH session as proxy to establish an FTP connection
var ftp = new Rebex.Net.Ftp();
ftp.SetSocketFactory(session.ToSocketFactory());
ftp.Connect(hostname);
ftp.Login(username, password);
// use 'ftp' object for FTP transfers
' establish the shared SSH connection
Dim session = New Rebex.Net.SshSession()
session.Connect(sshHostname)
session.Authenticate(sshUsername, sshPassword)
' use SSH session as proxy to establish an FTP connection
Dim ftp = New Rebex.Net.Ftp()
ftp.SetSocketFactory(session.ToSocketFactory())
ftp.Connect(hostname)
ftp.Login(username, password)
' use 'ftp' object for FTP transfers
Custom transport layer - ISocket
Rebex libraries make it possible to implement a custom transport layer,
giving you full control over the network communication.
All you need to do is implement a custom ISocketFactory
and
ISocket
interfaces and instruct the Ftp
object to use them.
// create FTP client instance
var ftp = new Rebex.Net.Ftp();
// initialize factory
SimpleSocketFactory factory = new SimpleSocketFactory();
factory.SocketConnecting += factory_SocketConnecting;
// use the factory
ftp.SetSocketFactory(factory);
// connect to the server
ftp.Connect(hostname);
' create FTP client instance
Dim ftp = New Rebex.Net.Ftp()
' initialize factory
Dim factory = New SimpleSocketFactory()
AddHandler factory.SocketConnecting, AddressOf factory_SocketConnecting
' use the factory
ftp.SetSocketFactory(factory)
' connect to the server
ftp.Connect(hostname)
Custom transport layer (ISocket/ISocketFactory) implementation
/// <summary>
/// Exposes SocketConnected event which is raised
/// when a socket successfully connects to a remote end.
/// </summary>
public class SimpleSocketFactory : ISocketFactory
{
/// <summary>
/// Occurs when a socket successfully connects to a remote end.
/// </summary>
public event EventHandler SocketConnecting;
// creates custom ISocket implementation
ISocket ISocketFactory.CreateSocket()
{
return new SimpleSocket(this);
}
// raises event
private void OnSocketConnecting()
{
EventHandler h = SocketConnecting;
if (h != null)
h(this, EventArgs.Empty);
}
// simple ISocket implementation
// (core functionality is taken from ProxySocket)
private class SimpleSocket : ProxySocket, ISocket
{
// creator object
private readonly SimpleSocketFactory _factory;
public SimpleSocket(SimpleSocketFactory factory)
{
_factory = factory;
}
// connects to a server and raises SocketConnected event
void ISocket.Connect(string serverName, int serverPort)
{
_factory.OnSocketConnecting();
base.Connect(serverName, serverPort);
}
// connects to a server and raises SocketConnected event
void ISocket.Connect(EndPoint endpoint)
{
_factory.OnSocketConnecting();
base.Connect(endpoint);
}
}
}
''' <summary>
''' Exposes SocketConnected event which is raised
''' when a socket successfully connects to a remote end.
''' </summary>
Public Class SimpleSocketFactory
Implements ISocketFactory
''' <summary>
''' Occurs when a socket successfully connects to a remote end.
''' </summary>
Public Event SocketConnecting As EventHandler
' creates custom ISocket implementation
Function CreateSocket() As ISocket Implements ISocketFactory.CreateSocket
Return New SimpleSocket(Me)
End Function
' raises event
Private Sub OnSocketConnecting()
RaiseEvent SocketConnecting(Me, EventArgs.Empty)
End Sub
' simple ISocket implementation
' (core functionality is taken from ProxySocket)
Private Class SimpleSocket
Inherits ProxySocket
Implements ISocket
' creator object
Dim _factory As SimpleSocketFactory
Public Sub New(ByVal factory As SimpleSocketFactory)
_factory = factory
End Sub
' connects to a server and raises SocketConnected event
Overloads Sub Connect(ByVal serverName As String, ByVal serverPort As Integer) Implements ISocket.Connect
_factory.OnSocketConnecting()
MyBase.Connect(serverName, serverPort)
End Sub
' connects to a server and raises SocketConnected event
Overloads Sub Connect(ByVal endpoint As EndPoint) Implements ISocket.Connect
_factory.OnSocketConnecting()
MyBase.Connect(endpoint)
End Sub
End Class
End Class
Please note that custom communication layer and proxy support are mutually exclusive - it's not possible to use both at the same time.
Back to feature list...