PDA

View Full Version : ftp



titbasoft
دوشنبه 26 بهمن 1383, 19:17 عصر
با سلام
من می خواستم از روی یک ftp با استفاده از proxy یک فایل رو download کنم . هدفم از این کار اینه که من از اینترنت بی سیم استفاده می کنم و در این نوع اینترنت ارسال دیتا از طریق دیش و با ست کردن یک proxy و userID و password مخصوص به آن انجام میگیره و دریافت اطلاعات هم از طریق dial-up پس برای download یک فایل حجیم از روی ftp نیاز به یک کد دارم.
حالا اگر با استفاده از proxy هم نشد اشکالی نداره فقط می خوام مراحل انتقال دیتا رو از login کردن گرفته تا ارسال دستورات ftp و صبر کردن برای گرفتن response و نحوه دریافت اطلاعات رو بدونم.
:گیج:

با تشکر از تمامی دوستان
:wink:

ehsan707
چهارشنبه 28 بهمن 1383, 10:07 صبح
چه راحت فقط یه کمی سخت
دوست عزیز شما میتونی کد بنویسی و یا از کامپوننت استفاده کنی
شکل کلی کار اینجوریه که باید پورت 21 رو باز کمی و پیامها رو بفرستی و به سوکت گوش کنی
اگه خواستی بشیتر توضیخ بدم

titbasoft
چهارشنبه 28 بهمن 1383, 12:16 عصر
احسان جان ممنون از جوابت .
ولی یه ذره زیر دیپلم ترش کن البته کلیات رو فهمیدم و این روش رو هم خودم می دونم ولی مشکل همون قسمت یکمی سختشه :cry: یعنی اینکه چطوری login کنم یا پورت رو باز کنم یا ftp command ها رو بفرستم . البته با msInet.ocx توی vb 6 یه کم قدیما کار کردم ولی می دونم جلوی networking دات نت باید بره لونگ بندازه.
حالا اگر component مجانی هم جایی سراغ دارید بازم کار ما رو راه می ندازه.

بازم مرسی :wink:

ehsan707
چهارشنبه 28 بهمن 1383, 16:11 عصر
زیاد مشکل نیست خودت هم میتونی بنویسی
من یه مثال برای برنامه
whois
توی این تالار گذاشتم کمی به کد ها نگاه کنی شاید مطلب رو بفهمی وقت کنم یه مثال برای تو هم میگدارم
کامپوننت رو هم در آدرس زیر پیدا کن
component spot

titbasoft
چهارشنبه 28 بهمن 1383, 18:48 عصر
آقا احسان componetspot که خیلی حال داد. و فکر کنم کارم رو راه میندازه. :موفق:
اما اگه زحمت نیست بدم نمیاد که کم کد نویسیش رو هم بدونم :cry:

تازه چند تا component دیگه هم توش پیدا کردم که اونها هم باعث شادی روح امت اسلام شد
:wink:

مرسی

ehsan707
پنج شنبه 29 بهمن 1383, 15:35 عصر
من هم بسیار مشعوف شدم که روح امت اسلام شاد شد الحمدالله

خوب حالا واسه کد نویسی کمر بندها را سفت کنید


اول باید کمی کلاس بگذاری یا بسازی




Imports System
Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Text.ASCIIEncoding
Imports System.Net.Sockets
Imports System.Configuration
Imports System.Resources


Public Class FtpClient

Private FRemoteHost As String = "127.0.0.1"
Private FRemotePath As String = "."
Private FRemoteUser As String = "anonymous"
Private FRemotePassword As String = "anonymous@nowhere.com"
Private FRemotePort As Integer = 21
Private clientSocket As Socket = Nothing
Private response As String

Public Sub New()
End Sub

Public Sub New(ByVal remoteHost As String, ByVal remotePath _
As String, _
ByVal remoteUser As String, ByVal remotePassword As String, _
ByVal remotePort As Integer)
FRemoteHost = remoteHost
FRemotePath = remotePath
FRemoteUser = remoteUser
FRemotePassword = remotePassword
FRemotePort = remotePort
End Sub


Public Sub Connect()
clientSocket = New Socket(AddressFamily.InterNetwork, _
SocketType.Stream, ProtocolType.Tcp)
Dim endpoint As IPEndPoint = _
New IPEndPoint(Dns.Resolve(FRemoteHost).AddressList(0) , _
FRemotePort)

Try
clientSocket.Connect(endpoint)
Catch ex As Exception
Throw New IOException("Connect failed", ex)
End Try

ReadResponse()
End Sub



روش کار همونیه که گفتم



