ftp client编程:通过Socket代理访问外网Ftp站点,可以实现登陆、创建文夹等,但无法实现上传、下载文件(300分求解)。不满意可以解决后 可以通过Socket5代理,就行,给我发e-mail:[email protected]or [email protected]给你300分。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我发个ftp client库文件给你,去查收 singleflower(shifan)谢谢,我看了,并不能解决我所说的问题.不过谢谢你的关注. 你建立了几个socket连接??ftp下载和上传要两个连接,一个就是你登录时候用的command connection,另外一个就专门传输数据的data connection.如果没有数据连接当然就会像你说的那样了,呵呵 ^_^ 我建立了两个socket,数据Socket并没有接受到任何数据.谢谢stome1025(到处乱转的土人) 我曾经有一个类似FlashGet的软件,感觉还可以是我朋友做的一个程序。 如果用一些客户端软件可以实现上载下载的,肯定你的上载、下载部分程序有问题,偶原来用Socket做过FTP的客户端,不妨把这部分代码贴出来,帮你看看。我的mail:[email protected] public void download(string remoteFileName,string localFileName,ref string resultInfo){...TcpListener conn = new TcpListener(IPAddress.Any,Port());conn.Start();...SendLine(m_pClient,"PASV mode");reply = ReadLine(m_pClient);...SendLine(m_pClient,"RETR " + remoteFileName);reply = ReadLine(m_pClient);long startTime = DateTime.Now.Ticks;while(!conn.Pending()){System.Threading.Thread.Sleep(50);if((DateTime.Now.Ticks - startTime) / 10000 > 20000){resultInfo = "Ftp server no response";return;}}using(Socket connectedFtpServer = conn.AcceptSocket()){conn.Stop();int count = 1;while(count > 0){byte[] data = new Byte[1024];count = connectedFtpServer.Receive(data,data.Length,SocketFlags.None);output.Write(data,0,count);output.Flush(); }}} 看的有点晕,感觉不对。FTP下载应该是控制Socket向Server发送一个1、"RETR 文件名"后,服务器端会返回一个信息“150 Opening ...”2、服务器端返回"200 ....."3、送"PASV"到Server,应该返回"227 Entering Passive Mode (111,110,5,149,18,190)" 返回Server端的IP和对应的端口到这以后,开一个Socket去连这个端口,并读取数据,就是文件下载了。 详细说明:我的ftp客户端ip:192.168.0.111socket 代理IP:内部:192.168.0.112 外部:210.47.16.222Ftp服务器:218.62.16.66 端口:21m_pClient.ProxyEndPoint = new IPEndPoint(IPAddress.Parse(192.168.0.112), 1080);m_pClient.Connect("218.62.16.62", 21);{ 连接代理的Socket.send(5103 + 数组(218.62.16.66)+ 数组(21)) ipv4地址 Socket.recieve(210.47.16.222,2526)}m_pClient.send(PASV MODE)m_pClient.recieve(218.62.16.66, 5666)然后我在下载时,接上述代码:TcpListener conn = new TcpListener(IPAddress.Any,Port());………… 你要是对FTP是怎么实现搞清楚就好办了,对于上载下载Server端有两个Socket,一个控制Socket和一个数据Socket。具体我没去实现过,也只能给你提示提示,不过你其他功能都实现了,仔细一点,跟踪Server端返回的信息,结合一些FTP客户端(FlashFXP)指令执行返回的情况,应该可以实现。Good luck! now I am working for that , I can give you some hints about it, and later I am thinking pack up core file and publish to internet 你可以通过Platform Invoke的方式调用随Windows自带的WinInet API完成相应的工作。使用WinInet API方式来完成与FTP服务器的通讯,相对于使用WinSock来实现相应的功能,使用WinInet API有以下优点: WinInet API是Win32 标准应用程序接口的一部分,由系统原生提供,有较高的稳定性和高效性,并经过严格的测试,WinInet API具有一定的灵活性,可以自行设置Proxy代理服务器,并且可以自动适应防火墙后的网络环境 // 从FTP下载文件 [DllImport("wininet.dll", CharSet = CharSet.Auto)] public static extern bool FtpGetFile(IntPtr ulSession, string strRemoteFile, string strLocalFile, bool bolFailIfExist, ulong ulFlags, ulong ulInetFals, ulong ulContext); // 向FTP上传文件 [DllImport("wininet.dll", CharSet = CharSet.Auto)] public static extern bool FtpPutFile(IntPtr ulSession, string strLocalFile, string strRemoteFile, ulong ulFlags, ulong ulContext); Linq to sql 问题 一个奇怪的想法,谁来解惑呢? 如何减小文件大小? 如果一个项目中的全部方法都是static.那会怎样? 我只装了C# 2005 ,为什么新建项目里没有"安装和部署",如何加进去啊? asp.net 发布网站 希望和喜欢C#和asp.net的新人或是高手做朋友! 有没有快速做帮助文档的东东。 如何实现如WINAMP的插件技术? 用StreamReader读取文件(不到300K)的速度问题,奇慢? 关于WinForm的界面布局 DataList 问题;谢谢
谢谢,我看了,并不能解决我所说的问题.
不过谢谢你的关注.
{
...
TcpListener conn = new TcpListener(IPAddress.Any,Port());
conn.Start();
...
SendLine(m_pClient,"PASV mode");
reply = ReadLine(m_pClient);
...
SendLine(m_pClient,"RETR " + remoteFileName);
reply = ReadLine(m_pClient);
long startTime = DateTime.Now.Ticks;
while(!conn.Pending())
{
System.Threading.Thread.Sleep(50);
if((DateTime.Now.Ticks - startTime) / 10000 > 20000)
{
resultInfo = "Ftp server no response";
return;
}
}
using(Socket connectedFtpServer = conn.AcceptSocket())
{
conn.Stop();
int count = 1;
while(count > 0)
{
byte[] data = new Byte[1024];
count = connectedFtpServer.Receive(data,data.Length,SocketFlags.None);
output.Write(data,0,count);
output.Flush();
}
}
}
1、"RETR 文件名"后,服务器端会返回一个信息“150 Opening ...”
2、服务器端返回"200 ....."
3、送"PASV"到Server,应该返回"227 Entering Passive Mode (111,110,5,149,18,190)"
返回Server端的IP和对应的端口
到这以后,开一个Socket去连这个端口,并读取数据,就是文件下载了。
我的ftp客户端ip:192.168.0.111
socket 代理IP:内部:192.168.0.112
外部:210.47.16.222
Ftp服务器:218.62.16.66 端口:21m_pClient.ProxyEndPoint = new IPEndPoint(IPAddress.Parse(192.168.0.112), 1080);
m_pClient.Connect("218.62.16.62", 21);
{
连接代理的Socket.send(5103 + 数组(218.62.16.66)+ 数组(21))
ipv4地址 Socket.recieve(210.47.16.222,2526)
}
m_pClient.send(PASV MODE)
m_pClient.recieve(218.62.16.66, 5666)
然后
我在下载时,接上述代码:
TcpListener conn = new TcpListener(IPAddress.Any,Port());
…………
你可以通过Platform Invoke的方式调用随Windows自带的WinInet API完成相应的工作。使用WinInet API方式来完成与FTP服务器的通讯,相对于使用WinSock来实现相应的功能,使用WinInet API有以下优点:
WinInet API是Win32 标准应用程序接口的一部分,由系统原生提供,有较高的稳定性和高效性,并经过严格的测试,WinInet API具有一定的灵活性,可以自行设置Proxy代理服务器,并且可以自动适应防火墙后的网络环境