Advertisement

[x]
Attachment Details

VB.NET 2005 FTP Program - TCPIP and Sockets using wrong ports and not working through Windows Firewall

[x]
The Solution Rating System

With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.

  • The Grade of the Solution
  • The Zone Rank of the Expert Providing the Solution
  • The Number of Author and Expert Comments
  • The Number of Experts Contributing
  • The Feedback of the Community

Your Input Matters
Because of the way the system is set up, the most important variable in this equation is you. As a member of Experts Exchange, you are able to cast your vote on the quality of the solutions in regard to how complete, accurate, helpful and easy to understand each solution is. When you provide your feedback, each rating is adjusted accordingly. So, if you see a solution that has a poor rating that you think is a good solution, let us know by rating it. As you do, the rating will be adjusted and will become more accurate for other members of our site.

If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support.

Thank you!

5.4
See the attached code (670 lines)

This class enables FTP ing via visual basic. I got it free on the internet !!  Only problem is, it doesn't work when the target server is running windows firewall.

I caught it in the debugger and the problem is in Private Function CreateDataSocket, on the line "s.Connect(ep)"

The variable "port" in the program is programmatically generated and is a different number each time. Windows firewall is also rejecting other ports as in the below pfirewall.log:

#Version: 1.5
#Software: Microsoft Windows Firewall
#Time Format: Local
#Fields: date time action protocol src-ip dst-ip src-port dst-port size tcpflags tcpsyn tcpack tcpwin icmptype icmpcode info path

2008-06-16 16:48:23 DROP TCP 99.99.108.178 99.99.163.114 3104 1196 48 S 507753288 0 65535 - - - RECEIVE
2008-06-16 16:48:32 DROP TCP 99.99.108.178 99.99.163.114 3104 1196 48 S 507753288 0 65535 - - - RECEIVE
2008-06-16 16:48:26 DROP TCP 99.99.108.178 99.99.163.114 3104 1196 48 S 507753288 0 65535 - - - RECEIVE
2008-06-16 17:59:07 DROP TCP 99.99.108.178 99.99.163.114 3126 1048 48 S 2942101445 0 65535 - - - RECEIVE
2008-06-16 17:59:04 DROP TCP 99.99.108.178 99.99.163.114 3126 1048 48 S 2942101445 0 65535 - - - RECEIVE
2008-06-16 17:59:13 DROP TCP 99.99.108.178 99.99.163.114 3126 1048 48 S 2942101445 0 65535 - - - RECEIVE

So ports 1196 and 1048 were attempted on different calls.

Any ideas how to fix this program so it can work just through port 21 ?