Private Sub ReadResponse()
Dim reply As String = ReadLine()
'Figure out the response and raise that event
BroadcastResponse(reply)
End Sub

Private Function ReadLine() As String
Return ReadLine(False)
End Function

Private Function ReadLine(ByVal clearResponse As Boolean) _
As String
Const EndLine As Char = "\n"
Const BUFFER_SIZE As Integer = 512

Dim data As String = ""
Dim buffer(BUFFER_SIZE) As Byte
Dim bytesRead As Integer = 0

If (clearResponse = True) Then response = String.Empty

While (True)
Array.Clear(buffer, 0, BUFFER_SIZE)
bytesRead = clientSocket.Receive(buffer, _
buffer.Length, 0)
data += ASCII.GetString(buffer, 0, bytesRead)

If (bytesRead < buffer.Length) Then Exit While
End While

Dim parts() As String = data.Split(EndLine)

If (parts.Length > 2) Then
response = parts(parts.Length - 2)
Else
response = parts(0)
End If

If (response.Substring(3, 1).Equals(" ") = False) Then
Return ReadLine(False)
End If

Return response

End Function

یعنی یک تابع فرمان را از سرور ftp میخواند (ان شاالله)

در اینجا هم یک رویداد به حول و قوه الهی ایجاد میکنیم



Private Sub BroadcastResponse(ByVal reply As String)

' Permit handling as raw data
RaiseEvent OnRawDataReceivedEvent(Me, _
New RawDataReceivedEventArgs(reply))

Dim code As Integer = Int32.Parse(reply.Substring(0, 3))
Dim data As String = reply.Substring(4)

' Permit special handling as code and data
RaiseEvent OnTcpEvent(Me, New TcpEventArgs(code, data))


' Specific handling based on code
Select Case code
Case SENDING_DATA_PORT_20
Case COMMAND_NOT_IMPLEMENTED
Case CONNECTED
RaiseEvent OnConnectionEvent(Me, _
New ConnectionEventArgs(True, code, data))
Case AUTHENTICATED
RaiseEvent OnAuthentication(Me, _
New AuthenticationEventArgs(True, code, data))
Case NEED_PASSWORD

Case AUTHENTICATION_FAILED
RaiseEvent OnAuthentication(Me, _
New AuthenticationEventArgs(False, code, data))
End Select

End Sub


خوب توجه بفرمایید که ما یک کلاس خاص را در دات نت استفاده فرمودیم (البته با توفیقات امام زمان)
در اینجا داریم



Imports System
Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Text.ASCIIEncoding
Imports System.Net.Sockets
Imports System.Configuration
Imports System.Resources


Public Class FtpClient

Public Shared ReadOnly SENDING_DATA_PORT_20 As Integer = 150
Public Shared ReadOnly COMMAND_NOT_IMPLEMENTED As Integer = 202
Public Shared ReadOnly CONNECTED As Integer = 220
Public Shared ReadOnly AUTHENTICATED As Integer = 230
Public Shared ReadOnly NEED_PASSWORD As Integer = 331
Public Shared ReadOnly AUTHENTICATION_FAILED As Integer = 530


Private FRemoteHost As String = "127.0.0.1"
Private FRemotePath As String = "."
Private FRemoteUser As String = "anonymous"
Private FRemotePassword As String = "anonymous@nowhere.com"
Private FRemotePort As Integer = 21
Private clientSocket As Socket = Nothing
Private response As String

Public Event OnAuthentication As AuthenticationEvent
Public Event OnConnectionEvent As ConnectionEvent
Public Event OnRawDataReceivedEvent As RawDataReceivedEvent
Public Event OnTcpEvent As TcpEvent

Public Sub New()
End Sub

Public Sub New(ByVal remoteHost As String, _
ByVal remotePath As String, _
ByVal remoteUser As String, ByVal remotePassword As String, _
ByVal remotePort As Integer)
FRemoteHost = remoteHost
FRemotePath = remotePath
FRemoteUser = remoteUser
FRemotePassword = remotePassword
FRemotePort = remotePort
End Sub


Public Sub Connect()
clientSocket = New Socket(AddressFamily.InterNetwork, _
SocketType.Stream, ProtocolType.Tcp)
Dim endpoint As IPEndPoint = _
New IPEndPoint(Dns.Resolve(FRemoteHost).AddressList(0) , _
FRemotePort)

Try
clientSocket.Connect(endpoint)
Catch ex As Exception
Throw New IOException("Connect failed", ex)
End Try

ReadResponse()
End Sub

