Click here to Skip to main content
14,867,123 members
Articles / Programming Languages / C#
Posted 16 Sep 2003


43 bookmarked

C# FTP client, based on the WinInet.dll API

Rate me:
Please Sign up or sign in to vote.
3.24/5 (33 votes)
16 Sep 20032 min read
The WinInet.dll API is able to tunnel through firewalls - this simple FTP client will support file transfer even when your firewall has only port 21open!


When I needed to add automated file transfer to and from a remote FTP server, I found any number of excellent, clear, well structured and beautifully documented examples; both commercial and private - and all useless to me! Our Internet access is over a rather 'well throttled' firewall that seems to only have port 21 left open. The classic sockets approach to implementing an FTP client will open a 'command channel' over port 21 (default FTP port), allowing the client to sign-on etc., but as soon as any data is required to flow a second, 'data channel' must be opened (default port 20). Active or passive, I could not establish a second channel through our firewall.

I would have given up at this stage and started to look for a new employer, when it occurred to me that the Windows Explorer was perfectly able to exchange data with all and any FTP server I pointed it at... this runs over exactly the same firewall, so something strange and not just a bit magical is happening here. It turns out this bit of magic is to be found in the WinInet.dll. I am still not quite sure how the WinInet.dll works, it seems to sweet talk the firewall into opening just a small chink in its armor - but the important thing is that it works!

In order to use the FTP features of WinInet.dll, I needed to encapsulate the API in C#. This was mostly pain free, except for the marshaling of string parameters - it is documented, but you have to know what to look for. Having finished this, I figured I could offer it to the C# community; maybe I will save somebody many frustrating hours trying to bore through his corporate firewall, but also because I am quite sure I am going to get a bunch of really helpful feedback... for example, why does a successful file deletion return error code 2 = file not found? Ah, the mysteries of API programming.

I have included a very minimal console application to test the basic functionality - the default URL is, users are invited to replace this with their own target.


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Peter Beedell
Web Developer
Germany Germany
As a Brit who sacrificed warm beer baked beans for Bayerisch lager and Bratwurst about 12 years ago, I feel European and proud of it!

Comments and Discussions

QuestionUnknown error code: 1008 Pin
dba@tom30-Aug-11 23:04
Memberdba@tom30-Aug-11 23:04 
RantInternetOpen Bug Pin
jbuehler25-Jan-10 15:05
Memberjbuehler25-Jan-10 15:05 
GeneralMy vote of 2 Pin
#realJSOP8-Jan-09 9:26
mva#realJSOP8-Jan-09 9:26 
GeneralRe: My vote of 2 Pin
Elmue11-Jan-09 5:23
MemberElmue11-Jan-09 5:23 
GeneralA comfortable FTP class in .NET Pin
Elmue27-Aug-08 12:22
MemberElmue27-Aug-08 12:22 
GeneralRe: A comfortable FTP class in .NET Pin
#realJSOP8-Jan-09 9:27
mva#realJSOP8-Jan-09 9:27 
GeneralRe: A comfortable FTP class in .NET Pin
Elmue11-Jan-09 5:12
MemberElmue11-Jan-09 5:12 
QuestionPossibility to use QUOTE RCMD SBMJOB CMD()? Pin
paoloden6-Jan-07 0:58
Memberpaoloden6-Jan-07 0:58 
Generalget every file of a directory Pin
wilco9623-Feb-06 7:22
Memberwilco9623-Feb-06 7:22 
AnswerRe: get every file of a directory Pin
antgao9-Nov-06 4:21
Memberantgao9-Nov-06 4:21 
GeneralRe: get every file of a directory Pin
gan.gary15-Sep-08 23:39
Membergan.gary15-Sep-08 23:39 
Generalimportant change required for using in .Net 2.0... PinPopular
Tim_Mackey8-Feb-06 2:55
MemberTim_Mackey8-Feb-06 2:55 
GeneralRe: important change required for using in .Net 2.0... Pin
shareeef8-Dec-06 8:52
Membershareeef8-Dec-06 8:52 
GeneralRe: important change required for using in .Net 2.0... Pin
Victortto16-Oct-07 13:08
MemberVictortto16-Oct-07 13:08 
GeneralRe: important change required for using in .Net 2.0... Pin
Triple-S21-Oct-07 0:52
MemberTriple-S21-Oct-07 0:52 
RantRe: important change required for using in .Net 2.0... Pin
HAIXJ28-May-08 1:09
MemberHAIXJ28-May-08 1:09 
GeneralBug Pin
elbertlev8-Jan-06 6:52
Memberelbertlev8-Jan-06 6:52 
QuestionHow to put it in passive mode Pin
adamloving28-Sep-05 7:56
Memberadamloving28-Sep-05 7:56 
GeneralfunIConnect failed, error value: 3 Pin
jklpq23-Mar-05 3:14
Memberjklpq23-Mar-05 3:14 
GeneralRe: funIConnect failed, error value: 3 Pin
DCChristopher29-Sep-05 5:20
MemberDCChristopher29-Sep-05 5:20 
GeneralRe: funIConnect failed, error value: 3 Pin
Member 291684726-Feb-08 12:03
MemberMember 291684726-Feb-08 12:03 
GeneralRe: funIConnect failed, error value: 3 Pin
jasonsmithwick12-Jan-09 8:30
Memberjasonsmithwick12-Jan-09 8:30 
GeneralConnection Timeout Problem Pin
Rattan25-Nov-04 19:41
MemberRattan25-Nov-04 19:41 
GeneralOverwrite locked file Pin
kholland1522-Nov-04 4:35
Memberkholland1522-Nov-04 4:35 
GeneralFree, open-source pure C# FTP component Pin
h_c_a_andersen11-Nov-04 9:15
Memberh_c_a_andersen11-Nov-04 9:15 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.