thanks
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
506:
507:
508:
509:
510:
511:
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537:
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
551:
552:
553:
554:
555:
556:
557:
558:
559:
560:
561:
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585:
586:
587:
588:
589:
590:
591:
592:
593:
594:
595:
596:
597:
598:
599:
600:
601:
602:
603:
604:
605:
606:
607:
608:
609:
610:
611:
612:
613:
614:
615:
616:
617:
618:
619:
620:
621:
622:
623:
624:
625:
626:
627:
628:
629:
630:
631:
632:
633:
634:
635:
636:
637:
638:
639:
640:
641:
642:
643:
644:
645:
646:
647:
648:
649:
650:
651:
652:
653:
654:
655:
656:
657:
658:
659:
660:
661:
662:
663:
664:
665:
666:
667:
668:
Public Class Ftp
 
    Private m_sRemoteHost, m_sRemotePath, m_sRemoteUser As String
    Private m_sRemotePassword, m_sMess As String
    Private m_iRemotePort, m_iBytes As Int32
    Private m_objClientSocket As System.Net.Sockets.Socket
 
    Private m_iRetValue As Int32
    Private m_bLoggedIn As Boolean
    Private m_sMes, m_sReply As String
 
    'Set the size of the packet that is used to read and to write data to the FTP server
    'to the following specified size.
    Public Const BLOCK_SIZE As Integer = 512
    Private m_aBuffer(BLOCK_SIZE) As Byte
    Private ASCII As System.Text.Encoding = System.Text.Encoding.ASCII
    Public flag_bool As Boolean
    'General variable declaration
    Private m_sMessageString As String
 
    ' Parameterized constructor
    Public Sub New(ByVal sRemoteHost As String, _
                   ByVal sRemoteUser As String, _
                   ByVal sRemotePassword As String, _
                   ByVal iRemotePort As Int32, _
                   ByVal sRemotePath As String)
        m_sRemoteHost = sRemoteHost
        m_sRemotePath = sRemotePath
        m_sRemoteUser = sRemoteUser
        m_sRemotePassword = sRemotePassword
        m_sMessageString = ""
        m_iRemotePort = iRemotePort
        m_bLoggedIn = False
    End Sub
 
 
    'Set or Get the name of the FTP server that you want to connect.
    Public Property RemoteHostFTPServer() As String
        'Get the name of the FTP server.
        Get
            Return m_sRemoteHost
        End Get
        'Set the name of the FTP server.
        Set(ByVal Value As String)
            m_sRemoteHost = Value
        End Set
    End Property
 
    'Set or Get the FTP Port Number of the FTP server that you want to connect.
    Public Property RemotePort() As Int32
        'Get the FTP Port Number.
        Get
            Return m_iRemotePort
        End Get
        'Set the FTP Port Number.
        Set(ByVal Value As Int32)
            m_iRemotePort = Value
 
        End Set
    End Property
 
    'Set or Get the remote path of the FTP server that you want to connect.
    Public Property RemotePath() As String
        'Get the remote path.
        Get
            Return m_sRemotePath
        End Get
        'Set the remote path.
        Set(ByVal Value As String)
            m_sRemotePath = Value
        End Set
    End Property
 
    'Set or Get the remote password of the FTP server that you want to connect.
    Public Property RemotePassword() As String
        Get
            Return m_sRemotePassword
        End Get
        Set(ByVal Value As String)
            m_sRemotePassword = Value
        End Set
    End Property
 
    'Set or Get the remote user of the FTP server that you want to connect.
    Public Property RemoteUser() As String
        Get
            Return m_sRemoteUser
        End Get
        Set(ByVal Value As String)
            m_sRemoteUser = Value
        End Set
    End Property
 
    'Set the class MessageString.
    Public Property MessageString() As String
        Get
            Return m_sMessageString
        End Get
        Set(ByVal Value As String)
            m_sMessageString = Value
        End Set
    End Property
 
    'Return a list of files in a string() array from the file system.
    Public Function GetFileList(ByVal sMask As String) As String()
        Dim cSocket As System.Net.Sockets.Socket
        Dim bytes As Int32
        Dim seperator As Char = ControlChars.Lf
        Dim mess() As String
 
        m_sMes = ""
        'Check if you are logged on to the FTP server.
        If (Not (m_bLoggedIn)) Then
            Login()
        End If
 
        cSocket = CreateDataSocket()
        'Send an FTP command,
        SendCommand("NLST " & sMask)
 
        If (Not (m_iRetValue = 150 Or m_iRetValue = 125)) Then
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
 
        m_sMes = ""
        Do While (True)
            Array.Clear(m_aBuffer, 0, m_aBuffer.Length)
            bytes = cSocket.Receive(m_aBuffer, m_aBuffer.Length, 0)
            m_sMes += ASCII.GetString(m_aBuffer, 0, bytes)
 
            If (bytes < m_aBuffer.Length) Then
                Exit Do
            End If
        Loop
 
        mess = m_sMes.Split(seperator)
        cSocket.Close()
        ReadReply()
 
        If (m_iRetValue <> 226) Then
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
 
        Return mess
    End Function
 
    ' Get the size of the file on the FTP server.
    Public Function GetFileSize(ByVal sFileName As String) As Long
        Dim size As Long
 
        If (Not (m_bLoggedIn)) Then
            Login()
        End If
        'Send an FTP command.
        SendCommand("SIZE " & sFileName)
        size = 0
 
        If (m_iRetValue = 213) Then
            size = Int64.Parse(m_sReply.Substring(4))
        Else
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
 
        Return size
    End Function
 
    'Log on to the FTP server.
    Public Function Login() As Boolean
 
        m_objClientSocket = New System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp)
 
        Dim ep As New System.Net.IPEndPoint(Net.IPAddress.Parse(m_sRemoteHost), m_iRemotePort)
 
        Try
            m_objClientSocket.Connect(ep)
        Catch ex As Exception
            MessageString = m_sReply
            Throw New System.IO.IOException("Cannot connect to remote server")
 
        End Try
 
        ReadReply()
        If (m_iRetValue <> 220) Then
            CloseConnection()
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
        'Send an FTP command to send a user logon ID to the server.
        SendCommand("USER " & m_sRemoteUser)
        If (Not (m_iRetValue = 331 Or m_iRetValue = 230)) Then
            Cleanup()
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
 
        If (m_iRetValue <> 230) Then
            'Send an FTP command to send a user logon password to the server.
            SendCommand("PASS " & m_sRemotePassword)
            If (Not (m_iRetValue = 230 Or m_iRetValue = 202)) Then
                Cleanup()
                MessageString = m_sReply
                Throw New System.IO.IOException(m_sReply.Substring(4))
            End If
        End If
 
        m_bLoggedIn = True
        'Call the ChangeDirectory user-defined function to change the folder to the
        'remote FTP folder that is mapped.
        ChangeDirectory(m_sRemotePath)
 
        'Return the final result.
        Return m_bLoggedIn
    End Function
 
    'If the value of mode is true, set the binary mode for downloads. Otherwise, set ASCII mode.
    Public Sub SetBinaryMode(ByVal bMode As Boolean)
 
        If (bMode) Then
            'Send the FTP command to set the binary mode.
            '(TYPE is an FTP command that is used to specify representation type.)
            SendCommand("TYPE I")
        Else
            'Send the FTP command to set ASCII mode.
            '(TYPE is a FTP command that is used to specify representation type.)
            SendCommand("TYPE A")
        End If
 
        If (m_iRetValue <> 200) Then
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
    End Sub
 
    Public Sub SetSiteFileType(ByVal FileType As String)
        Dim cmdString As New System.Text.StringBuilder
        cmdString.Append("site filetype=").Append(FileType)
 
        SendCommand(cmdString.ToString)
 
        If (m_iRetValue <> 200) Then
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
    End Sub
 
    ' Download a file to the local folder of the assembly, and keep the same file name.
    Public Sub DownloadFile(ByVal sFileName As String)
        DownloadFile(sFileName, "", False)
    End Sub
    ' Download a remote file to the local folder of the assembly, and keep the same file name.
    Public Sub DownloadFile(ByVal sFileName As String, _
                            ByVal bResume As Boolean)
        DownloadFile(sFileName, "", bResume)
    End Sub
    'Download a remote file to a local file name. You must include a path.
    'The local file name will be created or will be overwritten, but the path must exist.
    Public Sub DownloadFile(ByVal sFileName As String, _
                            ByVal sLocalFileName As String)
        DownloadFile(sFileName, sLocalFileName, False)
    End Sub
    ' Download a remote file to a local file name and include a path. Then, set the
    ' resume flag. The local file name will be created or will be overwritten, but the path must exist.
    Public Sub DownloadFile(ByVal sFileName As String, _
                            ByVal sLocalFileName As String, _
                            ByVal bResume As Boolean)
        Dim st As System.IO.Stream
        Dim output As System.IO.FileStream
        Dim cSocket As System.Net.Sockets.Socket
        Dim offset, npos As Long
 
        If (Not (m_bLoggedIn)) Then
            Login()
        End If
 
        'SetBinaryMode(True)
 
        If (sLocalFileName.Equals("")) Then
            sLocalFileName = sFileName
        End If
 
        If (Not (System.IO.File.Exists(sLocalFileName))) Then
            st = System.IO.File.Create(sLocalFileName)
            st.Close()
        End If
 
        output = New System.IO.FileStream(sLocalFileName, System.IO.FileMode.Open)
        cSocket = CreateDataSocket()
        offset = 0
 
        If (bResume) Then
            offset = output.Length
 
            If (offset > 0) Then
                'Send an FTP command to restart.
                SendCommand("REST " & offset)
                If (m_iRetValue <> 350) Then
                    offset = 0
                End If
            End If
 
            If (offset > 0) Then
                npos = output.Seek(offset, System.IO.SeekOrigin.Begin)
            End If
        End If
        'Send an FTP command to retrieve a file.
        SendCommand("RETR " & sFileName)
 
        If (Not (m_iRetValue = 150 Or m_iRetValue = 125)) Then
            output.Close()
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
 
        Do While (True)
            Array.Clear(m_aBuffer, 0, m_aBuffer.Length)
            m_iBytes = cSocket.Receive(m_aBuffer, m_aBuffer.Length, 0)
            output.Write(m_aBuffer, 0, m_iBytes)
 
            If (m_iBytes <= 0) Then
                Exit Do
            End If
        Loop
 
        output.Close()
        If (cSocket.Connected) Then
            cSocket.Close()
        End If
 
        ReadReply()
        If (Not (m_iRetValue = 226 Or m_iRetValue = 250)) Then
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
 
    End Sub
 
    ' Delete a file from the remote FTP server.
    Public Function DeleteFile(ByVal sFileName As String) As Boolean
        Dim bResult As Boolean
 
        bResult = True
        If (Not (m_bLoggedIn)) Then
            Login()
        End If
        'Send an FTP command to delete a file.
        SendCommand("DELE " & sFileName)
        If (m_iRetValue <> 250) Then
            bResult = False
            MessageString = m_sReply
        End If
 
        ' Return the final result.
        Return bResult
    End Function
    ' Rename a file on the remote FTP server.
    Public Function RenameFile(ByVal sOldFileName As String, _
                               ByVal sNewFileName As String) As Boolean
        Dim bResult As Boolean
 
        bResult = True
        If (Not (m_bLoggedIn)) Then
            Login()
        End If
        'Send an FTP command to rename a file.
        SendCommand("RNFR " & sOldFileName)
        If (m_iRetValue <> 350) Then
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
 
        'Send an FTP command to rename a file to a file name.
        'It will overwrite if newFileName exists.
        SendCommand("RNTO " & sNewFileName)
        If (m_iRetValue <> 250) Then
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
        ' Return the final result.
        Return bResult
    End Function
 
    'This is a function that is used to create a folder on the remote FTP server.
    Public Function CreateDirectory(ByVal sDirName As String) As Boolean
        Dim bResult As Boolean
 
        bResult = True
        If (Not (m_bLoggedIn)) Then
            Login()
        End If
        'Send an FTP command to make a folder on the FTP server.
        SendCommand("MKD " & sDirName)
        If (m_iRetValue <> 257) Then
            bResult = False
            MessageString = m_sReply
        End If
 
        ' Return the final result.
        Return bResult
    End Function
    ' This is a function that is used to delete a folder on the remote FTP server.
    Public Function RemoveDirectory(ByVal sDirName As String) As Boolean
        Dim bResult As Boolean
 
        bResult = True
        'Check if you are logged on to the FTP server.
        If (Not (m_bLoggedIn)) Then
            Login()
        End If
        'Send an FTP command to remove a folder on the FTP server.
        SendCommand("RMD " & sDirName)
        If (m_iRetValue <> 250) Then
            bResult = False
            MessageString = m_sReply
        End If
 
        ' Return the final result.
        Return bResult
    End Function
    'This is a function that is used to change the current working folder on the remote FTP server.
    Public Function ChangeDirectory(ByVal sDirName As String) As Boolean
        Dim bResult As Boolean
 
        bResult = True
        'Check if you are in the root directory.
        If (sDirName.Equals(".")) Then
            Exit Function
        End If
        'Check if you are logged on to the FTP server.
        If (Not (m_bLoggedIn)) Then
            Login()
        End If
        'Send an FTP command to change the folder on the FTP server.
        SendCommand("CWD " & sDirName)
        If (m_iRetValue <> 250) Then
            bResult = False
            MessageString = m_sReply
        End If
 
        Me.m_sRemotePath = sDirName
 
        ' Return the final result.
        Return bResult
    End Function
    ' Close the FTP connection of the remote server.
    Public Sub CloseConnection()
        If (Not (m_objClientSocket Is Nothing)) Then
            'Send an FTP command to end an FTP server system.
            SendCommand("QUIT")
        End If
 
        Cleanup()
    End Sub
 
    ' Read the reply from the FTP server.
    Private Sub ReadReply()
        m_sMes = ""
        m_sReply = ReadLine()
        m_iRetValue = Int32.Parse(m_sReply.Substring(0, 3))
    End Sub
 
    ' Clean up some variables.
    Private Sub Cleanup()
        If Not (m_objClientSocket Is Nothing) Then
            m_objClientSocket.Close()
            m_objClientSocket = Nothing
        End If
 
        m_bLoggedIn = False
    End Sub
    ' Read a line from the FTP server.
    Private Function ReadLine(Optional ByVal bClearMes As Boolean = False) As String
        Dim seperator As Char = ControlChars.Lf
        Dim mess() As String
 
        If (bClearMes) Then
            m_sMes = ""
        End If
        Do While (True)
            Array.Clear(m_aBuffer, 0, BLOCK_SIZE)
            m_iBytes = m_objClientSocket.Receive(m_aBuffer, m_aBuffer.Length, 0)
            m_sMes += ASCII.GetString(m_aBuffer, 0, m_iBytes)
            If (m_iBytes < m_aBuffer.Length) Then
                Exit Do
            End If
        Loop
 
        mess = m_sMes.Split(seperator)
        If (m_sMes.Length > 2) Then
            m_sMes = mess(mess.Length - 2)
        Else
            m_sMes = mess(0)
        End If
        'TODO fix problem reading zero length field
        If (Not (m_sMes.Substring(3, 1).Equals(" "))) Then
            Return ReadLine(True)
        End If
 
        Return m_sMes
    End Function
    ' This is a function that is used to send a command to the FTP server that you are connected to.
    Private Sub SendCommand(ByVal sCommand As String)
        sCommand = sCommand & ControlChars.CrLf
        Dim cmdbytes As Byte() = ASCII.GetBytes(sCommand)
        m_objClientSocket.Send(cmdbytes, cmdbytes.Length, 0)
        ReadReply()
    End Sub
    ' Create a data socket.
    Private Function CreateDataSocket() As System.Net.Sockets.Socket
        Dim index1, index2, len As Int32
        Dim partCount, i, port As Int32
        Dim ipData, buf, ipAddress As String
        Dim parts(6) As Int32
        Dim ch As Char
        Dim s As System.Net.Sockets.Socket
        Dim ep As System.Net.IPEndPoint
        'Send an FTP command to use a passive data connection.
        SendCommand("PASV")
        If (m_iRetValue <> 227) Then
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
 
        index1 = m_sReply.IndexOf("(")
        index2 = m_sReply.IndexOf(")")
        ipData = m_sReply.Substring(index1 + 1, index2 - index1 - 1)
 
        len = ipData.Length
        partCount = 0
        buf = ""
 
        For i = 0 To len - 1
            If partCount > 6 Then
                Exit For
            End If
            ch = Char.Parse(ipData.Substring(i, 1))
            If (Char.IsDigit(ch)) Then
                buf += ch
            ElseIf (ch <> ",") Then
                MessageString = m_sReply
                Throw New System.IO.IOException("Malformed PASV reply: " & m_sReply)
            End If
 
            If ((ch = ",") Or (i + 1 = len)) Then
                Try
                    parts(partCount) = Int32.Parse(buf)
                    partCount += 1
                    buf = ""
                Catch ex As Exception
                    MessageString = m_sReply
                    Throw New System.IO.IOException("Malformed PASV reply: " & m_sReply)
                End Try
            End If
        Next
 
        ipAddress = parts(0) & "." & parts(1) & "." & parts(2) & "." & parts(3)
 
        ' Make this call in Visual Basic .NET 2002.  You want to
        ' bitshift the number by 8 bits. Therefore, in Visual Basic .NET 2002, you must
        ' multiply the number by 2 to the power of 8.
        'port = parts(4) * (2 ^ 8)
 
        ' Make this call and then comment out the previous line for Visual Basic .NET 2003.
        port = parts(4) << 8
 
        ' Determine the data port number.
        port = port + parts(5)
 
        s = New System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp)
        'ep = New System.Net.IPEndPoint(Dns.Resolve(ipAddress).AddressList(0), port)
        ep = New System.Net.IPEndPoint(Net.IPAddress.Parse(ipAddress), port)
 
        Try
            s.Connect(ep)                     /// ********* THIS IS THE PROBLEM LINE - EP.port is not 21 - so this hits windows firewall and times out ********** ////////
        Catch ex As Exception
            MessageString = m_sReply
            Throw New System.IO.IOException("Cannot connect to remote server")
            'If you cannot connect to the FTP
            'server that is specified, make the boolean variable false.
            flag_bool = False
        End Try
        'If you can connect to the FTP server that is specified, make the boolean variable true.
        flag_bool = True
        Return s
    End Function
 
 
    Public Sub UploadFile(ByVal sFileName As String, ByVal sUploadName As String, _
                              ByVal bResume As Boolean)
        Dim cSocket As System.Net.Sockets.Socket
        Dim offset As Long
        Dim input As System.IO.FileStream
        Dim bFileNotFound As Boolean
 
        If (Not (m_bLoggedIn)) Then
            Login()
        End If
 
        cSocket = CreateDataSocket()
        offset = 0
 
        If (bResume) Then
            Try
                'SetBinaryMode(True)
                offset = GetFileSize(sFileName)
            Catch ex As Exception
                offset = 0
            End Try
        End If
 
        If (offset > 0) Then
            SendCommand("REST " & offset)
            If (m_iRetValue <> 350) Then
 
                'The remote server may not support resuming.
                offset = 0
            End If
        End If
        'Send an FTP command to store a file.
        SendCommand("STOR " & sUploadName)
        If (Not (m_iRetValue = 125 Or m_iRetValue = 150)) Then
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
 
        'Check to see if the file exists before the upload.
        bFileNotFound = False
        If (System.IO.File.Exists(sFileName)) Then
            ' Open the input stream to read the source file.
            input = New System.IO.FileStream(sFileName, System.IO.FileMode.Open)
            If (offset <> 0) Then
                input.Seek(offset, System.IO.SeekOrigin.Begin)
            End If
 
            'Upload the file.
            m_iBytes = input.Read(m_aBuffer, 0, m_aBuffer.Length)
            Do While (m_iBytes > 0)
                cSocket.Send(m_aBuffer, m_iBytes, 0)
                m_iBytes = input.Read(m_aBuffer, 0, m_aBuffer.Length)
            Loop
            input.Close()
        Else
            bFileNotFound = True
        End If
 
        If (cSocket.Connected) Then
            cSocket.Close()
        End If
 
        'Check the return value if the file was not found.
        If (bFileNotFound) Then
            MessageString = m_sReply
            Throw New System.IO.IOException("The file: " & sFileName & " was not found." & _
            " Cannot upload the file to the FTP site.")
 
        End If
 
        ReadReply()
        If (Not (m_iRetValue = 226 Or m_iRetValue = 250)) Then
            MessageString = m_sReply
            Throw New System.IO.IOException(m_sReply.Substring(4))
        End If
    End Sub
 
 
End Class
Related Solutions
Related Solutions
 
Loading Advertisement...
 
Expert Comment by sunnycoder:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Author Comment by plq:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Author Comment by plq:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Expert Comment by sunnycoder:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Author Comment by plq:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Expert Comment by sunnycoder:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Author Comment by plq:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Author Comment by plq:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Expert Comment by rstaveley:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Expert Comment by rstaveley:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Author Comment by plq:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Accepted Solution by plq:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Expert Comment by rstaveley:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Expert Comment by rstaveley:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Author Comment by plq:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Administrative Comment by kodiakbear:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Administrative Comment by modus_operandi:

All comments and solutions are available to Premium Service Members only.

Start your 7-day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
Loading Advertisement...
20080924-EE-VQP-40 / EE_QW_2_20070628