Public Sub Disconnect()
If (clientSocket Is Nothing = False) Then
clientSocket.Disconnect(True)
RaiseEvent OnConnectionEvent(Me, _
New ConnectionEventArgs(False))
End If
End Sub

Private Sub ReadResponse()
Dim reply As String = ReadLine()
'Figure out the response and raise that event
BroadcastResponse(reply)
End Sub

Private Function ReadLine() As String
Return ReadLine(False)
End Function

Private Function ReadLine(ByVal clearResponse As Boolean) _
As String
Const EndLine As Char = "\n"
Const BUFFER_SIZE As Integer = 512

Dim data As String = ""
Dim buffer(BUFFER_SIZE) As Byte
Dim bytesRead As Integer = 0

If (clearResponse = True) Then response = String.Empty

While (True)
Array.Clear(buffer, 0, BUFFER_SIZE)
bytesRead = clientSocket.Receive(buffer, buffer.Length, 0)
data += ASCII.GetString(buffer, 0, bytesRead)

If (bytesRead < buffer.Length) Then Exit While
End While

Dim parts() As String = data.Split(EndLine)

If (parts.Length > 2) Then
response = parts(parts.Length - 2)
Else
response = parts(0)
End If

If (response.Substring(3, 1).Equals(" ") = False) Then
Return ReadLine(False)
End If

Return response

End Function

Private Sub BroadcastResponse(ByVal reply As String)

' Permit handling as raw data
RaiseEvent OnRawDataReceivedEvent(Me, _
New RawDataReceivedEventArgs(reply))

Dim code As Integer = Int32.Parse(reply.Substring(0, 3))
Dim data As String = reply.Substring(4)

' Permit special handling as code and data
RaiseEvent OnTcpEvent(Me, New TcpEventArgs(code, data))


' Specific handling based on code
Select Case code
Case SENDING_DATA_PORT_20
Case COMMAND_NOT_IMPLEMENTED
Case CONNECTED
RaiseEvent OnConnectionEvent(Me, _
New ConnectionEventArgs(True, code, data))
Case AUTHENTICATED
RaiseEvent OnAuthentication(Me, New _
AuthenticationEventArgs(True, code, data))
Case NEED_PASSWORD

Case AUTHENTICATION_FAILED
RaiseEvent OnAuthentication(Me, _
New AuthenticationEventArgs(False, code, data))
End Select

End Sub

Public Sub Login()
SendCommand("USER " + FRemoteUser)
SendCommand("PASS " + FRemotePassword)
End Sub

Public Sub Login(ByVal user As String, ByVal password As String)
FRemotePassword = password
FRemoteUser = user
Login()
End Sub


Private Sub SendCommand(ByVal command As String)
command += Environment.NewLine
Dim commandBytes() As Byte = ASCII.GetBytes(command)
clientSocket.Send(commandBytes, commandBytes.Length, 0)
ReadResponse()
End Sub

End Class


Public Class TcpEventArgs
Private FCode As Integer
Private FData As String

Public Sub New(ByVal code As Integer, ByVal data As String)
FCode = code
FData = data
End Sub

Public ReadOnly Property Code() As Integer
Get
Return FCode
End Get
End Property

Public ReadOnly Property Data() As String
Get
Return FData
End Get
End Property
End Class

Public Class ConnectionEventArgs
Inherits TcpEventArgs

Private FConnected As Boolean = False

Public Sub New(ByVal connected As Boolean)
MyBase.New(-1, "")
FConnected = connected
End Sub

Public Sub New(ByVal connected As Boolean, _
ByVal code As Integer, ByVal data As String)
MyBase.New(code, data)
FConnected = connected
End Sub

Public ReadOnly Property Connected() As Boolean
Get
Return FConnected
End Get
End Property
End Class

Public Class AuthenticationEventArgs
Inherits TcpEventArgs

Private FAuthenticated As Boolean = False

Public Sub New(ByVal authenticated As Boolean)
MyBase.New(-1, "")
FAuthenticated = authenticated
End Sub

Public Sub New(ByVal authenticated As Boolean, _
ByVal code As Integer, ByVal data As String)
MyBase.New(code, data)
FAuthenticated = authenticated
End Sub

Public ReadOnly Property Authenticated() As Boolean
Get
Return FAuthenticated
End Get
End Property
End Class

Public Class RawDataReceivedEventArgs
Inherits TcpEventArgs

Private FRawData As String
Public Sub New(ByVal rawData As String)
MyBase.New(-1, "")
FRawData = rawData
End Sub

Public Sub New(ByVal rawData As String, _
ByVal code As Integer, ByVal data As String)
MyBase.New(code, data)
FRawData = rawData
End Sub

Public ReadOnly Property RawData() As String
Get
Return FRawData
End Get
End Property
End Class

Public Delegate Sub AuthenticationEvent(ByVal sender As Object, _
ByVal e As AuthenticationEventArgs)
Public Delegate Sub ConnectionEvent(ByVal sender As Object, _
ByVal e As ConnectionEventArgs)
Public Delegate Sub RawDataReceivedEvent(ByVal sender As Object, _
ByVal e As RawDataReceivedEventArgs)
Public Delegate Sub TcpEvent(ByVal sender As Object, _
ByVal e As TcpEventArgs)


توجه کنید که delegate کلاس خاصی در دات نت است

و یک برنامه برای اینکه کار میکند یا نه


Imports Ftp

Module Module1

Sub Main()
Dim client As FtpClient = New FtpClient()
AddHandler client.OnConnectionEvent, _
AddressOf OnConnection
AddHandler client.onRawDataReceivedEvent, _
AddressOf OnRawDataReceived
AddHandler client.OnAuthentication, _
AddressOf OnAuthenticated

client.Connect()
client.Login()

Console.WriteLine("press enter to exit")
Console.ReadLine()
client.Disconnect()
End Sub

Public Sub OnConnection(ByVal sender As Object, _
ByVal e As ConnectionEventArgs)
Console.WriteLine("Connected: " & e.Connected.ToString)
End Sub

Public Sub OnRawDataReceived(ByVal sender As Object, _
ByVal e As RawDataReceivedEventArgs)
Console.WriteLine("Received: " & e.RawData)
End Sub

Public Sub OnAuthenticated(ByVal sender As Object, _
ByVal e As AuthenticationEventArgs)
Console.WriteLine("Logged in: " + e.Authenticated.ToString())
End Sub


End Module



به کلاس توجه کنید که ما از اول کلاس گذاشتیم

titbasoft
پنج شنبه 29 بهمن 1383, 17:26 عصر
مَ.............مَ مَ مَ ....................
:strange: :strange: :strange: :strange:

اینو جدی میگم. من خیلی آدم قدی هستم :mrgreen: و کم پیش میاد این حرف رو بزنم ولی خدائییییییش کم اوردم. :wink:

آقا شرمنده کردی :cry:

titbasoft
پنج شنبه 29 بهمن 1383, 17:52 عصر
امیدوارم بعد از اینکه چیزهایی رو که این پائین نوشتم میخونی صورتت این شکلی :mad: نشه!!! :wink:
من خیلی پر رو تر از این حرفهام.
حالا می خوام بدونم که
1) دستورات Ftp همون get و put و chdir و اینها است؟
2) اگر ما بخواهیم Binary بفرستیم یا بگیریم چی؟ چون شما در readResponse از readLine استفاده کردی که داره ascii می خونه!
3) حالا فرض که binary هم خوندیم از کجا بفهیم این response ما دیتاست یا message و اگه دیتا بود چطوری save اش کنیم

یه کار راحت تر هم میشه کرد . برای اینکه از شر یک کلاس ftp خلاص بشی یک reference رو اینترنت معرفی کن که یه چند وقتی برم دنبال نخود سیا (اگر موجود داری) چون توی msdn اصلا نتونستم پیدا کنم. :cry:
یا یک تکه کد لطف کن بنویس که میره توی فولدر www و یک فایل به نام test.dat رو download می کنه! :cry:

ehsan707
پنج شنبه 29 بهمن 1383, 22:01 عصر
یاد یه خاطره مزخرف افتادم
چند وقت قبل توی پارس دیتا یه مدتی مشغول یا بهتر بگم الاف بودم اونها یک برنامه میخواستند که با هات میل و پاپ3 کار کنه بیس برنامه asp.net بود و اولش ما بهشون گفتیم بابا جان این کاری که شما میخوایید بکنید کلاسهای از پیش تعیین شده داره . از همین کلاسها استفاده کنید . اونها گفتند نه ما شرکت خیلی معتبری هستیم و همه سورسها رو داریم شما اگه بتونی که فقط هدر میل رو بگیری کارت درسته ما هم همین کار رو کردیم . بعدش گفتند بادی هم بگیر ما هم گرفتیم بعدش گفتند فیل ضمیمه رو بگیر ما هم رفتیم سراغ فرمت mime خلاصه دهنمون سرویس شد 85 درصد کار که تموم شد گفتند نمیخواهیم گفتم به جهنم پول من رو بدبد گفتند کاری که نکردی پول هم ندادند معلوم نیست توی فکر برخی ها چی میگذره ؟ خدا همه امت اسلام رو شفا عنایت کنه بخصوص اونها که شرکتشون به قول مشتریهاشون ملکی ایرلاینه

به هر حال دوست عزیز شما گفتی که قبلا با کنترل وی بی این کار کردی پس نباید مشکلی داشته باشی
ولی اگه وقت کردم در مورد سوال شما هم تحقیق میکنم البته دوستان دیگه هم هستند میتونن کمکت کنند. فعلا یه کم صبر داشته باش ان الله مع الصابرین
(اگر کامند رو فرستادین و سابی برای فرستادن باینری ندارین احتیاط واجب این است که سابی هم برای آن بگذارید )
ehsan707 ره

ehsan707
پنج شنبه 29 بهمن 1383, 22:02 عصر
باز هم اگه سوالی داری بپرس عزیزم :)

ehsan707
پنج شنبه 29 بهمن 1383, 22:02 عصر
یاد یه خاطره مزخرف افتادم
چند وقت قبل توی پارس دیتا یه مدتی مشغول یا بهتر بگم الاف بودم اونها یک برنامه میخواستند که با هات میل و پاپ3 کار کنه بیس برنامه asp.net بود و اولش ما بهشون گفتیم بابا جان این کاری که شما میخوایید بکنید کلاسهای از پیش تعیین شده داره . از همین کلاسها استفاده کنید . اونها گفتند نه ما شرکت خیلی معتبری هستیم و همه سورسها رو داریم شما اگه بتونی که فقط هدر میل رو بگیری کارت درسته ما هم همین کار رو کردیم . بعدش گفتند بادی هم بگیر ما هم گرفتیم بعدش گفتند فیل ضمیمه رو بگیر ما هم رفتیم سراغ فرمت mime خلاصه دهنمون سرویس شد 85 درصد کار که تموم شد گفتند نمیخواهیم گفتم به جهنم پول من رو بدبد گفتند کاری که نکردی پول هم ندادند معلوم نیست توی فکر برخی ها چی میگذره ؟ خدا همه امت اسلام رو شفا عنایت کنه بخصوص اونها که شرکتشون به قول مشتریهاشون ملکی ایرلاینه

به هر حال دوست عزیز شما گفتی که قبلا با کنترل وی بی این کار کردی پس نباید مشکلی داشته باشی
ولی اگه وقت کردم در مورد سوال شما هم تحقیق میکنم البته دوستان دیگه هم هستند میتونن کمکت کنند. فعلا یه کم صبر داشته باش ان الله مع الصابرین
(اگر کامند رو فرستادین و سابی برای فرستادن باینری ندارین احتیاط واجب این است که سابی هم برای آن بگذارید )
ehsan707 ره

titbasoft
جمعه 30 بهمن 1383, 11:05 صبح
بسم رب با مرامان

اولا من نمی دونم چرا این پارس وب (دیتا) :mad: یه جوری به همه حال میده. فقط اینقدر بگم که ما هم باهاش درگیری داشتیم و داریم . بماند.... :wink:

به خدا من که از اول گفتم کارم راه افتاد با همون component ای که تو component spot بود که تقریبا همون چیزی بود که من می خواستم چون socket5 رو هم ساپورت میکرد و البته شدیدا طرفدار این جمله مایکروسافتی ها هستم که میگن
buy it don't build it
یواشکی میگم با اینکه نسبت به هیچ چیز تعصبی ندارم ولی یه جورایی مایکروسافتی حساب میشیم دیگه!! :oops:

ولی گفتم حالا که عنایت جناب احسان خان (دامت و افاضاته و برکاته) شامل حال این بنده گناهکار سراپا تقصیر شده بزار از محضر استاد خوشه چینی کنیم و لا غیر

و اما مسالةٌ : من کجا گفتم عجله دارم برادر . سر فرصت هر وقت وقت کردی یه چیزی هم برای خشنودی دل رهبر برای ما بنویس. :wink:

با تشکر از جناب حجة vb و کدنویسیون احسان (دامت برکاته) :D

titbasoft
سه شنبه 02 فروردین 1384, 19:51 عصر
اینم یه مقاله توپسسس :wink: :flower:
http://support.microsoft.com/default.aspx?scid=kb;en-us;832679

titbasoft
سه شنبه 02 فروردین 1384, 20:01 عصر
اینم command های ftp برید حالشو ببرید :wink: :موفق:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceftpsv/html/ceconsupportedftpcommands.asp